2012-09-17 8 views
5

Sto sviluppando un'applicazione, che deve utilizzare immagini con una risoluzione superiore a (2000 x 2000) ai fini della chiarezza del testo.Qual è il modo migliore per gestire immagini ad altissima risoluzione?

Ho un'immagine di sfondo, sulla quale ho bisogno di mostrare immagini sovrapposte con la stessa risoluzione. Il numero di overlay è variabile, da 2 a 30.

Come caricamento dell'immagine con UIImage, sono necessari 4 byte per ogni pixel, quindi se un'immagine ha una risoluzione di 3000x3000, saranno necessari fino a 34 MB di memoria, 15 MB per 2000 x 2000.

Thats dove il problema sorge, l'applicazione si blocca dopo aver caricato le immagini sul 4-5 3GS, e 11-13 immagini su iPhone 4.

le sovrapposizioni devono essere posizionati esattamente sopra l'immagine di sfondo. Sono proprio come quello che abbiamo nel traffico di Google Maps Overlay. Questo non esclude la piastrellatura, ma rende l'attività relativamente complessa.

Come devo gestire questo problema?

+1

Questo problema può essere risolto tramite la piastrellatura o riconsiderando la logica aziendale. – JehandadK

+0

Sì, voglio sapere se c'è un modo in cui posso gestire questo problema senza piastrellatura. –

+0

Suppongo che tu stia utilizzando MapKit considerando che menzioni sia Overlays che Google Maps. MKOverlayView * è * una vista piastrellata e come tale probabilmente non dovresti escludere la piastrellatura. Il framework MK chiamerà 'drawMapRect: zoomScale: inContext:' nella vista overlay e, come best practice, dovresti * solo * renderizzare il contenuto secondo il limite di bounding fornito. –

risposta

0

Definitivamente, non è possibile caricare l'intero set di immagini in memoria in una sola volta. È necessario caricare solo parte visibile dei dati dell'immagine e scaricare la parte invisibile il più velocemente possibile.

Se si desidera risolvere questo a livello QuartzCore, c'è la classe CATiledLayer solo per questo scopo.

di Apple Riferimento: https://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CATiledLayer_class/Introduction/Introduction.html

di Apple di codice di esempio: https://developer.apple.com/library/mac/#samplecode/CALayerEssentials/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008029

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

Per utilizzare questo livello, è necessario dividere le immagini di origine in molte tessere. E fornili quando lo strato ne ha bisogno. (Metodo drawLayer:inContext:). Il metodo verrà chiamato sul thread non principale, quindi l'interfaccia utente non verrà bloccata. Non dimenticare di liberare l'immagine del riquadro invisibile per risparmiare memoria.

Inoltre, è possibile implementarlo con codice OpenGL di basso livello con caricamento di risorse dinamiche utilizzando thread in background. In questo caso, è possibile utilizzare la compressione PVRTC con perdita di dati, in memoria, che può far risparmiare molto tempo all'utilizzo della memoria video, ma è un'operazione molto dolorosa e che richiede molto tempo. Raccomando l'uso di CATiledLayer. Questo è sufficiente per la maggior parte dei casi.

Problemi correlati