0

私は小さなタイルを使用してレベルを生成するFlash(AS3)の小さなゲームに取り組んでいます。

タイルの位置、幅、高さ、およびその他のプロパティは、生成時に配列に格納されます。各タイルは、同じコンテナムービークリップに追加されます。すべてのタイルが生成されると、コンテナームービークリップがビットマップに変換され、すべてのタイルがステージから削除され、元のコンテナーがステージから削除されてから削除されます。ビットマップは、プレーヤーを除いて、ステージ上に残っている唯一の「グラフィック」です。

これにより、ゲームプレイ中に60,000以上のタイルすべてを個別にレンダリングできるよりもはるかに優れたパフォーマンスが得られます。ただし、タイルの数が増えると、フレームレートは低下します。タイルの数に関係なく、すべてのタイルが常に同じサイズの単一のビットマップに追加されるため、これは意味がありません。

生成中に20,000タイルを使用すると、ゲームはフルFPSで実行されますが、60,000を使用すると、比較的不安定に実行され、おそらく4〜5FPS程度になります。

スクリプトの他のCPUを集中的に使用する部分がフレームレートに遅れをとっている可能性を排除するために、衝突検出とタイル配列を実行するすべてのスクリプトを削除しました。

すべてのタイルがステージから削除され、それらのコンテナが削除されたにもかかわらず、生成されたタイルの数に関係なく、背景のビットマップに同じ量のデータが含まれていても、ゲームの実行が遅いのはなぜですか?

これは、コンテナムービークリップをビットマップに変換してからすべてのタイルを削除するレベル生成アルゴリズムの最後の部分です。

        var temp_bitmap_data:BitmapData = new BitmapData(this.stage_background_mc.width,this.stage_background_mc.height);

        temp_bitmap_data.draw(this.stage_background_mc);

        this.stage_background_bitmap = new Bitmap(temp_bitmap_data);


        main_class.main.stage.addChild(this.stage_background_bitmap);

        for (var block in blocks_array)
        {

             //every block in blocks_array has a child that is the actual graphic of the tile
             blocks_array[block]["block"].removeChild(blocks_array[block]["block"].getChildAt(0));

            if (blocks_array[block]["type"] == "bg_block")
            {
                this.stage_background_mc.removeChild(blocks_array[block]["block"]);
                blocks_array[block]["block"] = null;
            }
            if (blocks_array[block]["type"] == "path_block")
            {

                //path_blocks have a second child in addition to the first one that's already been removed. the second child is the only other child
                blocks_array[block]["block"].removeChild(blocks_array[block]["block"].getChildAt(0));
                this.stage_background_mc.removeChild(blocks_array[block]["block"]);             

            }




        }

        this.stage_background_mc = null;

[編集]これは、何が起こっているのかをよりよく理解するためのゲームの写真です。 ゲームレベル

[アップデート:]

最終的に作成されたビットマップをステージから削除しても、ステージ上に子が1つだけになり、削除されたビットマップをnullに設定しても、速度は向上しません。

4

1 に答える 1

4

いくつかの考え。

まず、AS3のブリッティングの迅速な作業を半分利用しています。Bitmapステージ上にシングルを1つだけ配置することについては正しい考えがありますが、前の手順(に追加DisplayObjectsしてそれをMovieClip実行drawするMovieClip)は最速のプロセスではありません。一つにBitmapData.drawは、より遅いですBitmapData.copyPixelsここにそれに関する投稿があります)。速度を上げるための最良の方法の1つは、すべてのグラフィックを事前にブリットし、として保存することBitmapDataです。次に、Object各グラフィックの参照(位置などを含む)を保持します。レンダリングループで、各オブジェクトを実行し、を使用copyPixelsして、グラフィックのピクセル情報を単一のステージ上のビットマップ内の適切な位置にコピーします。このように、すべて遅いBitmapData.drawコマンドは前もって行われ、今はピクセルをプッシュしているだけです。これはFlashが非常に高速です。

ただし、そのプロセスには欠点があります。たとえば、それを使って簡単な変換を行うことはできません。たとえば、個々のグラフィックを回転させるには、回転のすべてのフレームを事前にブリットする必要があります(BitmapDataを回転することはできず、でを使用drawしていないためDisplayObject)。それでも、あなたが制限を持って生きることができれば、それは非常に速いです。

これは、私が上で説明したプロセスのチュートリアルとして役立つ投稿です。それは古いですが、それでも有益です。

最後に、60,000は非常に大きな数です。フラッシュは正確には「スピードデーモン」ではありません。どんなに最適化しても、最終的には限界に達します。覚えておくべきことです。

ああ、そしてこの追加の投稿は、Flashのパフォーマンスに関するいくつかの素晴らしいヒントを提供します。

于 2012-06-10T18:39:34.080 に答える