Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 科罗纳:记忆问题?_Memory_Lua_Memory Leaks_Coronasdk - Fatal编程技术网

Memory 科罗纳:记忆问题?

Memory 科罗纳:记忆问题?,memory,lua,memory-leaks,coronasdk,Memory,Lua,Memory Leaks,Coronasdk,其实我这里没有什么问题,希望有人能帮我 1) 两者的区别是什么 print(collectgarbage("count")) 及 2) 我有一个游戏,当你完成它后,它会跳回第一页,你可以再玩一次,我尝试输出TextureMemory,因为它不会显示内存泄漏,但每次玩游戏时,游戏会变得更滞后,除了内存泄漏,还有其他原因会使它滞后吗 3) 移除对象的正确方法是什么?我想做的是: object:removeSelf() object = nil 但是,如果我使用collectgarbage(“co

其实我这里没有什么问题,希望有人能帮我

1) 两者的区别是什么

print(collectgarbage("count"))

2) 我有一个游戏,当你完成它后,它会跳回第一页,你可以再玩一次,我尝试输出TextureMemory,因为它不会显示内存泄漏,但每次玩游戏时,游戏会变得更滞后,除了内存泄漏,还有其他原因会使它滞后吗

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")  )

在每一行中,我发现删除电影剪辑部分会释放内存,我认为这不是删除它的正确方法?

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

  • 收集垃圾(“计数”)返回Lua VM分配的内存量。
    system.getInfo(“textureMemoryUse”)
    返回分配的纹理内存量

  • 任意数量的原因,包括代码中的
    睡眠(回放次数)
    。-)

  • 要从内存中完全删除对象,请在删除对象后运行几次
    collectgarbage(“collect”)
    (在某些情况下,一次可能不够)

    也就是说,通常最好在每个帧上运行
    collectgarbage(“步骤”)
    。(您可能需要调整GC步骤并暂停。)

  • 1) 正如Alexander解释的,collectgarbage(“count”)是Lua虚拟机使用的内存,而system.getInfo(“textureMemoryUse”)是使用的纹理内存。换句话说,前者是指Corona使用了多少主内存,而后者是指Corona在GPU上使用了多少内存

    2) 很多事情都会导致滞后;我们需要知道的不仅仅是问题的一般描述。也就是说,根据您描述的症状,内存泄漏是我首先要寻找的

    3) 这是正确的方法。请注意,该命令返回的数字可能会有波动,内存使用量在开始时会不断增加,直到垃圾收集器最终赶上,内存使用量下降,这是正常的。您与其说想在一行之后检查内存使用情况,不如说在程序运行时随时间观察内存使用情况

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

    顺便说一句,在Corona论坛上,我发布了一篇关于移除对象工作原理的非常透彻的解释:
    有点晚了,但你永远不知道:

    您忘记将对displayGroup的引用设置为零。 顺便说一句,如果你销毁了一个组,并且没有对子组的引用,你就不必明确地销毁子组


    未正确清洁显示对象会使corona变慢,这很可能是延迟的原因。

    现在,我认为可能不是内存问题造成延迟,因为内存泄漏现在非常少,在10次重放后,内存使用从190增加到210。无论如何,我能知道这些:本地HealSqk=要求(“HealSeple”)HealSeal.In()HealStime= nILL考虑是否正确删除?(包括里面的所有变量?)
        collectgarbage("collect")
    print( "collectgarbage is " .. collectgarbage("count")  )