2

飛行機を飛ばし、円をつかんでパラシュートなどを避けるフラッシュゲームを作りました。これは、私が話していることを理解するためのゲームの画面です。

ゲームのスクリーンショット

私が抱えている問題は、空気でiPhoneに移行したいため、メモリ使用量です。メニューにいるときは問題ありませんが、アプリケーションは約 40 mb を使用します。しかし、私が遊んでいると、メモリが矢印のように上がります。Monster Debugger のグラフィックの画面を撮りました。ここにあります:

メモリ使用量のスクリーンショット

問題は、空から降る要素ごとにさまざまなクラスがあることです。パラシュート、サーファー、円のライン、そしてボーナスのために。それらはすべてかなり似ているので、これであるパラシュートクラスのみをコピーします:

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 人の子供を通過することはありません。したがって、レベルの最後にあるクラス全体を削除した場合にのみメモリが低下する理由と、使用していない子を削除するとメモリが安定せずに成長し続ける理由がわかりません。私はあなたが十分に明確であり、誰かが問題を知っていることを願っています. 前もって感謝します。

4

1 に答える 1

2

emisor Timer コールバックで何が起こっているのか正確にはわかりませんが、条件が満たされるたびに eventListener を追加しています。すべてのパラシュートに 1 つある場合は、その eventListener をどこにも削除しません。アプリ全体で ENTER_FRAME eventListener が 1 つだけ必要で、子クラスを更新するだけです。

于 2012-11-21T19:57:26.750 に答える