2

アップデート6

フェノメナスは、可能な限りシンプルにすべてを再作成するように私に提案しました。アルゴリズムは同じままであり、パフォーマンスは問題ではないように思われたので、これが違いを生むのではないかと疑問に思いました。とにかく、それは私が得た唯一の提案だったので、ここにあります:

  1. 30 FPS: http: //www.feedpostal.com/test/simple/30/SimpleMovement.html
  2. 40 FPS: http: //www.feedpostal.com/test/simple/40/SimpleMovement.html
  3. 60 FPS: http: //www.feedpostal.com/test/simple/60/SimpleMovement.html
  4. 100 FPS: http: //www.feedpostal.com/test/simple/100/SimpleMovement.html

コード:

package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.utils.getTimer;

    [SWF(width="800", height="600", frameRate="40", backgroundColor="#000000")]

    public class SimpleMovement extends Sprite
    {
        private static const TURNING_SPEED:uint = 180;
        private static const MOVEMENT_SPEED:uint = 400;
        private static const RADIAN_DIVIDE:Number = Math.PI/180;
        private var playerObject:Sprite;
        private var shipContainer:Sprite;
        private var moving:Boolean = false;
        private var turningMode:uint = 0;
        private var movementTimestamp:Number = getTimer();
        private var turningTimestamp:Number = movementTimestamp;

        public function SimpleMovement()
        {
            //step 1: create player object
            playerObject = new Sprite();
            playerObject.graphics.lineStyle(1, 0x000000);
            playerObject.graphics.beginFill(0x6D7B8D);
            playerObject.graphics.drawRect(0, 0, 25, 50);
            //make it rotate around the center
            playerObject.x = 0 - playerObject.width / 2;
            playerObject.y = 0 - playerObject.height / 2;
            shipContainer = new Sprite();
            shipContainer.addChild(playerObject);
            shipContainer.x = 100;
            shipContainer.y = 100;
            shipContainer.rotation = 180;
            addChild(shipContainer);

            //step 2: install keyboard hook when stage is ready
            addEventListener(Event.ADDED_TO_STAGE, stageReady, false, 0, true);

            //step 3: install rendering update poll
            addEventListener(Event.ENTER_FRAME, updatePoller, false, 0, true);
        }

        private function updatePoller(event:Event):void
        {
            var newTime:Number = getTimer();

            //turning
            if (turningMode != 0)
            {

                var turningDeltaTime:Number = newTime - turningTimestamp;
                turningTimestamp = newTime;
                var rotation:Number = TURNING_SPEED * turningDeltaTime / 1000;
                if (turningMode == 1) shipContainer.rotation -= rotation;
                else shipContainer.rotation += rotation;
            }

            //movement
            if (moving)
            {
                var movementDeltaTime:Number = newTime - movementTimestamp;
                movementTimestamp = newTime;
                var distance:Number = MOVEMENT_SPEED * movementDeltaTime / 1000;
                var rAngle:Number = shipContainer.rotation * RADIAN_DIVIDE; //convert degrees to radian
                shipContainer.x += distance * Math.sin(rAngle);
                shipContainer.y -= distance * Math.cos(rAngle);
            }
        }

        private function stageReady(event:Event):void
        {
            //install keyboard hook
            stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown, false, 0, true);
            stage.addEventListener(KeyboardEvent.KEY_UP, keyUp, false, 0, true);
        }

        private final function keyDown(event:KeyboardEvent):void
        {
            if ((event.keyCode == 87) && (!moving))  //87 = W
            {
                movementTimestamp = getTimer();
                moving = true;
            }
            if ((event.keyCode == 65) && (turningMode != 1)) //65 = A
            {
                turningTimestamp = getTimer();
                turningMode = 1;
            }
            else if ((event.keyCode == 68) && (turningMode != 2)) //68 = D
            {
                turningTimestamp = getTimer();
                turningMode = 2;
            }
        }

        private final function keyUp(event:KeyboardEvent):void
        {
            if ((event.keyCode == 87) && (moving)) moving = false; //87 = W
            if (((event.keyCode == 65) || (event.keyCode == 68)) && (turningMode != 0)) turningMode = 0; //65 = A, 68 = D
        }
    }
}

結果は思った通りでした。まったく改善はありません。この問題を修正する必要があるので、誰かが別の提案をしてくれることを本当に望んでいます。また、私はかなり良いシステム(8GB RAM、Q9550 QuadCore Intel、ATI Radeon 4870 512MB)を持っているので、それが私のシステムだとは思えません。また、私がこれまでに尋ねた他のすべての人は、私のクライアントと同じ問題を抱えていました。

