Lua 垃圾回收和 C 用户数据。
2011-2-9 13:8:22
收藏:0
阅读:140
评论:4
在我的游戏引擎中,我使用userdata将我的向量(Vector)和颜色(Color)对象暴露给Lua。
现在,每当在Lua脚本内部创建一个偶数个本地向量和颜色时,Luas的内存使用量就会略微增加,直到垃圾回收器运行后才会下降。
垃圾回收器会导致游戏出现小的停顿。
如果向量和颜色对象仅用作参数,它们不应该立即删除吗?例如:myObject:SetPosition( Vector( 123,456 ) )
现在它们没有被删除 - Lua的内存使用量每秒提高1.5 MB,然后出现卡顿,然后回到大约50KB。
- 我该如何解决这个问题,它是否可解决?
原文链接 https://stackoverflow.com/questions/4945254
点赞
stackoverflow用户221509
在Lua中,像userdata这样的对象被删除的唯一方式是通过垃圾回收器。您可以直接调用垃圾回收器,就像B Mitch编写的那样(使用lua_gc(L,LUA_CGSTEP,...)
),但是不能保证您的临时对象会被释放。
解决此问题的最佳方法是避免创建临时对象。如果您需要将固定参数传递给SetPosition
之类的方法,请尝试修改API,以便它也接受数字参数,避免创建临时对象,如下所示:
myObject:SetPosition(123, 456)
2011-02-09 15:43:37
stackoverflow用户298661
请记住,Lua 不知道是否保存了这些对象,直到运行时-例如,您可能将它们放在注册表中的表格中。您甚至不应该注意到收集 1.5MB 的影响,这里还有另一个问题。
此外,您真的在浪费大量空间用于创建新对象。请记住,在 Lua 中,每个对象都必须是动态分配的,因此您调用了 malloc 来创建一个 Vector 对象来保存两个数字?编写函数以采用一对数值参数作为重载。
2011-02-09 16:09:11
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
你可以在函数结束后运行
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)。函数返回步幅乘数的前一个值。