Lua与C++性能问题/卡顿现象

6
我正在开发一个游戏,其中核心使用(SFML) C++,演员脚本使用Lua。然而,我遇到了一些性能问题,不确定出了什么问题。我创建了一个测试程序来展示我遇到的问题。
基本上,有时当我从C++调用Lua函数时,它需要比平常更长的时间才能返回。我需要我的游戏以60fps运行,大多数情况下它能做到,但有时一个或多个函数调用将比平常花费更长的时间。
我的第一个想法是内存管理器,但关闭它似乎并没有消除这些峰值。我知道有几款游戏使用Lua,我想这对他们来说不是问题。
人们建议使用LuaJIT可以解决这个问题,所以我下载并设置了LuaJIT(带有lua 5.1)。我得到了明显改善的平均时间,但峰值仍然像以前一样普遍存在:

enter image description here

以下是两个控制台结果示例的图库(以微秒为单位;参考帧速率为60 fps,大约为16700):

关闭垃圾回收 gc disabled 开启垃圾回收 gc enabled

C++测试程序 - http://pastebin.com/RhYnnLm3
Lua测试脚本 - http://pastebin.com/NBnAXcVD


你需要哪些硬件信息?我的处理器是英特尔酷睿i7 3.2 GHz。 - user3076190
4
你尝试过完全不调用lua吗?你确定这确实是在lua中发生的吗?如果确实是仅由lua运行导致的,那么下一步就应该运行分析器,因为这似乎是相当奇怪的行为。 - kazagistar
1
你是否观察到使用不同的计时器(例如 clock)会出现相同的尖峰模式? - Ryan Stein
1
如果不是垃圾回收的问题,可能发生的经典情况是您不断地向表中添加内容。每当它翻倍(或类似情况),就会出现重新分配的影响。 - starmole
可能是您的绑定层创建了临时对象。在调试器中直接进入该调用。您可能会发现一些意外的调用。 - Aaron Saarela
显示剩余7条评论
2个回答

1

看起来你的一些调用正在经历LUAs垃圾收集器的滚动。在游戏中,通常要非常注意GC的操作方式以及运行频率。一个简单的解决方案可能是每帧手动运行GC。我知道一些流行的游戏引擎就是这样做的。http://lua-users.org/wiki/GarbageCollectionTutorial


我已经在Pastebin上将该行注释掉了,但如果我的代码正确,我已经尝试关闭GC。 - user3076190

0

当出现这种峰值时,首先要怀疑的是垃圾收集器。最简单的“解决”方法不是禁用它,而是在可预测的时间调用它。

尝试在帧处理结束时只调用一次collectgarbage()collectgarbate('step')


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接