나는 모래 입자 시뮬레이션과 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)입니다. 그러나 나는 내가 어떻게 다른 방식으로 그것을 만들 수 있는지 전혀 모른다. 내가 여기서 할 수있는 일이 있니?
문제가 있다고 말하면 물론 코드를 프로파일 링했다고 가정합니다. – ShinTakezou