アップデート5:私の動きが間違いなく違うことを示すためのスムーズなフラッシュゲームの別の例!http://www.spel.nl/game/bumpercraft.htmlを参照してください

更新4:レンダリング前(EVENT.RENDER)とレンダリング直後(EVENT.ENTER_FRAME)の時間をトレースした結果、次のようになりました。

rendering took: 14 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 14 ms
rendering took: 14 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 24 ms
rendering took: 18 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 232 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms

範囲は12〜16ミリ秒です。これらの違いの間、衝撃的/反り/ちらつきの動きはすでに起こっていました。232msのピークも1つありますが、このときは比較的大きな反りがありました。ただし、これは最大の問題ではありません。最大の問題は、通常の動作中の継続的な小さな反りです。これは誰かに手がかりを与えますか?

更新3:テスト後、次の要因が問題の原因ではないことがわかりました。

  • ビットマップの品質->フォトショップで醜い8色に最適化されたグラフィックに変更されましたが、まったく改善されていません。
  • 回転中の画像の一定の回転->無効にした、まったく改善なし
  • ブラウザのレンダリング->FlashPlayerをスタンドアロンで使用しようとしましたが、まったく改善されていません

私は、問題が私のコードまたは私のアルゴリズムのいずれかにあると100%確信しています。私を助けてください。ほぼ2週間(SOでこの質問をしたのは1週間)ですが、それでも黄金の答えを得る必要があります。

更新1:完全なフレックスプロジェクトソースと私の問題を示すライブデモについては、下部を参照してください。

私は2Dフラッシュゲームに取り組んでいます。プレイヤーの船はオブジェクトとして作成されます:

ships[id] = new GameShip();

移動と回転の情報が利用できる場合、これは対応する船に送信されます。

ships[id].setMovementMode(1); //move forward

これで、このGameShip内で、オブジェクトの移動は「Event.ENTER_FRAME」イベントを使用して機能します。

addEventListener(Event.ENTER_FRAME, movementHandler);

その後、次の関数が実行されます。

private final function movementHandler(event:Event):void
        {
            var newTimeStamp:uint = UtilLib.getTimeStamp(); //set current timeStamp
            var distance:Number = (newTimeStamp - movementTimeStamp) / 1000 * movementSpeed; //speed = x pixels forward every 1 second
            movementTimeStamp = newTimeStamp; //update old timeStamp
            var diagonalChange:Array = getDiagonalChange(movementAngle, distance); //the diagonal position update based on angle and distance
            charX += diagonalChange[0];
            charY += diagonalChange[1];
            if (shipContainer)
            { //when the container is ready to be worked with
                shipContainer.x = charX;
                shipContainer.y = charY;
            }
        }

private final function getDiagonalChange(angle:Number, distance:Number):Array
        {
            var rAngle:Number = angle * Math.PI/180; //convert degrees to radian
            return [Math.sin(rAngle) * distance, (Math.cos(rAngle) * distance) * -1];
        }

オブジェクトが移動しなくなると、イベントリスナーは削除されます。同じ方法が回転にも使用されています。すべてがほぼ完璧に機能します。

プロジェクトのターゲットFPSを100に設定し、FPSカウンターを作成しました。FPSカウンターによると、Firefoxの平均FPSは約100、トップは1000、ボトムは22です。ボトムとトップのFPSは、クライアントの初期化(起動)中にのみ発生していると思います。

問題は、船がほぼ完全に滑らかに見えることですが、「ほぼ」部分がない状態である必要があります。まるで船が非常に速く「ちらつき」ているようで、実際には見えませんが、目で動いている間は物体に焦点を合わせるのが困難です。また、時々、フレームレートのスパイクが少しあるように見えます。クライアントが数フレームをスキップしているように、すぐにワープするのがわかります。

本当の問題を説明するのは非常に難しいですが、一般的には動きが完全にスムーズではないということです。では、オブジェクトの移動や遷移を完全にスムーズにする方法について何か提案はありますか?

アップデート1:

問題を示すためにクライアントを再作成しました。チェックアウトしてください。

クライアント: http: //feedpostal.com/test/MovementTest.html

Actionscriptプロジェクト(完全なソース): http: //feedpostal.com/test/MovementTest.rar

スムーズなフラッシュゲームの例(私が作成したものではありません):http ://www.gamesforwork.com/games/swf/Mission%20Racing_august_10th_2009.swf

このクライアント側バージョンを再作成するのにかなり長い時間がかかりました。これが問題の解決に役立つことを願っています。

注意:はい、実際にはかなりスムーズです。しかし、それは確かに十分に滑らかではありません。

4

