Lua垃圾收集和C userdata

时间:2011-02-09 13:08:22

标签: c++ lua

在我的游戏引擎中,我使用userdata将我的Vector和Color对象暴露给Lua。

现在,对于Lua脚本中的每一个本地创建的Vector和Color,Luas内存使用量都有所上升,直到垃圾收集器运行才会下降。

垃圾收集器在我的游戏中引起了一个小的滞后。

如果仅将Vector和Color对象用作参数,是否应该立即删除它们?例如:myObject:SetPosition( Vector( 123,456 ) )

它们现在不正确 - Lua的内存使用量每秒上升到1.5 MB,然后出现滞后峰值并且回到大约50KB。

  • 如何解决这个问题,它是否可以解决?

4 个答案:

答案 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对象保存两个数字?编写函数以将一对数字参数作为重载。