新冠疫情:内存问题?
实际上我有几个问题,希望有人可以帮忙解答。
1)以下两种方式有什么不同?
print(collectgarbage("count"))
print(system.getInfo( "textureMemoryUse" ))
2)我的游戏在完成后会跳回到第一页,可以重新玩一次。我试图输出textureMemoryUse,它没有显示出内存泄漏,但游戏每次玩的时候都会变得更加卡顿,是否还有其他原因会导致卡顿?
3)删除对象的正确方法是什么?我的尝试:
object:removeSelf()
object = nil
但我使用collectgarbage("count")输出时没有任何区别。
游戏的卡顿已经困扰我两天了,真的找不到代码中的问题,希望在这里得到一些帮助。
这是我的清除所有内存的代码
--移除存储在表中的所有转换效果
local k, v
for k,v in pairs(transitionTable) do
--print(k)
timer.cancel( v )
v = nil; k = nil
end
transitionTable = nil
transitionTable = {}
--移除影片剪辑
playButtonAnim:removeSelf()
playButtonAnim = nil
--移除显示组及其子元素
displayGroup.x = display.contentHeight + 10
displayGroup.x = display.contentWidth + 10
if(displayGroup ~= nil and displayGroup.numChildren ~= nil) then
for i=1,displayGroup.numChildren do
print("子元素在显示组上: "..displayGroup.numChildren)
displayGroup:remove(1)
end
displayGroup:removeSelf()
end
我尝试:
collectgarbage("collect")
print( "collectgarbage is " .. collectgarbage("count") )
在每一行执行并发现删除影片剪辑部分没有释放任何内存,我认为这不是一个适当的删除方式?
原文链接 https://stackoverflow.com/questions/7159580
collectgarbage("count")
返回由 Lua VM 分配的内存量。system.getInfo("textureMemoryUse")
返回分配的纹理内存量。可能有许多原因,包括在代码中使用
sleep(number_of_replays)
。 ;-)要从内存中完全移除对象,请在删除后多次运行
collectgarbage("collect")
(在某些情况下,一次可能不够)。话虽如此,通常最好在每个帧上运行
collectgarbage("step")
。(您可能需要调整GC步骤和暂停时间。)
Alexander 解释说, collectgarbage("count") 是 Lua 虚拟机使用的内存,而 system.getInfo("textureMemoryUse") 是使用的纹理内存。换句话说,前者是 Corona 在使用多少主内存,而后者则是 Corona 在 GPU 上使用的内存。
许多事情都可能导致卡顿;我们除了常规的问题描述,还需要了解更多信息。话虽如此,根据您所描述的症状,我首先会查找内存泄漏。
这是正确的方式。请注意,该命令返回的数字可能会波动,程序一开始会持续增加内存使用量,直到垃圾收集器最终跟上并降低内存使用量。您不需要在每个单独的行后检查内存使用量,而是要在程序运行时观察内存使用情况。
为了调试,您可以将该命令放在 enterFrame 监听器中以连续观察内存使用情况,然后在完成后将该部分注释掉。
顺便说一下,在 Corona 论坛上,我发布了一个非常详细的如何删除对象的解释: http://developer.anscamobile.com/forum/2011/01/14/how-do-i-tell-if-my-game-leaking#comment-16568
有点晚了,但你永远不知道:
你忘记将 displayGroup 的引用设置为 nil。 顺便说一下,如果你销毁了一个组并且没有对子项引用,你不必显式地销毁子项。
不正确地清理显示对象会使 Corona 变慢,这很可能是你卡顿的原因。
- 如何在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 模式将字符串(嵌套数组)转换为真正的数组?
为了通过 collectgarbage 观察内存变化,你需要在调用
collectgarbage("count")
之前先运行collectgarbage("collect")
。