2011-10-21 8 views
12

Il blending e il rendering offscreen sono entrambi costosi in Core Animation.Miscelazione V.S. offscreen-rendering, che è peggio per le prestazioni di animazione core?

Uno può vederli in strumento Core Animation in Strumenti, Opzioni con Debug: Instruments

Ecco il mio caso:

display 50x50 immagini PNG su UIImageViews. Voglio arrotondare le immagini con un raggio di corer a 6 punti. Il primo metodo consiste nell'impostare l'angolo di UIImageView.layerRadius e masksToBounds che causa il rendering offscreen. Il secondo metodo consiste nel fare copie di immagini PNG con angoli trasparenti che causano la fusione (a causa del canale alfa).

Ho provato entrambi, ma non vedo differenze di prestazioni significative. Tuttavia, voglio ancora sapere qual è la cosa peggiore in teoria e le migliori pratiche, se ce ne sono.

Grazie mille!

risposta

8

Bene, risposta breve, la miscelazione deve avvenire in entrambi i modi per visualizzare correttamente i pixel angolari trasparenti. Tuttavia, in genere questo dovrebbe essere un problema se si desidera che anche la vista risultante si animi in qualche modo (e ricorda, lo scorrimento è il tipo più comune di animazione). Inoltre, sono in grado di ricreare situazioni in cui "cornerRadius" causerà errori di rendering su dispositivi meno recenti (iPhone 3G nel mio caso) quando le mie visualizzazioni diventano complesse. Per le situazioni in cui hai bisogno di animazioni performanti, ecco le raccomandazioni che seguo.

Innanzitutto, se per le curve arrotondate sono necessarie solo le risorse con una singola curva (le diverse scale vanno bene, purché la curvatura desiderata sia la stessa), salvarle in questo modo per evitare il calcolo extra di "cornerRadius" in fase di esecuzione.

In secondo luogo, non utilizzare la trasparenza ovunque non sia necessario (ad esempio quando lo sfondo è effettivamente un colore solido) e specificare sempre il valore corretto per la proprietà "opaque" per aiutare il sistema a calcolare in modo più efficiente il disegno.

In terzo luogo, trovare modi per ridurre al minimo le dimensioni delle viste trasparenti. Ad esempio, per una vista di grandi dimensioni con elementi trasparenti (ad es. Angoli arrotondati), considera la suddivisione della vista in 3 parti (superiore, centrale, inferiore) o 7 (4 angoli, medio superiore, medio inferiore), mantenendo le parti trasparenti il più piccolo possibile e segna le parti rettangolari come opache, con sfondi solidi.

In quarto luogo, nelle situazioni in cui si sta disegnando molto testo in scrollView (ad esempio UITableViewCell altamente personalizzato), considerare l'utilizzo del metodo "drawRect:" per rendere queste porzioni più efficienti. Continuare a utilizzare le sottoview per gli elementi dell'immagine, in modo da dividere il tempo di rendering tra la vista complessiva tra disegno preliminare (sottoview) e disegno "just-in-time" (drawRect :). Ovviamente, la sperimentazione (fotogrammi al secondo durante lo scorrimento) potrebbe dimostrare che violare questa "regola del pollice" potrebbe essere ottimale per le tue viste particolari.

Infine, è fondamentale avere un sacco di tempo per provare a utilizzare gli strumenti di profilazione (in particolare CoreAnimation). Trovo che sia più facile vedere i miglioramenti utilizzando il dispositivo più lento che desideri utilizzare come target e i risultati sembrano grandiosi sui nuovi dispositivi.

4

Dopo aver guardato video WWDC e aver avuto alcuni esperimenti con Xcode e Instruments, posso dire che la fusione è meglio del rendering offscreen. Blending significa che il sistema richiede un tempo aggiuntivo per calcolare il colore dei pixel sui livelli trasparenti. Più strati trasparenti hai (e dimensioni maggiori di questi livelli), quindi la fusione richiede più tempo.

Il rendering fuori schermo significa che il sistema eseguirà più di una iterazione di rendering. All'inizio il sistema di iterazione renderà il rendering senza visualizzazione solo per calcolare i limiti e la forma dell'area che dovrebbe essere resa. Nel prossimo sistema di iterazioni viene eseguito il rendering regolare (dipende dalla forma calcolata) inclusa la miscelazione, se necessario.

Anche per il sistema di rendering offscreen crea un contesto grafico separato e lo distrugge dopo il rendering.

Così si dovrebbe evitare il rendering offscreen ed è meglio sostituirlo con il blending.

Problemi correlati