2012-05-13 8 views
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); 

I와 화면 픽셀 데이터를 얻을 또한 I는 입자 구조체를 정의하고 0

들을위한 어레이를

- (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 method)입니다. 그러나 나는 내가 어떻게 다른 방식으로 그것을 만들 수 있는지 전혀 모른다. 내가 여기서 할 수있는 일이 있니?

답변

1

나는 알 고를 정확히 알지 못하지만, 일반적으로 좋은 랜덤 제네레이터는 다소 느리다; 어쩌면 당신은, 초기화 단계에서 그 일을 배열을 작성 및 최적화가 최선에있다 치죠

 int Randomized = precomputed_arc4rand_unif2[CPLoop]; 

같은 인덱스 값을 받고, 그 전화를 피할 수있는, 내가 코드를 재 배열 생각하는 것은 용어의 중요한 이점을 제공해서는 안 성능을 제외하고는을 CurrentParticle에 복사하기 전에 을 계속 수행 할 수 있는지 확인해야합니다. 더 짧은 방법으로 쓰기를 원하거나 정의를 사용하거나 포인터를 사용하려면 일반적으로 그러한 복사본을 피할 수 있습니다 이것도 절약 할 수 있습니다.) 즉,

 struct SandParticle *CurrentParticle = &SandMatrix[CPLoop]; 

다음으로 d o CurrentParticle-> 대신 CurrentParticle.을 사용하고 필요없는 CurrentParticle의 최종 "복사 백"을 삭제하십시오.

하지만 성능을 훨씬 향상시킬 수 있을지는 잘 모르겠습니다.

+0

문제가 있다고 말하면 물론 코드를 프로파일 링했다고 가정합니다. – ShinTakezou