Memory leaks 内存泄漏与计时器。性能与延迟
我不确定为什么下面的示例代码没有释放所有的计时器内存。它大约从133kb开始,如果你点击屏幕,它会产生10000个计时器。它们跑完后,应该清理干净。然而,在删除所有计时器后,它的大小保持在389kb左右 我错过什么了吗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
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条已删除语句以进行双重检查。