memory-leaks - Corona SDK/Lua/内存泄漏

标签 memory-leaks lua crash coronasdk 2d-games

因此,我为正在开发的游戏使用了这个雨模块,这会导致大量系统内存泄漏,从而导致滞后并最终导致应用程序崩溃。
函数“t.start”每 50 毫秒用一个定时器调用一次。

虽然我试过了,但我真的找不到原因!也许我忽略了一些东西,但我无能为力。如您所见,我排除了与本地人相关的图形……有人注意到什么吗?

作为次要问题:有没有人有关于预加载下一个场景以实现平滑场景更改的提示?因为当我把它放在“场景:show()”中时,加载本身会导致短暂的卡住......

谢谢你的帮助!
问候,尼尔斯

local t = {}
    local composer = require("composer")
    t.drops = {}

    function t.fall(drops, group)
        for i = 1, #drops, 1 do
            local thisDrop = drops[i]
            function thisDrop:enterFrame()
                if aboutToBeDestroyed == true then
                    Runtime:removeEventListener("enterFrame", self)
                    return true
                end
                local randomY = math.random(32, 64)
                if self.x ~= nil then
                    self:translate(0, randomY)
                    if self.y > 2000 then
                        self:removeSelf()
                        Runtime:removeEventListener("enterFrame", self)
                        self = nil
                    end
                end
            end
            Runtime:addEventListener("enterFrame", drops[i])
            thisDrop = nil
        end
    end

    t.clean = function()
        for i = 1, #t.drops, 1 do
            if t.drops[i] ~= nil then
                table.remove(t.drops, i)
                t.drops[i] = nil
            end
        end
    end

    function t.start(group)
        local drops = {}
        local theGroup = group
        for i = 1, 20, 1 do
            local randomWidth = math.random(5, 30)
            local dropV = display.newRect(group, 1, 1, randomWidth, 30)
            local drop1 = display.newSnapshot(dropV.contentWidth , dropV.contentHeight * 3)
            drop1.canvas:insert(dropV)
            drop1.fill.effect = "filter.blurVertical"
            drop1.fill.effect.blurSize = 30
            drop1.fill.effect.sigma = 140
            drop1:invalidate("canvas")
            drop1:scale(0.75, 90)
            drop1:invalidate("canvas")
            drop1:scale(1, 1 / 60)
            drop1:invalidate("canvas")
            local drop = display.newSnapshot(drop1.contentWidth * 1.5, drop1.contentHeight)
            drop.canvas:insert(drop1)
            drop.fill.effect = "filter.blurHorizontal"
            drop.fill.effect.blurSize = 10
            drop:invalidate("canvas")
            drop.alpha = 0.375
            local randomY = math.random(-500, 500)
            drop.y = randomY
            drop.anchorY = 0
            drop.x = (i - 1) * 54
            drops[i] = drop
            table.insert(t.drops, drop)
            local dropV, drop1, drop = nil
        end
        composer.setVariable("drops", t.drops)
        t.fall(drops, group)
        drops = nil
        t.clean()
    end
return t

编辑:我发现它肯定与嵌套快照有关,这些快照是为了应用滤镜效果而创建的。我删除了一个快照,因此我在快照中只有一个矢量对象,瞧:内存增加得更慢。问题是:为什么?

最佳答案

通常,您根本不需要 enterFrame 事件 - 您可以简单地从起点 (math.random(-500, 500)) 过渡到终点(代码中的 2000)。只是随机化速度并使用 onComplete 处理程序来删除对象

local targetY = 2000
local speedPerMs = math.random(32, 64) * 60 / 1000
local timeToTravel = (targetY - randomY) / speedPerMs
transition.to( drop, {
time = timeToTravel,
    x = xx,
    y = targetY,
    onComplete = function()
        drop:removeSelf()
    end
} )

编辑 1:我发现你的代码删除 drop 是不够的。这对我有用:
drop:removeSelf()
dropV:removeSelf()
drop1:removeSelf()

关于内存消耗的一些想法:

1) 可能您可以使用 1 个 enterFrame 处理程序来处理 drop 数组 - 这将减少内存消耗。也不要向本地对象添加方法,例如“function thisDrop:enterFrame()”——这在这里不是最优的,因为你每 50 毫秒创建 20 个新函数

2) 您的代码每秒创建 400 个“丢弃”对象,它们的生存时间通常不超过 ~78 帧(在 60fps 环境中意味着 1.3 秒)。更好地使用对象池并重用现有对象

3) enterFrame 功能取决于设备当前的 fps,因此低 fps 下雨会变慢。低 fps -> 物体下降速度较慢 -> 场景中有更多物体 -> fps 下降。我建议你计算 2 次 enterFrame 调用之间的 deltaTime 并根据 deltaTime 调整下降速度

编辑 2 似乎快照的 :removeSelf() 没有删除子对象。我修改了你的代码,内存消耗下降了很多
if self.y > 2000 then
    local drop1 = self.group[1]
    local dropV = drop1.group[1]
    dropV:removeSelf()
    drop1:removeSelf()
    self:removeSelf()
    Runtime:removeEventListener("enterFrame", self)
    self = nil
end

关于memory-leaks - Corona SDK/Lua/内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42854014/

相关文章:

c - 为什么在 pthread_create 后未分离线程时未加入的 pthread 会泄漏资源

Lua如何在小写字母和大写字母之间添加空格

android - Android-Bing Maps API演示在执行时崩溃

当用户按下 ios13 时,iOS 应用程序崩溃

ios - 在 iPhone X 上应用程序崩溃,原因为 'NSUnknownKeyException' 、原因 : '[<UIStatusBar_Modern

Android GLSurfaceView 导致泄漏?

java - 如果Java程序中存在内存泄漏,它会在任务栏中显示高内存使用率吗?

C++ 虚拟析构函数和内存泄漏

lua 测试并分配内部循环控制

lua - 无法确定此文件的Lua格式