8 に答える 8

9

ここに黄金の答えがあるかどうかはわかりませんが、いくつか提案があります。

まず、Math.PI/180の最適化などの問い合わせは不要です。一般的に高いフレームレートは、単純な計算が何も遅くしないことを明確にする必要があります。

第二に、表示ラグの時折のスパイクに対処するために:これらは、ガベージコレクターが非常に頻繁に実行されているように私には非常によく見えます。コードをざっと見てみると、GCが頻繁に発生する明らかな原因はわかりませんでしたが、2つの提案があります。まず、Flash IDEにアクセスできる場合は、Flexフレームワークを使用せずにプロジェクトを再作成してみます。Flashプロジェクトには、入力したもの以外のコードは含まれていませんが、Flexは独自のアーカネリーを多数採用しているため、必ずしも明白ではない場合があり、コードとフレームワーク間の相互作用によってGCが発生する可能性があります。

それでも問題が解決しない場合は、コードの大幅に簡略化されたバージョンを作成することもできます(可能な場合はFlashで)。これは、同じスパイクをトリガーしないように十分に単純であることが望ましいです。たとえば、グラフィックにアタッチされた単一のクラスを意味します。このクラスには、キーイベント用のリスナーが1つと、フレーム(またはタイマー)イベント用のリスナーが2つあり、変数は作成されません。最小バージョンでこれらのスパイクが表示されない場合は、それと完全なクライアントの間で三角測量を行って、スパイクの原因を特定できるはずです。

最後に、一般的な滑らかさに関して、私の唯一のコメントは、Flashの画面の更新は本質的にわずかに不均一であり、現実的には2つのアプローチしか利用できないということです。フレームの更新に従ってアクターを移動し、フレームレートの変化に応じてアクターの動きをわずかに不均一にするか、経過時間に従ってアクターを移動します。これにより、全体的な動きはスムーズになりますが(ピクセル/秒)、表示はわずかに不均一になります(ピクセルの移動)。フレームごと)。FPSが高くなると、その差はさらに大きくなります。

また、Flashが更新された後、それらが画面にどのように表示されるかは、ビデオカードの影響を大きく受けることを覚えておくことが重要です。特に、せん断とvsyncの問題は、ある環境では非常に目立ち、別の環境では見られない場合があります。一般に非常に高いFPSアニメーションを回避し、全体的なプロセッサの負担を可能な限り低く抑えることを除いて、開発者がこれに対処できる実際の方法はありません。

編集:フレーム更新のタイミングが「本質的に不均一」であることの意味について詳しくは、このブログ投稿を参照してください。画面の更新間の遅延は12〜16ミリ秒の間で変化しますが、何もできません。これは、OSとブラウザがFlashのタイミングの動作に影響を与えるという事実の結果です。(これは、空の映画でも見られるものです。そのため、数学の最適化などに関するこのスレッドの多くのコメントは役に立ちません。)この種のバリエーションは避けられませんが、私は上記のように、視覚効果を調整して、必要な効果を呼び起こすことができます。いずれにせよ、スパイクは心配する価値がはるかに高いと思います。あなたが見ている変化は微妙であり、たくさんのことが起こっているゲームでは気づきにくいでしょう、

編集2 あなたは尋ねます:「あなたはそれらのスムーズなゲームが私と同じ動きのアルゴリズムを使用していると本当に思いますか?」

答えは、彼らはもっと簡単なことをしていると思います。彼らはほぼ確実に次のいずれかを行っています。

function onEnterFrame() { // move at a constant speed per frame
    ship.angle += dtheta;
    ship.x += speed * Math.cos( ship.angle );
    ship.y += speed * Math.sin( ship.angle );
}

function onEnterFrame2() { // move at a constant speed per second
    var dt:Number = getTimeSinceLastFrame();
    ship.angle += anglePerSecond * dt/1000;
    var dist:Number = speedPerSecond * dt/1000;
    ship.x += dist * Math.cos( ship.angle );
    ship.y += dist * Math.sin( ship.angle );
}

つまり、フレームごとに一定の距離を移動するか、1秒ごとに一定の距離を移動します。これらは、これに取り組むことができる2つの最も簡単な方法であり、Flashで最も滑らかな外観をもたらす2つのオプションです。一定のフレームレートでは同じように見えますが、後者の方法では、リンクした記事で説明した「一時的なエイリアシング」と同様の理由で、わずかに変化するフレームレートでも滑らかに見えます。しかし、これらの方法のどちらを選択するかは、CPUスパイクが発生した場合、それが終わった後、船を動かし続けたいかどうかにかかっています。これは本当にゲームデザインの問題です。私が過去に行ったことの1つdtは、理想的なフレームの持続時間(1 / fps)の最大2倍または3倍にクランプしながら、2番目の方法を使用することです。

