Lua 垃圾回收和 C 用户数据。

在我的游戏引擎中,我使用userdata将我的向量(Vector)和颜色(Color)对象暴露给Lua。

现在,每当在Lua脚本内部创建一个偶数个本地向量和颜色时,Luas的内存使用量就会略微增加,直到垃圾回收器运行后才会下降。

垃圾回收器会导致游戏出现小的停顿。

如果向量和颜色对象仅用作参数,它们不应该立即删除吗?例如:myObject:SetPosition( Vector( 123,456 ) )

现在它们没有被删除 - Lua的内存使用量每秒提高1.5 MB,然后出现卡顿,然后回到大约50KB。

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

原文链接 https://stackoverflow.com/questions/4945254

点赞
stackoverflow用户596285
stackoverflow用户596285

你可以在函数结束后运行 lua_setgcthreshold(L,0) 来强制立即进行垃圾回收。

编辑:对于5.1版,我看到以下内容:

int lua_gc (lua_State *L, int what, int data);

控制垃圾回收器。

根据参数 what 的值,此函数执行几项任务:

    * LUA_GCSTOP:停止垃圾回收器。
    * LUA_GCRESTART:重新启动垃圾回收器。
    * LUA_GCCOLLECT:执行完整的垃圾收集周期。
    * LUA_GCCOUNT:返回Lua使用的当前内存量(以Kbytes为单位)。
    * LUA_GCCOUNTB:返回Lua使用的当前内存字节数除以1024的余数。
    * LUA_GCSTEP:执行垃圾回收的增量步骤。步骤“大小”由数据(较大的值表示更多的步骤)以非指定方式控制。如果要控制步长,则必须试验性地调整数据的值。如果步骤完成了垃圾回收周期,则函数返回1。
    * LUA_GCSETPAUSE:将数据设置为收集器暂停的新值(参见§2.10)。函数返回暂停的前一个值。
    * LUA_GCSETSTEPMUL:将数据设置为收集器步长的新值(参见§2.10)。函数返回步幅乘数的前一个值。
2011-02-09 13:41:49
stackoverflow用户221509
stackoverflow用户221509

在Lua中,像userdata这样的对象被删除的唯一方式是通过垃圾回收器。您可以直接调用垃圾回收器,就像B Mitch编写的那样(使用lua_gc(L,LUA_CGSTEP,...)),但是不能保证您的临时对象会被释放。

解决此问题的最佳方法是避免创建临时对象。如果您需要将固定参数传递给SetPosition之类的方法,请尝试修改API,以便它也接受数字参数,避免创建临时对象,如下所示:

myObject:SetPosition(123, 456)
2011-02-09 15:43:37
stackoverflow用户513763
stackoverflow用户513763

Lua Gems有一篇关于Lua程序优化的不错文章。

2011-02-09 16:03:30
stackoverflow用户298661
stackoverflow用户298661

请记住,Lua 不知道是否保存了这些对象,直到运行时-例如,您可能将它们放在注册表中的表格中。您甚至不应该注意到收集 1.5MB 的影响,这里还有另一个问题。

此外,您真的在浪费大量空间用于创建新对象。请记住,在 Lua 中,每个对象都必须是动态分配的,因此您调用了 malloc 来创建一个 Vector 对象来保存两个数字?编写函数以采用一对数值参数作为重载。

2011-02-09 16:09:11