Flash游戏中的孩子的记忆问题

时间:2012-11-21 19:50:00

标签: performance actionscript-3 flash memory children

我做了一个飞行飞机的Flash游戏,你必须抓住圈子,避免降落伞和东西。这是一个游戏屏幕,供您了解我在说什么:

Game Screenshot

我遇到的问题是内存使用情况,因为我想用空气将其迁移到iphone。当我在菜单中没有问题时,aplication使用大约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个孩子。所以,我不明白为什么只有当y删除整个级别时,内存下降的整个类以及为什么它不稳定并且当y移除我不使用的孩子时不断增长。我希望你很清楚,有人知道这个问题是什么。提前谢谢。

1 个答案:

答案 0 :(得分:2)

不确定emisor Timer回调中究竟发生了什么,但每次满足条件时都要添加eventListener。如果它是每个降落伞的一个,那么你不会在任何地方删除该eventListener。你真的只需要一个ENTER_FRAME eventListener用于整个应用程序,只需更新子类。