0

私は砂ベースの Windows Phone 8 ゲームを作成しており、パフォーマンスを向上させる方法を考えています。

砂は上から落ちて物に衝突するので、フレームごとに計算する必要があります。

現在の実装は次のように機能します。

  • このピクセルが砂/障害物/線で満たされているように、ピクセル情報を含む短い[,]配列があります
  • 砂のアルゴリズムは実にシンプルです。そこにスペースがあれば、すべての粒子を左右にランダムに移動し、下にスペースがあれば落下させます
  • パフォーマンス上の理由から、レベルの開始時に背景画像が変化しない WriteableBitmap を作成します
  • フィールドを描画するときに、事前に作成した WriteableBitmap をコピーし、WriteableBitmap.Pixels[] を介して変更部分を追加し、ImageBrush.ImageSource を介してキャンバスの背景として設定します。
  • 毎回の更新で行うことは、バックグラウンド スレッドで砂の動きを計算し、UI スレッドに描画を行わせることです。つまり、short[,] 配列全体を調べて、pixel[] が砂かどうかを確認し、砂の場合は粒子の動きを計算します。その後、背景画像などにコピーします。

このセットアップでは、NOKIA Lumia 820 のデバッグ モードで約 15 fps が得られますが、これはかなり遅いようです。

もちろん、random.Next の代わりにランダム マップを使用したり、short[,] の代わりに 1 つの大きな short[] を使用したりするなど、いくつかの小さな最適化を行うこともできますが、コードのさまざまな部分をコメントアウトしたところ、このセットアップのどこかで主要なパフォーマンスが低下します。

4

2 に答える 2

1

私は自分でこのようなものを作り始めましたwww.sandicle.comそこに古いテストビデオがあります、今は少し速く、より多くの機能があります...(私はいつも溶岩を落とすことを楽しんでいます:) ...)戻ってきたいと思っていますこのプロジェクトはすぐに(現時点では少し忙しいです:(

でも基本的には解像度を小さくすると40〜60fpsになります

また、エディターを追加して、独自のパーティクルを作成したり、人々が作成した新しいエレメントパックをダウンロードしたりできるようにしました:)

于 2013-03-15T11:55:59.453 に答える
1

1つのアイデアは、その下/側面で完全に遮られている砂が「非アクティブ」に設定されるようにすることです。非アクティブな砂は、何かが横/下に移動するまで更新時にチェックされません (これにより、解放されたすべてのピクセルが「アクティブ」として設定されます)。

于 2013-03-15T03:00:49.183 に答える