2012-05-13 50 views
3

我正在研究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)。但我不知道如何以另一種方式製作它。我能在這裏做什麼嗎?

回答

1

我不完全知道算法,但通常好的隨機生成器相當慢;也許你可以避開這一號召,做它在初始化階段,填充一個數組,並取得索引值像

 int Randomized = precomputed_arc4rand_unif2[CPLoop]; 

假設優化是在最佳狀態,我想重新安排代碼不應該放棄在長期重要的好處的性能,除非你可以檢查是否繼續之前將複製到CurrentParticle中,並且通常可以避免這樣的副本,如果您想要更短的寫法,使用定義或通過指針(但可能是優化也保存這個),即

 struct SandParticle *CurrentParticle = &SandMatrix[CPLoop]; 

然後你d CurrentParticle->而不是CurrentParticle.,並刪除CurrentParticle的最後一個「不需要的」copy-back。

但我不知道它是否會使表現更好。

+0

當你說問題在那裏時,我想你已經描述了代碼,當然 – ShinTakezou