performance - Flash 游戏中 child 的内存问题

标签 performance actionscript-3 flash memory children

我制作了一个 Flash 游戏,在其中你驾驶飞机,你必须捕获圆圈并避开降落伞之类的东西。这是游戏的屏幕,供您了解我在说什么:

Game Screenshot

我遇到的问题是内存使用,因为我想用air将它迁移到iphone。当我在菜单中时没有问题,应用程序使用大约 40 MB。但当我演奏时,内存会像箭一样上升。我截取了 Monster Debugger 图形的屏幕。这是:

Memory Usage Screenshot

问题是我对从天上掉下来的每个元素都有不同的类。对于降落伞,对于冲浪者,对于圆圈线和奖金。它们都非常相似,所以我将只复制降落伞类,如下所示:

package  {

    import flash.display.MovieClip;
    import flash.utils.Timer;
    import flash.events.*;
    import ascb.util.NumberUtilities;
    import myGlobal;
    import flash.geom.*;
    import com.demonsters.debugger.MonsterDebugger;


    public class paracaidistasClass extends MovieClip {

        private var n:Number = 0;
        private var _rotacionDelAvion:int = 1;
        private var temporizador:Timer=new Timer(myGlobal.paracaidistasTemporizador[myGlobal.nivel - 1],0);


        public function paracaidistasClass() {
        // constructor code 
        temporizador.start();
        temporizador.addEventListener(TimerEvent.TIMER, emisor);
        addEventListener(Event.ENTER_FRAME, altura);
        }

        private function altura(e:Event):void{
        if (myGlobal.detener == false){
            this.y = this.y - myGlobal.altura;
        }
        }

        private function emisor(e:TimerEvent){
            if (myGlobal.detener == false){
                        temporizador.delay = NumberUtilities.random(myGlobal.paracaidistasMinimoDelay[myGlobal.nivel - 1], myGlobal.paracaidistasMaximoDelay[myGlobal.nivel - 1]);
                        var paracaidista = new paracaidistaClass;
                        this.addChildAt(paracaidista, 0);
                        paracaidista.y = NumberUtilities.random(-350,50);
                        myGlobal.cantidadDeParacaidistas = this.numChildren;
                        addEventListener(Event.ENTER_FRAME, movimiento);
            }
        }

        private function movimiento(event:Event):void{
if (myGlobal.detener == false){
                for (var i:Number=0; i<this.numChildren;i++){
                    getChildAt(i).x = getChildAt(i).x - (myGlobal.velocidad - (pasarAPositivo(myGlobal.rotationDelAvion) / 12));
                    getChildAt(i).x = getChildAt(i).x - 1;
                    if (getChildAt(i).localToGlobal(new Point(stage.x,0)).x < -200){
                        removeChildAt(i);
                        myGlobal.cantidadDeParacaidistas = this.numChildren;
                    }
                }
}
//delete all parachutes
        if (myGlobal.reiniciar == true){
            for (var d:Number=0; d<this.numChildren;d++){
                        removeChildAt(d);
                        myGlobal.cantidadDeParacaidistas = this.numChildren;
            }
        }
        }

        private function pasarAPositivo(value:int):int{
            var _rotacionPositiva:int;
            _rotacionPositiva = value;
            if (_rotacionPositiva < 0){
                _rotacionPositiva = _rotacionPositiva * -1;
            }
            return _rotacionPositiva;
        }

    }

}

嗯。你可以看到我删除了脱离舞台或击中的降落伞,因此内存使用量应该稳定在某个点。我也检查了,我从来没有超过降落伞的 3、4 个 child 。所以,我不明白为什么只有当您删除级别末尾的整个类(class)时,内存才会下降,以及为什么当您删除我不使用的 child 时它不稳定并不断增长。我希望你足够清楚并且有人知道问题是什么。提前致谢。

最佳答案

不确定发射器计时器回调中到底发生了什么,但每次满足条件时都会添加一个事件监听器。如果每个降落伞都有一个,那么您就不会在任何地方删除该事件监听器。整个应用程序实际上只需要一个 ENTER_FRAME 事件监听器,并且只需更新子类即可。

关于performance - Flash 游戏中 child 的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13500984/

相关文章:

actionscript-3 - 保护 Flash AS3 代码 + 与服务器的安全通信

flash - 最好的 Flash 音频/视频 + 交互服务器?

javascript - 网页图像预览器

performance - 使用 SSL 的 WCF 连接关闭速度非常慢

performance - 托管搜寻器的最佳解决方案?

actionscript-3 - AS3 中的评估公式?

Flash Actionscript 3 不接受编译时常量

iphone - 频繁重复绘制多个 View 的 CPU 占用最少的方法

python - 如何使用NumPy提高像素数学速度

actionscript-3 - 如何计算转发次数