15.1 隱式繪制

2018-02-24 15:07 更新

隱式繪制

????寄宿圖可以通過Core Graphics直接繪制,也可以直接載入一個(gè)圖片文件并賦值給contents屬性,或事先繪制一個(gè)屏幕之外的CGContext上下文。在之前的兩章中我們討論了這些場景下的優(yōu)化。但是除了常見的顯式創(chuàng)建寄宿圖,你也可以通過以下三種方式創(chuàng)建隱式的:1,使用特性的圖層屬性。2,特定的視圖。3,特定的圖層子類。

????了解這個(gè)情況為什么發(fā)生何時(shí)發(fā)生是很重要的,它能夠讓你避免引入不必要的軟件繪制行為。

文本

????CATextLayerUILabel都是直接將文本繪制在圖層的寄宿圖中。事實(shí)上這兩種方式用了完全不同的渲染方式:在iOS 6及之前,UILabel用WebKit的HTML渲染引擎來繪制文本,而CATextLayer用的是Core Text.后者渲染更迅速,所以在所有需要繪制大量文本的情形下都優(yōu)先使用它吧。但是這兩種方法都用了軟件的方式繪制,因此他們實(shí)際上要比硬件加速合成方式要慢。

????不論如何,盡可能地避免改變那些包含文本的視圖的frame,因?yàn)檫@樣做的話文本就需要重繪。例如,如果你想在圖層的角落里顯示一段靜態(tài)的文本,但是這個(gè)圖層經(jīng)常改動,你就應(yīng)該把文本放在一個(gè)子圖層中。

光柵化

????在第四章『視覺效果』中我們提到了CALayershouldRasterize屬性,它可以解決重疊透明圖層的混合失靈問題。同樣在第12章『速度的曲調(diào)』中,它也是作為繪制復(fù)雜圖層樹結(jié)構(gòu)的優(yōu)化方法。

????啟用shouldRasterize屬性會將圖層繪制到一個(gè)屏幕之外的圖像。然后這個(gè)圖像將會被緩存起來并繪制到實(shí)際圖層的contents和子圖層。如果有很多的子圖層或者有復(fù)雜的效果應(yīng)用,這樣做就會比重繪所有事務(wù)的所有幀劃得來得多。但是光柵化原始圖像需要時(shí)間,而且還會消耗額外的內(nèi)存。

????當(dāng)我們使用得當(dāng)時(shí),光柵化可以提供很大的性能優(yōu)勢(如你在第12章所見),但是一定要避免作用在內(nèi)容不斷變動的圖層上,否則它緩存方面的好處就會消失,而且會讓性能變的更糟。

????為了檢測你是否正確地使用了光柵化方式,用Instrument查看一下Color Hits Green和Misses Red項(xiàng)目,是否已光柵化圖像被頻繁地刷新(這樣就說明圖層并不是光柵化的好選擇,或則你無意間觸發(fā)了不必要的改變導(dǎo)致了重繪行為)。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號