2013-12-18 2 views
4

나는 UIView의 drawRect에 CGBitmapContext 조각을 그리 고 있습니다. 성능이 최적인지를 확인하기위한 최상의 CGBitmapInfo enum 값은 무엇입니까? 지금은 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big를 사용하고 있고 또한 다른 제안이 유래 질문 조각 보았다 :iOS에서의 CGBitmapInfo 값 성능

Why does this code decompress a UIImage so much better than the naive approach?

// makes system don't need to do extra conversion when displayed. 
kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little 

내 CGBitmapContext가 변경 가능한을하므로 사용자는, 그 위에 그릴 여기에 이미지를 추가 할 수 있습니다

+0

최대한 빨리 두 번째 옵션 집합을 알고 있습니다. 하지만 UIGraphicsBeginImageContextWithOptions를 사용하여 비트 맵 컨텍스트를 만들 수 있으며 이러한 세부 사항에 대해 걱정하지 않아도됩니까? – yurish

+0

내 CGBitmapContext는 변경할 수 있습니다. 즉, 사용자가 이미지를 그릴 수 있고 이미지를 추가 할 수 있으며 이러한 모든 것들은 UIView drawRect를 사용하여 화면에 표시되어야합니다. – jjxtra

+0

@yurish 왜 두 번째가 더 빠릅니까? – jjxtra

답변

3

kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32BigkCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little으로 테스트를 실행했는데 프로파일 러에서 약간 다른 코드 경로가 있음을 보여주었습니다.

kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little은 메모리를 직접 복사하고 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big은 변환 기능을 사용합니다.

이것은 (심지어 iPod 4에서도) 내 에 경로를 그리고 나서 화면에 표시하기 위해 setNeedsDisplayInRect:을 호출하는 데 걸리는 총 시간에 거의 영향을 미치지 않았습니다. 또한 전반적인 시간이 본질적으로 동일하기 때문에 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big을 고집합니다.

편집 나는 성능에 영향이 없었기 때문에 BGRA (리틀 엔디안) 바이트 순서를 사용 (AVFoundation 같은) 다른 아이폰 OS 프레임 워크와의 호환성을 향상을 위해 kCGBitmapByteOrder32Little로 다시 전환.

+0

총 시간의 측정에는 비트 맵을 한 형식에서 다른 형식으로 변환하는 시간이 포함됩니까? – yurish

+0

예, 전체 밀리 초가 매우 가깝습니다 (어쩌면 10-20 차이). 아마도 나는 그것을 다시 프로파일 링하고 정확한 타이밍을 게시 할 것입니다. – jjxtra

+0

변환 시간을 어떻게 측정 할 수 있습니까? Core Animation 트랜잭션이 커밋 될 때이 변환이 올바르게 수행됩니다. setNeedsDisplayInRect : 다시 그리기 뷰를 표시하기 만하면 도면 자체가 실행 루프 사이클에서 나중에 발생합니다. – yurish