2012-06-15 18 views
9

Ho UIScrollView e il numero di oggetti (composizioni UIView) con UIImageViews al loro interno. Alcune di UIImageViews hanno un bordo rotondo (io uso myImageView.layer.masksToBounds = YES; per questo). Altro ha bordi rettangolari e parte di immagine in essi (io uso la proprietà Clip subviews in Interface Builder per questo).clipToBounds and masksToBounds performance issue

Il problema è che ho scoperto che le proprietà delle clip influenzano pesantemente la prestazione durante lo scorrimento:

per iPod touch (4a generazione) risultati di profiling:

  • con le proprietà dei clip abilitati (entrambi o uno dei loro) ho circa 30 fps durante lo scorrimento
  • con disabilità proprietà delle clip che ho tutti i 60 fps durante lo scorrimento

davvero è necessario ritagliare alcune immagini su limiti arrotondati e altre sui limiti del rettangolo (per mostrare parte dell'immagine). Quindi, ecco la mia domanda: quali modi ci sono per migliorare le prestazioni? Possono esserci metodi di livello basso per farlo (drawRect: o qualcosa del genere), o potrebbe essere utile giocare al mascheramento di alfa o fare qualcosa di sbagliato?

risposta

30

Quando si dispone di maschere e le cose graficamente intensivi, un modo semplice e facile per migliorare le prestazioni (spesso in modo drammatico) è quello di impostare shouldRasterize-YES sullo strato per quella voce:

#import <QuartzCore/QuartzCore.h> 

// ... 

view.layer.shouldRasterize = YES; 

Questo sarà rastersize la visualizzare in un buffer, quindi non viene ricreato costantemente. Ciò richiederà una memoria aggiuntiva per ogni vista, quindi dovresti davvero provare a riciclare/riutilizzare le viste mentre scorri, in modo simile a come funziona una vista tabella.

Per il comportamento corretto sul display retina è inoltre necessario impostare un valore appropriato per rasterizationScale:

view.layer.rasterizationScale = view.window.screen.scale; // or [UIScreen mainScreen] 

Ho avuto un grande successo con questo per le cose come scorrimento gallerie fotografiche, in cui ogni elemento ha gli angoli arrotondati, ombre, ecc.

+0

buoni consigli! ma ora aiuta davvero quando applico questa proprietà a vista intera (con vista immagine arrotondata e etichetta di testo all'interno). In questo caso il testo diventa così brutto .. Se lo applico solo nella vista immagine arrotondata non ha quasi alcun effetto. – Lloyd18

+1

Ah, mi dispiace. Per il supporto della retina, impostare 'view.layer.rasterizationScale = [[UIScreen mainScreen] scale]'. Questo dovrebbe rendere tutto croccante. Ho aggiornato la mia risposta. –

+0

E ricorda di controllare l'utilizzo della memoria. Utilizzare lo strumento "Monitoraggio attività" per vedere la differenza di utilizzo della memoria quando si utilizza la rasterizzazione. Probabilmente la memoria video aggiuntiva non verrà visualizzata in Allocations. Se l'aumento è troppo grande, dovresti provare a riciclare le visualizzazioni come ho detto, in modo che non ci siano troppe istanze in una sola volta. –