砂粒子シミュレーションを使用して 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 メソッド) です。しかし、別の方法でそれを作る方法がわかりません。ここで私にできることはありますか?