0

我不确定为什么下面的示例代码没有释放所有计时器内存。它从大约 133kb 开始,如果您点击屏幕,它会创建 10,000 个计时器。运行后,应将其清理干净。但是,在删除所有计时器后,它会稳定在大约 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)
4

1 回答 1

0

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

循环从1 to #timers. 第一次通过,i是 1,它删除了第一个计时器。第二次,i递增到 2,但同时数组中的元素向下移动,因此代码跳过计时器 #2,并继续删除最初的计时器 #3。等等。

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

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

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

于 2012-11-21T16:54:15.613 回答