私は小さなタイルを使用してレベルを生成する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に設定しても、速度は向上しません。