2012-09-17 16 views
5

Metin netliği amacıyla daha sonra (2000 x 2000) daha yüksek bir çözünürlüğe sahip görüntülerin kullanılması gereken bir uygulama geliştiriyorum.Çok Yüksek Çözünürlüklü Görüntülerin İşlenmesinin En İyi Yolu Nedir?

Arka plan resmim var, bunun üzerine aynı çözünürlükte Bindirme Görüntüler göstermem gerekiyor. Bindirmelerin sayısı 2'den 30'a kadar değişkendir.

Görüntüyü UIImage ile yükledikçe, her piksel için 4 Bayt alır, bu nedenle bir görüntü 3000x3000 çözünürlüğe sahipse, 34 MB'a kadar bellek alır, sorun uygulama kilitleniyor 3GS 4-5 görüntüleri yüklendikten sonra, yükselir 2000 x 2000

thats ve iPhone 4 için 11-13 görüntülerin Bindirme ihtiyaç

için 15 MB tam üzerine yerleştirilmek üzere arka plan resmi. Google Maps trafiği Yerleşimlerinde sahip olduklarımız gibi. Bu fayansı dışlamaz, ancak görevi göreceli olarak karmaşık hale getirir.

Bu sorunu nasıl ele almalıyım?

+1

Bu sorun, iş mantığının döşenmesi veya yeniden gözden geçirilmesiyle çözülebilir. – JehandadK

+0

Evet, bu sorunu halletmeden kullanabileceğim bir yol olup olmadığını bilmek istiyorum. –

+0

Hem Yer Paylaşımlıları hem de Google Haritalar’dan bahsederken, MapKit’i kullandığınızı farz ediyorum. MKOverlayView * * kiremitli bir görünümdür ve bu nedenle muhtemelen döşemeyi göz ardı etmemelisiniz. MK çerçevesi, bindirme görünümünüzde "drawMapRect: zoomScale: inContext:" işlevini çağırır ve en iyi uygulama olarak, yalnızca verilen sınırlayıcı rect'e göre içeriği * oluşturmalısınız. –

cevap

0

Kesinlikle, tüm görüntüyü aynı anda belleğe yükleyemezsiniz. Sadece görüntü verilerinin görünür kısmını yüklemeniz ve görünmez parçayı olabildiğince hızlı bir şekilde boşaltmanız gerekir.

Bunu QuartzCore seviyesinde çözmek isterseniz, sadece bu amaç için CATiledLayer sınıfı var.

Elma Referans: https://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CATiledLayer_class/Introduction/Introduction.html

Elma Örnek Kod: https://developer.apple.com/library/mac/#samplecode/CALayerEssentials/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008029

Ek bilgiler: http://red-glasses.com/index.php/tutorials/catiledlayer-how-to-use-it-how-it-works-what-it-does/

bu katmanı kullanmak için, birçok karolar halinde kaynak görüntüleri bölmek gerekir. Ve katman buna ihtiyaç duyduğunda onları tedarik edin. (drawLayer:inContext: yöntemi.) Bu yöntem ana olmayan iş parçacığı üzerinde çağrılacak, bu nedenle kullanıcı arabirimi engellenmeyecektir. Belleği korumak için görünmez çini görüntüsünü serbest bırakmayı unutma. Ayrıca, arka plan iş parçacığı kullanarak dinamik kaynak yükleme ile düşük düzeyli OpenGL koduyla bunu uygulayabilirsiniz. Bu durumda, video hafızası kullanımını çok fazla koruyabilen PVRTC kayıplı bellek içi sıkıştırmayı kullanabilirsiniz, ancak bu gerçekten acı verici ve zaman alıcı bir iştir. CATiledLayer'u kullanmanızı tavsiye ederim. Çoğu vaka için bu yeterli.

İlgili konular