0

ゲームの最適化を試みた後、明らかなオブジェクト プールから始めました。max_growth などを使用してより複雑なものをたどり、単純なものに進みましたが、同じ問題にぶつかり続けています。40 時間以上オンラインで検索し、フラッシュについて私よりもよく知っている友人に助けを求めた後、あきらめてここに来ることにしました。以下のコードには、参照用にいくつかの # が含まれており、コメントしたものを残しましたが、試しても機能しませんでした。

私のCpoolクラス

package  {
    import flash.display.DisplayObject;

    public class CPool 
    {
        public var counter:int;
        private var pool:Array;

        //public function CPool(type:class, len:int)
        public function CPool()
        {
            pool = new Array();
            counter = 10;
            //counter=len;

            //var i:int=len;
            var i:int = 10;
            while (--i > -1)
                //pool[i] = new type();
                pool[i] = new Condor();
        };

        public function getCondor():Condor
        {
            trace(counter);
            //trace (pool.length);
            if (counter > 0)
            {
                return pool[--counter];
             }
             else
             {
                 var cde = new Condor();
                 return cde;
              }
        };


        public function disposeCondor(disposedCondor:Condor):void {

            pool[counter++] = disposedCondor;
    //pool.unshift(disposedCondor);     #10
         };
    }
}

get と dispose を使用するだけの単純なものであることがわかります。プールを参照する以下のロジック クラスのコード。

public var cpool:CPool;

cpool = new CPool();   //(in the constructor)

else if (whichBird ==12)
{
    bird = cpool.getCondor() as Condor;
}  //  (in the addBird section)


private function checkBirdsOnScreen():void 
{
    for (var i:int = 0; i < birdArray.length; i++)
    {
        var dg = birdArray[i];
        if (birdArray[i].x < -100 )
        {
            dg.parent.removeChild(dg);
            birdArray.splice(i, 1);
            //hc.destroyCondor();                #9
            //tr cpool.disposeCondor(dg);        #1
            //birdArray[i].destroyCondor();     #2
        }
    }
}

そして最後に、コンドル クラスの鳥を破壊する関数

public function destroyCondor():void
{
    //removeChild(oldCondor);  #5           
    //ConPool.disposeCondor(oldCondor); #4
    //this.x=390 #3
//ConPool.disposeCondor(this);
    parent.removeChild(this); //remove object from stage
    removeEventListener(Event.ENTER_FRAME, CondorLoop); 
}   

ご覧のとおり、これを機能させるために考えられるあらゆる方法を試しました。現状のコードは、プール内の 10 匹のコンドルから始まり、画面から消えるとプールを離れ、プール内のトレース カウンターはプールがダウンしていることを示し、0 になると新しいコンドルが作成されます。これは、コメントを取り除かない限り、この方法で、または destroyCondor を使用すると機能します。コンドルの処分で//trを削除すると、最初の2つのコンドルで機能し、カウンターが9になり、9になり、10になり、10のままになります。問題は、画面にそれ以上表示されなくなり、エラーは発生しませんが、動作を停止します。ところで、私もトレース (pool.length) を試しましたが、ずっと 10 秒になっています。

私も#1と2を試しましたが、効果はありませんでした。最も近いのは #10 で、プール内の unshift ステートメントです。これは実際には機能しているように見えます。カウンターは 9 に下がり、プールに戻されるように画面から消えると 10 に戻りますが、10 を超えると完全に来なくなり、新しいコンドル ステートメントをバイパスします。コメントからわかるように、考えられることはすべて実際に試しましたが、より高度なプーリングからこの単純化されたバージョンに移行しても、まだどこにも行きません。現在 40 時間以上、この問題を解決できず、ビットマップ キャッシュをまだ実行していないことに非常に不満を感じているため、午前 4 時まで起きていました。誰でも助けてもらえますか?

4

1 に答える 1

0

トラバース中に配列を変更する必要がある場合は、後方トラバースを実行します。

for (var i:int=birdArray.length-1;i>=0;i--) {...}

これにより、null ポインターの問題、要素の欠落 (これも発生した場合)、および一時配列の必要性が解消されます。

于 2013-03-01T12:42:51.703 に答える