日冕:记忆问题?

时间:2011-08-23 10:26:10

标签: memory lua memory-leaks corona

实际上我在这里几乎没有问题,希望有人可以帮助我。

1)

之间有什么不同
print(collectgarbage("count"))

print(system.getInfo( "textureMemoryUse" ))
2)我有一个游戏,你完成它之后,它会跳回到第一页,你可以再次播放它,我试着把纹理记忆使用它没有显示我的内存泄漏,但游戏成为每次我玩它都会更加滞后,除了内存泄漏之外还有其他任何原因会让它滞后吗?

3)删除对象的正确方法是什么?我尝试做的是:

object:removeSelf()
object = nil

但如果我使用collectgarbage(“count”)放弃它,它在使用之前和之后都没有显示任何不同。

每次玩游戏都比较困难我已经忍受了2天,真的找不到我的代码有什么问题,希望能在这里得到一些帮助。


这是关于删除所有内存的代码

--remove all the transition that store in a table
local k, v
for k,v in pairs(transitionTable) do
    --print(k)
    timer.cancel( v )
    v = nil; k = nil 
end

transitionTable = nil
transitionTable = {}

-- remove movie clip
playButtonAnim:removeSelf()
playButtonAnim = nil

-- remove displayGroup and it's child
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("child on display group : "..displayGroup.numChildren)
        displayGroup:remove(1)
    end
    displayGroup:removeSelf()
end

我试着:

    collectgarbage("collect")
print( "collectgarbage is " .. collectgarbage("count")  )

在每一行上发现删除影片剪辑部分din释放任何内存,我认为这不是一种正确的删除方法吗?

4 个答案:

答案 0 :(得分:1)

  1. collectgarbage("count")返回由Lua VM分配的内存量。 system.getInfo("textureMemoryUse")返回分配的纹理内存量。

  2. 许多原因,包括代码中的sleep(number_of_replays)。 ; - )

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

    话虽这么说,通常在每一帧上运行collectgarbage("step")要好得多。 (您可能希望调整GC步骤并暂停。)

答案 1 :(得分:0)

要使用collectgarbage查看内存使用情况的变化,您需要在调用collectgarbage("collect")之前运行collectgarbage("count")

答案 2 :(得分:0)

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

答案 3 :(得分:0)

有点晚但你永远不知道:

您忘记将displayGroup的引用设置为nil。 顺便说一句,如果你摧毁一个团体并且没有提及孩子,你就不必明确地摧毁孩子。

没有正确清洁显示对象会使电晕变慢,这很可能是造成滞后的原因。