优化双循环

时间:2013-04-14 21:59:13

标签: actionscript-3 for-loop foreach

嘿伙计们,所以我正在创建一个游戏,当我在Adobe Scout中测试时,声明这个函数导致它超过预算600%checkMainGunMissleHitZapper();

所以我想知道他们是否是一种优化它的方法。它是一个双循环,因为导弹是一个数组,敌人也是由数组处理。

每当两个对象之间发生一次测试时,屏幕就会完全暂停,并且主要在移动设备上降低性能。

以下是我设置循环的方法:

private function checkMainGunMissleHitZapper():void 
    {
        //loop through al current missles
        for (var i:int = 0; i < aMainGunMissleArray.length; i++)
        {
            //get current missle in loop
            var currenMainMissle:mcMainGunMissle = aMainGunMissleArray[i];

            //loop through all our enemies
            for (var j:int = 0; j < aEnemyZapperArray.length; j++)
            {
                //get current enemy in j loop
                var currentZapper:mcEnemyZapper = aEnemyZapperArray[j];

                //test if current missle is hitting current enemy
                if (currenMainMissle.hitTestObject(currentZapper))
                {
                    //create an explosion

                    //create a new explosion instance/movieclip
                    var newZapperExplosion:mcEnemyZapperExplosion = new mcEnemyZapperExplosion()
                    //add our explosion to the stage
                    stage.addChild(newZapperExplosion)
                    //position explosion to enemy
                    newZapperExplosion.x = currentZapper.x
                    newZapperExplosion.y = currentZapper.y


                    //remove missle
                    currenMainMissle.destroyMainGunMissle()
                    //remove missle from missle array
                    aMainGunMissleArray.splice(i, 1);

                    //remove enemy on stage
                    currentZapper.destroyEnemyZapper()
                    //remove enemy from array
                    aEnemyZapperArray.splice(j, 1);

                    nScore += 20;
                    updateScoreText();


                }

            }
        }
    }

我读过的一些论坛说这会优化代码:

for (int k = 0; k < N * N; ++k) { int i = k / N; int j = k % N; }

但我甚至不知道从哪里开始。过去我的技能水平。

但是你能看到任何方法来优化这些for循环吗?

1 个答案:

答案 0 :(得分:0)

我认为警告是由内循环中的hitTestObject调用引起的:

if (currenMainMissle.hitTestObject(currentZapper))

hitTestObject(...)是一个相对较慢的过程,因此如果您循环执行许多命中测试,可能需要很长时间 - 因此来自Scou​​t的警告。

优化循环(例如在代码之后的论坛中提到的方式)将产生可忽略的差异 - 循环中花费的时间的99%将归因于hitTestObject。

'技巧'是减少你所做的hitTestObject调用的次数 - 例如检查2个对象的x和y值是否在一定范围内 - 如果不是,则不需要检查碰撞。

或者当发生碰撞(导弹被移除)时,无需继续循环进行进一步的检查,所以在此之后:

updateScoreText();

添加以下行:

break;

这将导致内循环结束(并开始下一个外循环)

优化碰撞检测是一个广泛的主题,有很多技术,所以我不能为你的情况提供一个特定的解决方案,而不知道游戏的细节 - 谷歌搜索“动作脚本碰撞检测”应该提供一些教程。