我正在研究iOS應用程序和沙子粒子模擬。這裏是一個alpha版本的視頻顯示它的邏輯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);
}
我定義爲結構體顆粒和具有爲它們
0陣列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 method)。但我不知道如何以另一種方式製作它。我能在這裏做什麼嗎?
當你說問題在那裏時,我想你已經描述了代碼,當然 – ShinTakezou