お気づきかもしれませんが、私が今お勧めした2つの方法は、まさに「タイムステップを修正する」方法です。記事はしないように言っています。これは、その記事が数値積分された物理エンジンに関するものであり、それがあなたがしていることではないためです。ばねと重力の実装を開始すると、そうです。タイムステップが大きくなると、多くのエラーが発生します。この種のシミュレーションでは、物事を単純化しすぎると、エラーはタイムステップのサイズに依存するためです。あなたがしていることでは、そうではないので、時折大きなタイムステップがシミュレーションの正確さに影響を与えることはありません。

アップデート6に返信

最初に、私はあなたの問題がパフォーマンスであるとは言いませんでした、私は特に反対を言いました。あなたの問題はあなたのプロジェクトのどこか別の場所にあるか、避けられないと信じていたので、最小限の複製を提案しましたが、私は今でもそうしています。第二に、私は今、あなたが他のFlashゲームと同じことをしていると言ってかなり快適に感じています、そしてあなたが見るどんな問題も知覚以外では解決することができません。あなたが投稿した新しいリンクでは、スタンドアロンのSWFプレーヤーでアニメーションを表示すると、アニメーションは完全に滑らかに見え、ブラウザーの前端と後端で微妙なちらつきがあります(IEよりもFirefoxの方が)。技術的には、改善できるとは思いません(特に、スタンドアロンプ​​レーヤーで基本的に完璧な場合は、ブラウザーの途切れがコンテナーの影響を受けることを意味します)。

もちろん、知覚されるパフォーマンスはさらに向上する可能性があります。たとえば、船が背景とそれほどはっきりと対照的でない場合、ちらつきははるかに目立たなくなります。また、船の動きを遅くするだけで、動きがはるかにスムーズになり、背景の動きと組み合わせて、より高速な錯覚を与えることができます(例の1つです)。

健全性チェックとして、IDEで作成した同様の最小限のバージョンを次に示します。 http://www.fenomas.com/random/ship/ パフォーマンスは私のマシンでのパフォーマンスと同等であり、私が言ったように、私は実際には何の問題も見ていません。(Firefoxでのみ発生することがあることに気付くときどきのスパイクを除いて。)特に、スタンドアロンプ​​レーヤーでは両方のバージョンが基本的に完璧に見えるという事実は、ここに黄金のアルゴリズムがないことをさらに確信させます。私はそれがあなたが望む答えではないことを知っています、しかしそれは私が得たものです。

于 2009-08-23T10:26:47.483 に答える
2

あなたのコードは私にはスムーズに実行されます。スパイクは一切ありません。updatePoller関数の最後に追加された次のコードでテストしました。

var shadow:Sprite = new Sprite();
shadow.graphics.beginFill(0xFFFFFF, 0.01);
shadow.graphics.lineStyle(1, 0xFFFFFF, 0.8);
shadow.graphics.drawRect(0, 0, 25, 50);
this.addChildAt(shadow, 0);
shadow.x = shipContainer.x;
shadow.y = shipContainer.y;
shadow.rotation = shipContainer.rotation;

100 fpsバージョンではパターンが不均一になる傾向がありますが、計算に基づいて、フレームの計算に10ミリ秒以上かかる場合、1秒間に100フレームをレンダリングできないため、これは正常です。したがって、少なくとも私にとっては、最後のコードは30fpsでスムーズに実行されます。

あいまいな部分については、主要な問題であり、うまくいけば、私が尋ねるのに腹を立てないでしょう:あいまい/ぼやけた効果は、モニターが原因である可能性はありますか?LCDモニターの応答時間が10ミリ秒であっても、静的な黒の背景に白が急速に移動するものは、ぼやけて見える傾向があります。

于 2009-08-24T17:12:56.967 に答える
1

あなたの問題の根本は、「垂直同期」が画面のそれと同じではないということだと思います。これは、たとえば60Hzの画面で24fpsの映画を見たときに発生する問題と同じです。アップデートは完全には一致せず(あなたの場合は100/60)、大きなジャンプを打つと、動きの小さなジッターのように見えます。

これは、フレームレートを下げることである程度改善できます。画面のフレームレートを超えると、とにかく処理能力が無駄になります。フラッシュ埋め込み用の新しいwmodeが解決策になる可能性はありますが、完全に回避することはできません。

于 2009-08-17T09:21:29.783 に答える
0

時期尚早に心配していることをお勧めしますか?

