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

问题描述

我正在使用 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 ) 但该函数再次调用但在不到 600 毫秒内,比如说 400 毫秒,所以 display.remove( newLaser ) 转储第一个对象调用第一次点击并删除第二个或者说最新的,但是如果玩家连续点击火激光按钮,并且每次点击的差异小于600毫秒,那么什么都不会被删除请尽快帮助我。

解决方法

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

这看起来是一个微不足道的变化,但是当你这样做时

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

您正在创建一个封闭的函数。

当一个函数被写成封闭在另一个函数中时,它可以完全访问封闭函数的局部变量;此功能称为词法范围。尽管这听起来很明显,但事实并非如此。词法范围加上一流的函数是编程语言中的一个强大概念,但很少有语言支持该概念。 - Programming in Lua: 6.1 – Closures

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