在我的游戏引擎中,我使用userdata将我的Vector和Color对象暴露给Lua。
现在,对于Lua脚本中的每一个本地创建的Vector和Color,Luas内存使用量都有所上升,直到垃圾收集器运行才会下降。
垃圾收集器在我的游戏中引起了一个小的滞后。
如果仅将Vector和Color对象用作参数,是否应该立即删除它们?例如:myObject:SetPosition( Vector( 123,456 ) )
它们现在不正确 - Lua的内存使用量每秒上升到1.5 MB,然后出现滞后峰值并且回到大约50KB。
答案 0 :(得分:2)
退出函数后,您可以运行lua_setgcthreshold(L,0)
强制立即进行垃圾回收。
编辑:对于5.1我看到以下内容:
int lua_gc (lua_State *L, int what, int data);
Controls the garbage collector.
This function performs several tasks, according to the value of the parameter what:
* LUA_GCSTOP: stops the garbage collector.
* LUA_GCRESTART: restarts the garbage collector.
* LUA_GCCOLLECT: performs a full garbage-collection cycle.
* LUA_GCCOUNT: returns the current amount of memory (in Kbytes) in use by Lua.
* LUA_GCCOUNTB: returns the remainder of dividing the current amount of bytes of memory in use by Lua by 1024.
* LUA_GCSTEP: performs an incremental step of garbage collection. The step "size" is controlled by data (larger values mean more steps) in a non-specified way. If you want to control the step size you must experimentally tune the value of data. The function returns 1 if the step finished a garbage-collection cycle.
* LUA_GCSETPAUSE: sets data as the new value for the pause of the collector (see §2.10). The function returns the previous value of the pause.
* LUA_GCSETSTEPMUL: sets data as the new value for the step multiplier of the collector (see §2.10). The function returns the previous value of the step multiplier.
答案 1 :(得分:2)
在Lua中,可以删除像userdata这样的对象的唯一方法是垃圾收集器。您可以直接调用垃圾收集器,就像B Mitch写的那样(使用lua_gc(L, LUA_CGSTEP, ...)
),但不保证您的临时对象将被释放。
解决此问题的最佳方法是避免创建临时对象。如果需要将固定参数传递给SetPosition
等方法,请尝试修改API,使其也接受数字参数,避免创建临时对象,如下所示:
myObject:SetPosition(123, 456)
答案 2 :(得分:1)
Lua Gems有一个关于Lua程序优化的好文章。
答案 3 :(得分:0)
请记住,Lua直到运行时才知道您是否保存了这些对象 - 例如,您可以将它们放在注册表中的表中。您甚至不应该注意到收集1.5MB的影响,这里还有另一个问题。
此外,你真的是一个浪费,为此创造一个新的对象。请记住,在Lua中,每个对象都必须动态分配,所以你要调用malloc来...使一个Vector对象保存两个数字?编写函数以将一对数字参数作为重载。