0

在尝试优化我的游戏后,我从明显的对象池开始。我使用 max_growth 等跟随更复杂的一个,然后继续一个简单的,但我一直遇到同样的问题。现在经过 40 多个小时的在线搜索并向一位比我了解更多关于 flash 的朋友寻求帮助后,我已经放弃并决定来这里。下面的代码包括一些 # 仅供参考,我已经在我的评论中留下了我尝试过但也没有奏效的东西。

我的 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 时,除非我删除一些评论。当我在 dispose condor 中删除 //tr 然后它适用于前 2 个 condor,计数器变为 9,然后是 9,然后是 10 并保持在 10,问题是它不再在屏幕上显示,没有错误但它停止工作。顺便说一句,我也尝试过跟踪(pool.length),但我一直在下降 10 秒。

我也试过 #1 和 2 没有效果。我最接近的是#10,池中的 unshift 语句。这实际上看起来很有效,计数器下降到 9,当它们离开屏幕时又回到 10,就像将它们放回池中一样,但是当 10 过去时,它们就完全停止了,甚至绕过了新的 condor 语句。正如您从评论中看到的那样,我真的已经尝试了所有我能想到的东西,甚至从更高级的池化到这个简化版本,但仍然一无所获。现在超过 40 小时,熬夜到凌晨 4 点,因为我对无法解决这个问题感到非常沮丧,我什至还没有完成位图缓存。有人可以帮忙吗?

4

1 回答 1

0

如果您需要在遍历数组时更改数组,请执行向后遍历。

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

这消除了空指针问题、丢失元素(如果您也遇到这种情况)和临时数组的需要。

于 2013-03-01T12:42:51.703 回答