W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
????寄宿圖可以通過Core Graphics直接繪制,也可以直接載入一個(gè)圖片文件并賦值給contents
屬性,或事先繪制一個(gè)屏幕之外的CGContext
上下文。在之前的兩章中我們討論了這些場景下的優(yōu)化。但是除了常見的顯式創(chuàng)建寄宿圖,你也可以通過以下三種方式創(chuàng)建隱式的:1,使用特性的圖層屬性。2,特定的視圖。3,特定的圖層子類。
????了解這個(gè)情況為什么發(fā)生何時(shí)發(fā)生是很重要的,它能夠讓你避免引入不必要的軟件繪制行為。
????CATextLayer
和UILabel
都是直接將文本繪制在圖層的寄宿圖中。事實(shí)上這兩種方式用了完全不同的渲染方式:在iOS 6及之前,UILabel
用WebKit的HTML渲染引擎來繪制文本,而CATextLayer
用的是Core Text.后者渲染更迅速,所以在所有需要繪制大量文本的情形下都優(yōu)先使用它吧。但是這兩種方法都用了軟件的方式繪制,因此他們實(shí)際上要比硬件加速合成方式要慢。
????不論如何,盡可能地避免改變那些包含文本的視圖的frame,因?yàn)檫@樣做的話文本就需要重繪。例如,如果你想在圖層的角落里顯示一段靜態(tài)的文本,但是這個(gè)圖層經(jīng)常改動,你就應(yīng)該把文本放在一個(gè)子圖層中。
????在第四章『視覺效果』中我們提到了CALayer
的shouldRasterize
屬性,它可以解決重疊透明圖層的混合失靈問題。同樣在第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)致了重繪行為)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: