新冠疫情:内存问题?

实际上我有几个问题,希望有人可以帮忙解答。

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

点赞
stackoverflow用户151501
stackoverflow用户151501

为了通过 collectgarbage 观察内存变化,你需要在调用 collectgarbage("count") 之前先运行 collectgarbage("collect")

2011-08-23 15:05:58
stackoverflow用户6236
stackoverflow用户6236
  1. collectgarbage("count") 返回由 Lua VM 分配的内存量。system.getInfo("textureMemoryUse") 返回分配的纹理内存量。

  2. 可能有许多原因,包括在代码中使用 sleep(number_of_replays)。 ;-)

  3. 要从内存中完全移除对象,请在删除后多次运行 collectgarbage("collect")(在某些情况下,一次可能不够)。

    话虽如此,通常最好在每个帧上运行 collectgarbage("step")。(您可能需要调整GC步骤和暂停时间。)

2011-08-23 20:11:04
stackoverflow用户686008
stackoverflow用户686008
  1. Alexander 解释说, collectgarbage("count") 是 Lua 虚拟机使用的内存,而 system.getInfo("textureMemoryUse") 是使用的纹理内存。换句话说,前者是 Corona 在使用多少主内存,而后者则是 Corona 在 GPU 上使用的内存。

  2. 许多事情都可能导致卡顿;我们除了常规的问题描述,还需要了解更多信息。话虽如此,根据您所描述的症状,我首先会查找内存泄漏。

  3. 这是正确的方式。请注意,该命令返回的数字可能会波动,程序一开始会持续增加内存使用量,直到垃圾收集器最终跟上并降低内存使用量。您不需要在每个单独的行后检查内存使用量,而是要在程序运行时观察内存使用情况。

为了调试,您可以将该命令放在 enterFrame 监听器中以连续观察内存使用情况,然后在完成后将该部分注释掉。

顺便说一下,在 Corona 论坛上,我发布了一个非常详细的如何删除对象的解释: http://developer.anscamobile.com/forum/2011/01/14/how-do-i-tell-if-my-game-leaking#comment-16568

2011-08-24 01:52:25
stackoverflow用户2656328
stackoverflow用户2656328

有点晚了,但你永远不知道:

你忘记将 displayGroup 的引用设置为 nil。 顺便说一下,如果你销毁了一个组并且没有对子项引用,你不必显式地销毁子项。

不正确地清理显示对象会使 Corona 变慢,这很可能是你卡顿的原因。

2013-08-08 15:07:11