Actionscript 3 优化双for循环

Actionscript 3 优化双for循环,actionscript-3,for-loop,foreach,Actionscript 3,For Loop,Foreach,嘿,伙计们,我正在创建一个游戏,当我在Adobe Scout中测试它时,它声明这个函数导致它超出预算600%checkMainGunMissleHitZapper() 所以我想知道他们的方法是否可以优化它。这是一个双for循环,因为导弹是一个阵列,敌人也由一个阵列来处理 无论何时在两个对象之间进行hittest,屏幕都会完全暂停并降低移动设备上的性能 下面是我如何设置循环的: private function checkMainGunMissleHitZapper():void {

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

所以我想知道他们的方法是否可以优化它。这是一个双for循环,因为导弹是一个阵列,敌人也由一个阵列来处理

无论何时在两个对象之间进行hittest,屏幕都会完全暂停并降低移动设备上的性能

下面是我如何设置循环的:

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();


                }

            }
        }
    }
private函数checkMainGunMissleHitZapper():void
{
//环通电流导弹
for(变量i:int=0;i
我读到的一些论坛说这将优化代码:

for (int k = 0; k < N * N; ++k) { int i = k / N; int j = k % N; }
(intk=0;k 但我甚至不知道从哪里开始。有点超过了我的as3技能水平


但是你能找到优化这些for循环的方法吗?

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

if (currenMainMissle.hitTestObject(currentZapper))
hitTestObject(…)是一个相对缓慢的过程,因此,如果要循环执行许多命中测试,可能需要很长时间,因此Scout会发出警告

优化循环(比如在你的代码后面的论坛中提到的方式)将产生微不足道的影响-99%的循环时间都是由于hitTestObject

“诀窍”是减少hitTestObject调用的次数,例如检查两个对象的x和y值是否在某个范围内,如果不在某个范围内,则无需检查冲突

或者当发生碰撞(导弹被移除)时,无需继续通过进一步检查循环,因此在这条线之后:

updateScoreText();
break;
添加此行:

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


优化碰撞检测是一个广泛的主题,有很多技术,因此我无法在不了解游戏细节的情况下为您的案例提供具体的解决方案-谷歌搜索“actionscript碰撞检测”应该提供一些教程。

通常,多体对多体碰撞问题可以通过将游戏区域划分为一个网格并将导弹/敌人分配到其当前网格正方形(每个正方形有2个阵列;一个用于导弹,一个用于目标)来解决。这大大减少了命中测试的数量(通常只勾选同一个框/最近的邻居)。谢谢你应该做的另一件事是尽可能使用半径检查<代码>dx*dx+dy*dy我明白了。谢谢你提供的所有信息。我在代码中添加了中断,看起来确实更快了。只有在第一次命中测试开始后,该峰值才会出现,之后的测试似乎趋于平衡。你认为我应该把它改成hitTestPoint吗?而不是hittest对象?我知道计时器事件也会显著降低它的速度,对吗?我大约有4个计时器。对于敌人和额外点数以及弹药,我无法告诉你是否使用hitTestPoint-取决于你的情况-但是正如Dave在你的问题中评论的那样,大多数游戏都不使用hitTestPoint方法,因为它们太慢了。如果你能抓住它,我强烈推荐这本书:-它有很多关于创建你自己的(有效的)碰撞检测方法的信息。哦,也不推荐使用计时器-如果可以的话,使用Event.ENTER\u FRAME。