繁体   English   中英

lua 编程中 object 的内存管理存在问题

[英]There is a problem in memory-management of object in lua programming

我正在使用 solar 2d 制作射击游戏,一切正常,但一段时间后我觉得游戏帧率正在下降,但我在任务完成时采取了删除激光的步骤

local function fireLaser()
    audio.play( fire sound )

    newLaser = display.newImageRect( mainGroup, objectSheet, 5, 14, 40 )
    physics.addBody( newLaser, "dynamic", { isSensor=true } )
    newLaser.isBullet = true
    newLaser.myName = "laser"

    newLaser.x = ship.x
    newLaser.y = ship.y
    newLaser:toBack()

    transition.to( newLaser, { y=400, time=500,
        onComplete = function()display.remove( newLaser ) end
   } )
end

我认为发生了什么, onComplete在 600 毫秒后调用display.remove( newLaser ) ,但 function 再次调用但在不到 600 毫秒内,比如 400 毫秒,所以display.remove( newLaser )转储第一个 object,第一次被点击并调用移除第二个或者说最近的一个,但是如果玩家连续点击发射激光按钮,并且每次点击的时间差小于 600 毫秒,那么什么都不会被移除。 请尽快帮助我。

如果您只在fireLaser中使用newLaser ,则应将其定义为local变量。

这似乎是一个微不足道的变化,但当你这样做时

        onComplete = function() display.remove(newLaser) end

您正在创建一个封闭的 function。

当一个 function 写在另一个 function 中时,它可以完全访问来自封闭 function 的局部变量; 这个特性称为词法作用域。 虽然这听起来很明显,但事实并非如此。 词法作用域加上一流的函数是编程语言中的一个强大概念,但很少有语言支持该概念。 -在 Lua 中编程:6.1 – 闭包

这在newLaserglobal变量时newLaser ,因为对 fireLaser 的每次调用都作用于fireLaser的同一个global变量,而不是唯一的local变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM