2008-10-11 6 views
3

나는 픽셀 밀기에 대해 전에 물었고 화면에 노이즈가 나타나기까지 충분히 멀리 할 수있었습니다. 여기에 내가 초기화하기 방법은 다음과 같습니다iPhone에서 픽셀을 더 빠르게 푸시하는 방법은 무엇입니까?

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의 주위에, 지독하게 느린입니다 :

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 
); 

는 여기에 내가 각 프레임을 렌더링 방법입니다. 나는 버퍼를 게시하는 나의 길은 틀림없이 이루어져야한다고 생각한다. 3D 칩을 사용하지 않고도 30fps로 업데이트 할 수있는 전체 화면 픽셀 기반 그래픽을 만들 수 있습니까?

답변

2

느림은 거의 노이즈 생성에 있습니다. 인스트루먼트에서 이것을 실행하면 루프에 앉아있는 데 많은 시간을 소비하는 것을 볼 수 있습니다.

또 다른 작은 문제는 색상 공간입니다. 화면의 색상 공간을 사용하는 경우 색상 공간 변환이 발생하지 않아 비용이 많이 듭니다.

CoreGraphics 루틴을 드로잉에 사용할 수있는 경우 매번 새 오브젝트를 만드는 대신 드로잉 컨텍스트 용 CGLayer를 만드는 것이 더 효율적입니다.

bytesPerRow 구성 요소는 성능을 위해서도 중요합니다. 그것은 32 IIRC의 요인이어야합니다. 코드 계산 방법을 보여주는 link text 코드가 있습니다.

그리고 원시 성능을 위해 OpenGL.

+0

에서 우연히. rand() 설정을 전혀하지 않고 CGContextDrawImage를 호출하더라도 CPU의 50 %가 소비되고 있어도 꽤 균등하게 분할 된 것 같습니다. 나는 당신의 다른 제안이 그것을 더 빨리 만들지 않을지 알아보기 위해 노력할 것입니다. – Bemmu

1

614400 (320*480*4) 메모리 쓰기, 난수 생성 및 새로운 개체를 만드는 것으로 의심되는 경우 각 프레임이 속도가 느려집니다.

정적 비트 맵을 화면에 쓰고 얼마나 빠른지 보았습니까? 코드를 프로파일 링 해 보셨습니까? 매번 새로운 CGRect를 만들어야합니까?

무작위 효과를주고 싶다면 매번 전체 비트 맵을 재생성 할 필요가 없습니다.

1

제 생각에 OpenGL은 iPhone에서 그래픽을 만드는 가장 빠른 방법입니다. 여기에는 2D 및 3D가 포함됩니다. UIView는 코어 애니메이션 레이어에 의해 뒷받침되며, 결국 어쨌든 OpenGL을 사용하여 드로잉을 마무리합니다. 그렇다면 왜 중도 인을 건너 뛰지 마십시오.

1

CGImageRef-[CALayer setContents:]을 할당하면 여행을 피할 수 있습니다. 아직 사용하고있는 동안에는 비트 맵을 사용하지 않도록하십시오.

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

예, 나는 이것이 오래 알고, 내가 조금 프로파일, 좋아 구글

관련 문제