[iOS Animation]-CALayer 圖層性能一

圖層性能

要更快性能,也要作對正確的事情。 ——Stephen R. Coveygit

在第14章『圖像IO』討論如何高效地載入和顯示圖像,經過視圖來避免可能引發動畫幀率降低的性能問題。在最後一章,咱們將着重圖層樹自己,以發掘最好的性能。github

隱式繪製

寄宿圖能夠經過Core Graphics直接繪製,也能夠直接載入一個圖片文件並賦值給contents屬性,或事先繪製一個屏幕以外的CGContext上下文。在以前的兩章中咱們討論了這些場景下的優化。可是除了常見的顯式建立寄宿圖,你也能夠經過如下三種方式建立隱式的:1,使用特性的圖層屬性。2,特定的視圖。3,特定的圖層子類。緩存

瞭解這個狀況爲何發生什麼時候發生是很重要的,它可以讓你避免引入沒必要要的軟件繪製行爲。性能

文本

CATextLayerUILabel都是直接將文本繪製在圖層的寄宿圖中。事實上這兩種方式用了徹底不一樣的渲染方式:在iOS 6及以前,UILabel用WebKit的HTML渲染引擎來繪製文本,而CATextLayer用的是Core Text.後者渲染更迅速,因此在全部須要繪製大量文本的情形下都優先使用它吧。可是這兩種方法都用了軟件的方式繪製,所以他們實際上要比硬件加速合成方式要慢。優化

不論如何,儘量地避免改變那些包含文本的視圖的frame,由於這樣作的話文本就須要重繪。例如,若是你想在圖層的角落裏顯示一段靜態的文本,可是這個圖層常常改動,你就應該把文本放在一個子圖層中。動畫

光柵化

在第四章『視覺效果』中咱們提到了CALayershouldRasterize屬性,它能夠解決重疊透明圖層的混合失靈問題。一樣在第12章『速度的曲調』中,它也是做爲繪製複雜圖層樹結構的優化方法。spa

啓用 shouldRasterize 屬性會將圖層繪製到一個屏幕以外的圖像。而後這個圖像將會被緩存起來並繪製到實際圖層的contents和子圖層。若是有不少的子圖層或者有複雜的效果應用,這樣作就會比重繪全部事務的全部幀划得來得多。可是光柵化原始圖像須要時間,並且還會消耗額外的內存。code

當咱們使用得當時,光柵化能夠提供很大的性能優點(如你在第12章所見),可是必定要避免做用在內容不斷變更的圖層上,不然它緩存方面的好處就會消失,並且會讓性能變的更糟。orm

爲了檢測你是否正確地使用了光柵化方式,用Instrument查看一下Color Hits Green和Misses Red項目,是否已光柵化圖像被頻繁地刷新(這樣就說明圖層並非光柵化的好選擇,或則你無心間觸發了沒必要要的改變致使了重繪行爲)。圖片

離屏渲染

Offscreen rendering does not necessarily imply software drawing, but it means that the layer must first be rendered (either by the CPU or GPU) into an offscreen context before being displayed. The layer attributes that trigger offscreen rendering are as follows:

當圖層屬性的混合體被指定爲在未預合成以前不能直接在屏幕中繪製時,屏幕外渲染就被喚起了。屏幕外渲染並不意味着軟件繪製,可是它意味着圖層必須在被顯示以前在一個屏幕外上下文中被渲染(不論CPU仍是GPU)。圖層的如下屬性將會觸發屏幕外繪製:

  • 圓角(當和maskToBounds一塊兒使用時)

  • 圖層蒙板

  • 陰影

屏幕外渲染和咱們啓用光柵化時類似,除了它並無像光柵化圖層那麼消耗大,子圖層並無被影響到,並且結果也沒有被緩存,因此不會有長期的內存佔用。可是,若是太多圖層在屏幕外渲染依然會影響到性能。

有時候咱們能夠把那些須要屏幕外繪製的圖層開啓光柵化以做爲一個優化方式,前提是這些圖層並不會被頻繁地重繪。

對於那些須要動畫並且要在屏幕外渲染的圖層來講,你能夠用CAShapeLayercontentsCenter或者shadowPath來得到一樣的表現並且較少地影響到性能。

相關文章
相關標籤/搜索