2012-09-17 3 views
5

텍스트를 명확히하기 위해 해상도가 더 높은 이미지 (2000 x 2000)를 사용해야하는 앱을 개발 중입니다.고해상도 이미지를 처리하는 가장 좋은 방법은 무엇입니까?

오버레이 이미지를 동일한 해상도로 표시해야하는 배경 이미지가 있습니다. 오버레이의 수는 2에서 30까지 다양합니다.

이미지를 UIImage로로드하면 모든 픽셀에 4 바이트가 걸리므로 한 이미지의 해상도가 3000x3000이면 최대 34MB의 메모리가 필요하며, 문제가 응용 프로그램 충돌 3GS에 4-5 이미지를로드 한 후, 상승 2000 X 2000

그게 전부, 아이폰 4에 11-13 이미지 오버레이가 필요

15 메가 바이트 바로 위에 배치한다 배경 이미지. Google지도 트래픽 오버레이와 똑같습니다. 이것은 타일링을 배제하지 않지만 작업을 비교적 복잡하게 만듭니다.

이 문제는 어떻게 처리해야합니까?

+1

이 문제는 비즈니스 논리를 바둑판 식으로 배열하거나 다시 고려하여 해결할 수 있습니다. – JehandadK

+0

예, 타일링없이이 문제를 처리 할 수있는 방법이 있는지 알고 싶습니다. –

+0

오버레이와 Google지도를 모두 언급했다면 MapKit을 사용하고 있다고 가정합니다. MKOverlayView *는 타일 된 뷰이므로 타일링을 배제해서는 안됩니다. MK 프레임 워크는 오버레이 뷰에서'drawMapRect : zoomScale : inContext :'를 호출 할 것이고, 최선의 방법으로 제공된 경계 사각형에 따라 내용 만 렌더링해야합니다. –

답변

0

확실히 전체 이미지 세트를 메모리에 한 번에로드 할 수 없습니다. 이미지 데이터의 보이는 부분 만로드해야하며 가능한 빨리 보이지 않는 부분을 언로드해야합니다.

이 문제를 QuartzCore 레벨에서 해결하려면이 목적으로 만 CATiledLayer 클래스가 있어야합니다.

애플 참조 : https://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CATiledLayer_class/Introduction/Introduction.html

애플 샘플 코드 : https://developer.apple.com/library/mac/#samplecode/CALayerEssentials/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008029

추가 정보 : http://red-glasses.com/index.php/tutorials/catiledlayer-how-to-use-it-how-it-works-what-it-does/

이 레이어를 사용하려면, 당신은 많은 타일로 원본 이미지를 분할해야합니다. 레이어가 필요할 때 제공하십시오. (drawLayer:inContext: 메서드입니다.) 메서드는 주 스레드가 아닌 다른 스레드에서 호출되므로 사용자 인터페이스가 차단되지 않습니다. 메모리를 절약하기 위해 보이지 않는 타일의 이미지를 비우는 것을 잊지 마십시오.

또한 백그라운드 스레드를 사용하여 동적 리소스로드로 저수준 OpenGL 코드로 구현할 수 있습니다. 이 경우 비디오 메모리 사용량을 많이 절약 할 수있는 PVRTC 비효율적 인 메모리 내 압축을 사용할 수 있지만 정말 고통스럽고 시간 소모적 인 작업입니다. CATiledLayer을 사용하는 것이 좋습니다. 대부분의 경우 충분합니다.

관련 문제