リンクした「完全にスムーズな」フラッシュゲームを注意深く見ると、スムーズな動きの「錯覚」であなたをだましていることに気付くでしょう。

車はまったく速く動いていません-おそらく数フレームごとに1ピクセルです。動きの大部分を行うのは背景です。よく見てください。少しジッターがあり、修正しようとしているのと同じ「焦点を合わせるのが難しい」効果がありますが、それは背景であるため、正常に見えます。そして、車がそれらの効果を示している場合でも、背景とゲームプレイはそれらに気付くことからあなたをそらします。

あなたが今持っているのは完全に黒い背景の上を動く船だけなので、あなたはジッターに気づいていると思います。ゲームの残りの部分が整ったら、プレーヤーはおそらく少しのジッターに気付くための余計な注意を払う必要はありません。「ピントが合いにくい」効果は、船の移動速度を下げると消えます。

最初にゲームの残りの部分に取り組んでみませんか?それでも問題が解決しない場合は、いつでも戻ってモーションを微調整できます。あなたはアニメーションアーティファクトに多くの時間を費やしています。ゲームプレイはもっと重要ではありませんか?

于 2009-08-18T20:47:36.503 に答える
0

これはかなり良い質問です。私はコードをスキャンし、いくつかの提案がありますが、私のアドバイスはそれほど良くないかもしれません。

コードを最適化するためにたくさんのことができると思います。明らかに、この初期段階ではありません。ただし、そのコードを使用してテストを行い、最適化されたコードを使用して高速に実行されることを確認すると、続行する価値があるかどうかがわかります。

これが私の「反対意見」です。

  • あなたは多くの部門を使用します。除算は乗算よりもコストがかかります。

    var distance:Number =(newTimeStamp --movementTimeStamp)/ 1000 * MovementSpeed;

簡単に次のように書くことができます

var distance:Number = (newTimeStamp - movementTimeStamp) * .001 * movementSpeed;
  • 多くの関数への参照がたくさんあります。

    fixAngle()などのようなものは、呼び出しを頻繁に実行しなくても、同じ関数内に含めることができます。これは、フェノームとAllanが指摘したように、外部クラスやMath.PIまたはMath.sinなどへの参照に適用されます。

私はこのメソッドをサインとコサインでテストしましたが、非常に高速です。確かにそれはコードを汚くします、しかしそれはあなたがそれが機能するのに必要な方法でそれの大部分が機能するまであなたがこれをすぐに最適化しない理由です、コードが読みにくくなるので最適化はあなたを狂わせるだけです。私の経験から、sinとcosはかなり高価な操作です。

他の人がすでに述べたように、あなたはこの段階であまりにも心配しているかもしれません。すべてのロジックが適切に機能するようになるまで、最適化について考えないでください。スピードを上げることができることがたくさんあることを覚えておいてください。

于 2009-08-23T13:00:49.520 に答える
0

あなたが80fpsでアップしているので、これはほぼ確実だと思います。Flashは、一貫したフレームレートをそれほど速く提供することはできません。30 fpsにドロップダウンして、テストを続けます。また、実際の背景の前で船を飛ばしてみてください。そうすれば、それほど気付かないと思います。

于 2009-08-23T19:14:58.880 に答える
0

ダウンロードするファイルが存在しません(http://feedpostal.com/test/MovementTest.rar)。

于 2009-09-28T03:38:06.640 に答える
0

この問題に関連する別の質問に回答しました。以下をお読みください。

私は現在、自分のゲームを開発している塹壕にいるので、あなたの痛みを感じます。デフォルト設定では、Flashレンダラーは、生成するコードに関係なく、ひどい画面ティアリング/v-syncの問題を生成します。

これが、コードのリファクタリングではない、最もシンプルでエレガントな答えを見つけて嬉しかった理由です(これは、1ビットの助けにはなりません。問題は、コードではなくFlashプレーヤーです)。

公開設定でハードウェアアクセラレーションを有効にするだけです。2つの異なるオプションがあります。

レベル1:直接; レベル2: GPU 。

詳細については、公式ドキュメントをご覧ください。SWFファイルの公開設定を指定し、ゲームに最適なオプションを決定します。

ここではターゲット市場が要因となります。ゲーマーにとって深刻なゲームである場合、ほとんどのゲーマーはGPUを使用しているため、パフォーマンスの問題について心配する必要はありません。

この記事は私に具体的な解決策を提供しませんでしたが、正しい方向に私を導きました。ただし、ゲームをブラウザウィンドウで表示する場合は、wmodeをdirectまたはgpuに設定するのと同じ手法を使用する必要がある場合があります。

于 2010-03-14T22:49:23.623 に答える