私は砂ベースの Windows Phone 8 ゲームを作成しており、パフォーマンスを向上させる方法を考えています。
砂は上から落ちて物に衝突するので、フレームごとに計算する必要があります。
現在の実装は次のように機能します。
- このピクセルが砂/障害物/線で満たされているように、ピクセル情報を含む短い[,]配列があります
- 砂のアルゴリズムは実にシンプルです。そこにスペースがあれば、すべての粒子を左右にランダムに移動し、下にスペースがあれば落下させます
- パフォーマンス上の理由から、レベルの開始時に背景画像が変化しない WriteableBitmap を作成します
- フィールドを描画するときに、事前に作成した WriteableBitmap をコピーし、WriteableBitmap.Pixels[] を介して変更部分を追加し、ImageBrush.ImageSource を介してキャンバスの背景として設定します。
- 毎回の更新で行うことは、バックグラウンド スレッドで砂の動きを計算し、UI スレッドに描画を行わせることです。つまり、short[,] 配列全体を調べて、pixel[] が砂かどうかを確認し、砂の場合は粒子の動きを計算します。その後、背景画像などにコピーします。
このセットアップでは、NOKIA Lumia 820 のデバッグ モードで約 15 fps が得られますが、これはかなり遅いようです。
もちろん、random.Next の代わりにランダム マップを使用したり、short[,] の代わりに 1 つの大きな short[] を使用したりするなど、いくつかの小さな最適化を行うこともできますが、コードのさまざまな部分をコメントアウトしたところ、このセットアップのどこかで主要なパフォーマンスが低下します。