2012-01-11 12 views
8

Questa non è una domanda sull'affrontare un problema specifico ma più una richiesta da indirizzare nella giusta direzione.UIImageView vs UIView w/Image - efficienza

Sto creando un'app in cui sto caricando contemporaneamente più immagini (salvate come JPG) su uno schermo e questo deve essere il modo in cui è, non posso scaricare nessuno di loro perché sono tutti mostrato in una volta.

Ho provato a caricare 30 immagini a una risoluzione di circa 800px * 600px ingenuamente pensando di caricare solo la dimensione 'compressa' delle immagini in memoria (essendo circa 200 KB) - quindi un totale di 6 MB? Certo, dopo diversi avvertimenti sulla memoria, mi sono reso conto di quanto fossi stupido. Quindi ora li ridimensiono a circa 400px * 300px ciascuno e il mio iPhone 4S rispetta solo i requisiti di memoria.

Originariamente ho utilizzato un UiView in cui drawRect ha disegnato un'immagine personalizzata, ma il passaggio a UIImageView ha migliorato notevolmente la situazione. L'app è molto più veloce e reattiva. Ho anche scoperto che spegnere la rasterizzazione nel mio livello ha fatto un'enorme differenza nelle prestazioni.

Questo tipo di "scoperte" mi ha richiesto ore per capire e quello che mi chiedevo era se ci sono particolari modelli o risorse di progettazione che posso usare per caricare le mie immagini sullo schermo nel modo più efficiente possibile; soprattutto per quanto riguarda l'utilizzo del minor quantitativo di memoria possibile - ci sono buone regole empiriche? Perché usare UIImageView vs UiView w/image fa la differenza?

Sarei molto grato se qualcuno potesse aiutare.

Grazie.

risposta

9

L'implementazione di -drawRect: fa sì che il sistema assegni un'immagine bitmap della stessa dimensione della vista (dopo tutto, è necessario un buffer per disegnare in). Se tutto quello che stai facendo è disegnare un'immagine che hai già caricato, in un colpo solo hai raddoppiato l'utilizzo della memoria per quell'immagine (perché hai la copia che hai caricato e la seconda copia che hai appena disegnato).

Analogamente, la rasterizzazione dei livelli richiede l'allocazione di immagini bitmap della stessa dimensione del livello, quindi ha un buffer da rasterizzare. Quindi accenderlo risucchia anche la memoria (proporzionale alla dimensione del livello).

La regola di base è, non fare lavori extra. Usare -drawRect: per disegnare un'immagine è un lavoro extra. Rasterizzare un livello è un lavoro extra (anche se, a seconda del livello, questo può essere un costo di prestazioni una tantum (e un costo di memoria costante) per risparmiare sulle prestazioni in seguito, ad esempio se è un CAShapeLayer o se disegna ombre). Mantenere grandi immagini in memoria che riduci sempre il livello prima di eseguire il rendering sullo schermo è un lavoro extra (ridimensionalo una volta sola quando carichi l'immagine e mantieni la copia in scala).

Un'altra cosa da tenere a mente è che se il tuo obiettivo è disegnare immagini, dovresti provare a usare UIImageView se possibile. In genere è il modo più rapido ed economico per ottenere un'immagine sullo schermo ed è ragionevolmente flessibile.

8

Lo schema di progettazione è fondamentalmente, utilizzare UIImageView. Apple ha dedicato molto tempo a renderlo veloce e ad Apple è consentito utilizzare API private che non lo sono.

Detto questo, se si desidera eseguire da soli, provare a utilizzare uno CALayer per immagine. È sufficiente caricare un'immagine e impostarla come proprietà content di CALayer. Lo CALayer può memorizzare nella cache il suo contenuto nella memoria della GPU e potrebbe fare altre ottimizzazioni che non è possibile fare con le API pubbliche.

È possibile imparare molto sulla realizzazione dell'interfaccia utente guardando i video di sviluppo di Apple. Includono molti suggerimenti e "informazioni interne" che non sono nella documentazione scritta, o difficili da trovare/facilmente trascurabili nei documenti. I video di sviluppo sono qui: http://developer.apple.com/videos/. Alcuni buoni quelli pertinenti alla tua domanda:

  • iOS - "Capire iOS View Compositing"
  • WWDC 2011 - "UIKit Rendering Understanding"
  • WWDC 2011 - "Il disegno pratico per iOS sviluppatori"
  • WWDC 2011 - "core Animation Essentials"
  • WWDC 2010 - "core Animation in Practice"
+1

Grazie per il link - sono stati molto utili. – Vazzyb

+2

+1 per suggerire alcuni video da Apple (soprattutto perché l'interfaccia di Apple per la ricerca e la visione di quei video è terribile!) –

+0

@KevinZych hai mai controllato usato [asciiwwdc.com] (http://asciiwwdc.com)? – Honey

Problemi correlati