문제

나는 이전에 픽셀 푸싱에 대해 물었고 이제 화면에 소음이 나타날 정도로 충분히 멀어졌습니다. 내가 시작하는 방법은 다음과 같습니다.

CGDataProviderRef provider;
bitmap = malloc(320*480*4);
provider = CGDataProviderCreateWithData(NULL, bitmap, 320*480*4, NULL);
CGColorSpaceRef colorSpaceRef;
colorSpaceRef = CGColorSpaceCreateDeviceRGB();
ir = CGImageCreate(
320,
480,
8,
32,
4 * 320,
colorSpaceRef,
kCGImageAlphaNoneSkipLast,
provider,
NULL,
NO,
kCGRenderingIntentDefault
);

각 프레임을 렌더링하는 방법은 다음과 같습니다.

for (int i=0; i<320*480*4; i++) {
bitmap[i] = rand()%256;
}
CGRect rect = CGRectMake(0, 0, 320, 480);
CGContextDrawImage(context, rect, ir); 

문제는 이것이 약 5fps의 끔찍하게 끔찍하게 느리다는 것입니다. 버퍼를 게시하는 내 길은 잘못되었다고 생각합니다. 3D 칩을 사용하지 않고 30fps로 업데이트 할 수있는 전체 화면 픽셀 기반 그래픽을 수행 할 수 있습니까?

도움이 되었습니까?

해결책

속도는 거의 확실히 소음 생성에 있습니다. 이것을 악기로 실행하면 아마도 많은 시간이 당신의 고리에 앉아있는 것을 보게 될 것입니다.

또 다른 작은 문제는 Colorspace입니다. 화면의 Colorspace를 사용하면 잠재적으로 비싼 Colorspace 변환을 피할 수 있습니다.

드로잉에 CoreGraphics 루틴을 사용할 수 있다면 매번 새 개체를 만드는 대신 드로잉 컨텍스트에 대한 CGLAYER를 만드는 것이 좋습니다.

바이트 퍼 로우 구성 요소는 성능에도 중요합니다. 32 IIRC의 계수 여야합니다. 사용할 수있는 코드가 있습니다 링크 텍스트 그것은 그것을 계산하는 방법을 보여줍니다.

그리고 예, 원시 성능을 위해 Opengl.

다른 팁

나는 614400을하고 있다고 생각한다.320*480*4) 메모리는 쓰기, 임의의 숫자 생성 및 각 프레임 각 프레임을 만들면 느려집니다.

정적 비트 맵을 스크리닝하고 그것이 얼마나 빠른지 확인하려고 했습니까? 코드 프로파일 링을 시도 했습니까? 매번 새 CGRECT를 만들어야합니까?

무작위성의 영향을주고 싶다면 매번 전체 비트 맵을 재생할 필요가 없을 것입니다.

내가 아는 한, OpenGL은 iPhone에서 그래픽을 수행하는 가장 빠른 방법이어야합니다. 여기에는 2D 및 3D가 포함됩니다. uiview는 핵심 애니메이션 레이어로 뒷받침되며, 어쨌든 OpenGL로 그리기가됩니다. 그렇다면 중간 사람을 건너 뛰지 않겠습니까?

여행을 피할 수 있습니다 CGContextDrawImage 당신의 할당함으로써 CGImageRef 에게 -[CALayer setContents:], 아직도 사용하는 동안 비트 맵을 자유롭게하지 마십시오.

[[view layer] setContents:(id)ir];

네,이게 늙었다는 걸 알아, 난 Google에서 걸렸다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top