6

だから私は一種の粒子シミュレーターを書いています。それが何であるかを知っているなら、「落ちる砂ゲーム」のようなものですが、今は障害物にぶつかっています。私がこれを行っている方法は、基本的に現在位置 (int x, int y) を持つパーティクル オブジェクトを持っていることです。私がそれらを描画/移動する方法は、Android パネルのスレッドと onDraw イベントを使用することです。onDraw が呼び出されるたびに、すべてのパーティクルをループし、底に当たらない限り 1 ピクセル下に移動してから描画します。これは約 200 個のパーティクルに到達するまでは非常にスムーズで、その後 fps が大幅に低下します。私はこれが私がやっている方法で計算が重いことを知っています.

前もって感謝します。

4

5 に答える 5

2

OpenGL ESハードウェア アクセラレーションとrenderscriptを調べることをお勧めします。コードに関してより効率的なソリューションは得られません(それについては他の回答を参照してください)。ただし、使用する処理能力が大幅に向上します。GPU でシミュレーション全体を実行することもできます (実装の詳細がわからない可能性があります)。

編集
また、まだ Java で処理を行うことにした場合は、DDMS でのメソッド プロファイリングを確認する必要があります。これにより、パフォーマンスのボトルネックがどこにあるかを視覚化できます。

于 2011-06-15T17:30:24.510 に答える
2

これには、個々のピクセルの描画機能を使用していると思いますか?それは確かに遅いでしょう。

それを改善する方法がいくつかあります。まず、ピクセルをメモリ内のビットマップに配置し、ビットマップ全体を同時に描画します。第 2 に、パーティクルは常に 1 ピクセルだけ下に移動するため、すべてを再プロットする代わりに、ビットマップの一部をスクロールできます。Android にスクロールがない場合は、ビットマップを 1 ピクセル下に描画し、スクロールの上のパーティクル用に新しいビットマップを開始します。底の粒子を修正する必要がありますが、それらの数は少なくなります。

于 2011-06-15T17:21:44.630 に答える
2

私はこれまでにこのようなことをしたことはありませんが、いくつかの複雑なセル オートマトンを実行しました。これが曖昧すぎる場合は申し訳ありません。

ここでの基本的な考え方は、「落下し続ける」または「動かない」必要があるすべてのパーティクルをマークし、それらを複雑な処理から除外することです (「落下」リスト用の特別な短い/高速プロセッサを使用 - 必要なのは、それぞれをドロップすることだけです)。ピクセル単位)。

  • 動かない粒子 - 静的粒子 (私はそれらを S 粒子と呼びます) の加速度は、それらが動かないということです。すべての非移動領域 (ユーザーが作成する可能性のある重力に影響されない「壁」または「ボウル」など) に対してマークします。その上の粒子が安定している場合は S とマークします。たとえば、液体の場合、下に S 粒子がある場合は、砂のように山を形成するものは、その下の 3 つのスポットのそれぞれに S がある場合、山ができます。 、それを変更して、いくつかのものをより急な山にしたり、急でない山にしたりすることができると確信しています.Sマッピングをボトムアップで行います.
  • その下に粒子がない粒子の加速度は落下です - F 粒子。その下に F 粒子がある粒子も F 粒子です。これらのボトムアップもマークします。
  • F または S のマークが付いていない粒子は複雑で、落下を開始したり、落下を停止したり、転がったりする可能性があります。それらを処理するために、既に持っている低速のプロセッサを使用します。多くはないはずです。

最終的には、多くの高速粒子が得られます。山/湖にいるものと雨が降っているもの。残りの粒子は、斜面の端、湖の頂上、またはその他の複雑な位置にある粒子です。速い粒子があるほど多くないはずです。

粒子の種類ごとに色を付けて視覚的にマークします。複雑な粒子は明るい赤です。それでも遅い場合を見つけて、他にどのような高速プロセッサを作成する必要があるかを確認してください。たとえば、大量の砂の山を作ると、斜面に沿って赤い領域がたくさん作成されることに気付くかもしれません。山の斜面に沿った「ローリング ゾーン」のスピードアップに投資したいと思うかもしれません。

それが理にかなっていることを願っています。何かを見つけたら、戻って編集することを忘れないでください。

于 2011-06-15T17:53:46.927 に答える
0

画像を少しぼかすと、一度に半分の粒子を移動するだけで、おそらく4分の1だけを移動して、すべてを印刷できます。これにより、計算が削減され、ユーザーには表示されず、すべての粒子が移動しているように感じられます。

しかし、あなたが何を選んだとしても、すべてのユーザーが強力なAndroidデバイスを持っているわけではないので、強い制限を課すべきだと思います。

よろしく、ステファン

于 2011-06-15T17:08:56.527 に答える
0

粒子同士が近接していれば、3 つ以上の粒子を表すオブジェクトを作成できると思います。

画面に複数の粒子を表示すると、粒子のセットが見過ごされることがあります。

于 2011-06-15T17:22:52.000 に答える