0

ゲームを作成していて、Adobe Scout でテストすると、この関数が原因で予算を 600% 超えていると表示されます checkMainGunMissleHitZapper();

それで、それらがそれを最適化する方法であるかどうか疑問に思っていました。ミサイルは配列であり、敵も配列によって処理されるため、これは二重の for ループです。

ヒットテストが 2 つのオブジェクト間で行われるたびに、画面が完全に一時停止し、主にモバイル デバイスでパフォーマンスが低下します。

ループの設定方法は次のとおりです。

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; }

しかし、私はそれをどこから始めるべきかさえ知りません。私のas3スキルレベルを過ぎたようなものです。

しかし、これらの for ループを最適化する方法はありますか?

4

1 に答える 1

0

警告は、内部ループ内の hitTestObject 呼び出しによるものだと思います。

if (currenMainMissle.hitTestObject(currentZapper))

hitTestObject(...) は比較的遅いプロセスであるため、多くのヒット テストをループしている場合、長い時間がかかる可能性があります。そのため、Scout からの警告が表示されます。

ループを最適化すると (コードの後に​​フォーラムで言及されている方法など)、無視できるほどの違いが生じます。ループに費やされる時間の 99% は、hitTestObject によるものです。

「トリック」は、2 つのオブジェクトの x 値と y 値が特定の範囲内にあるかどうかをチェックするなど、実行する hitTestObject 呼び出しの数を減らすことです。そうでない場合は、衝突をチェックする必要はありません。

または、衝突が発生した場合 (およびミサイルが削除された場合)、さらにチェックをループし続ける必要がないため、次の行の後に:

updateScoreText();

次の行を追加します。

break;

これにより、内側のループが終了します (そして、次の外側のループが開始されます)。

衝突検出の最適化は広大なテーマであり、多くの手法があるため、ゲームの詳細を知らずにケースの特定の解決策を提供することはできません.「アクションスクリプトの衝突検出」をグーグルで検索すると、いくつかのチュートリアルが提供されるはずです.

于 2013-04-14T22:23:09.283 に答える