3

砂粒子シミュレーションを使用して iOS アプリに取り組んでいます。これは、そのロジックを示すアルファ版のビデオですhttp://www.youtube.com/watch?v=cYgw6jHx6QE

しかし、粒子アルゴリズムのパフォーマンスに問題があります。

今、私は次のようにしています(アプリはcocos2dで作成されていますが、それは実際には問題ではありません):

0.03秒ごとにスクリーンピクセルデータを取得します

glReadPixels(0,0,WindowSize.width,WindowSize.height,GL_RGBA,GL_UNSIGNED_BYTE,&ScreenBuffer);

ピクセルの色と背景の色を比較する機能もあります

- (BOOL) GetColorAtPoint: (int) GetX : (int)GetY
{
    int YSize = (int)WindowSize.width*4;

    Byte R = ScreenBuffer[(YSize*GetY) + 0 + (4 * GetX)];
    Byte G = ScreenBuffer[(YSize*GetY) + 1 + (4 * GetX)];
    Byte B = ScreenBuffer[(YSize*GetY) + 2 + (4 * GetX)];
    Byte A = ScreenBuffer[(YSize*GetY) + 3 + (4 * GetX)];

    return (R==255 && G == 0 && B == 0 && A == 255);
}

粒子の構造体を定義し、それらの配列を持っています

struct SandParticle
{
    CGPoint Position;

    BOOL CMTop;
    BOOL CMBottom;
    BOOL CMLeft;
    BOOL CMRight;
};

struct SandParticle SandMatrix[5000];

int ParticlesCounter;

だから、私の論理は次のとおりです。0.03 秒ごとに、SandParticle 構造体で新しいパーティクルを作成し、それを SandMatrix 配列に追加して、ParticlesCounter を増やします。次に、SandMatrix 配列を繰り返し処理し、パーティクルごとに、下の位置 Y-1、左の Y-1 X-1、右の Y-1 X+1 の背景色を (上記の GetColorAtPoint メソッドを使用して) 取得します。背景色が赤の場合、パーティクルは下、左、または右に移動できます。

そのための完全なコードはhttps://gist.github.com/8e6c4710950d17ed3d3c#L122で入手できます(厳密には判断しないでください。これはドラフトバージョンです)

主な問題は、iOS デバイスで ±800 を超えるパーティクルの量でフレーム レートが低下することです (シミュレーターではすべて問題ありません)。問題は反復サイクル ( UpdateParticles メソッド) です。しかし、別の方法でそれを作る方法がわかりません。ここで私にできることはありますか?

4

1 に答える 1

1

正確なアルゴリズムはわかりませんが、通常、優れたランダム ジェネレーターはかなり低速です。おそらく、その呼び出しを回避して、初期化フェーズで実行し、配列を埋めて、次のようにインデックスで値を取得できます

       int Randomized = precomputed_arc4rand_unif2[CPLoop];

最適化が最高の状態であると仮定すると、コードを再配置しても、パフォーマンスの観点から重要な利点が得られるはずはないと思います。ただし、CurrentParticle にコピーするに続行するかどうかを確認できる場合を除きます。それを書く方法、定義を使用するか、ポインターを通過します(ただし、最適化によりこれも保存される可能性があります)、つまり

      struct SandParticle *CurrentParticle = &SandMatrix[CPLoop];

次に、必要のない CurrentParticle の最後の「コピーバック」をCurrentParticle->代わりに削除します。CurrentParticle.

しかし、それがパフォーマンスを大幅に向上させるかどうかはわかりません。

于 2012-05-13T19:52:44.740 に答える