Memory leaks 内存泄漏与计时器。性能与延迟

Memory leaks 内存泄漏与计时器。性能与延迟,memory-leaks,coronasdk,Memory Leaks,Coronasdk,我不确定为什么下面的示例代码没有释放所有的计时器内存。它大约从133kb开始,如果你点击屏幕,它会产生10000个计时器。它们跑完后,应该清理干净。然而,在删除所有计时器后,它的大小保持在389kb左右 我错过什么了吗 local timersFired = 0 local timers = {} local maxTimers = 10000 Runtime:addEventListener("touch", function(e) if(e.phase == "began") th

我不确定为什么下面的示例代码没有释放所有的计时器内存。它大约从133kb开始,如果你点击屏幕,它会产生10000个计时器。它们跑完后,应该清理干净。然而,在删除所有计时器后,它的大小保持在389kb左右

我错过什么了吗

local timersFired = 0
local timers = {}
local maxTimers = 10000

Runtime:addEventListener("touch", function(e)
    if(e.phase == "began") then
        print("TIMERS CREATED")
        timers = {}
        for i=1,maxTimers do
            table.insert(timers, timer.performWithDelay(3000, function(e)
                timersFired = timersFired + 1
            end, 1))
        end
    end
end)

Runtime:addEventListener("enterFrame", function(e)
    if(timersFired == maxTimers) then
        print("KILLED TIMERS")
        for i=1,maxTimers do
            local aTimer = timers[i]
            timer.cancel(aTimer)
            timers[i] = nil
        end

        timers = nil
        timersFired = 0
    end

    collectgarbage("collect")
    print( "MemUsage: " .. collectgarbage("count") )
end)

也许不是您唯一的问题,但是删除计时器的for循环只会删除其中的一半

循环从
1运行到#计时器
。第一次通过时,
i
为1,它将删除第一个计时器。第二次通过时,
i
增加到2,但数组中的元素同时下移,因此代码跳过计时器2,继续删除原来的计时器3。等等

最终的结果是,您只从计时器数组中的奇数位置删除计时器,使其中一半仍然占用内存

while(#timers>0)do
循环工作得更好,或者
for i=#timers,1,-1 do
循环每次都删除最后一个计时器


您可以通过仅创建10个计时器来验证这是否是问题的一部分。打印“已创建”作为每个已创建的文件,打印“已删除”作为每个已销毁的文件。您应该看到10次创建和10次删除。(我想你只会看到5次删除。)

我读了很多遍,我只能得出结论,Corona SDK是泄漏的那个:/不幸的是,这不是问题所在。timers[i]=nil不会向下移动其他元素,table.remove会这样做。我验证了打印10条已创建语句和10条已删除语句以进行双重检查。