標籤:
非同步繪製
UIKit的單線程天性意味著寄宿圖通暢要在主線程上更新,這意味著繪製會打斷使用者互動,甚至讓整個app看起來處於無響應狀態。我們對此無能為力,但是如果能避免使用者等待繪製完成就好多了。
針對這個問題,有一些方法可以用到:一些情況下,我們可以推測性地提前在另外一個線程上繪製內容,然後將由此繪出的圖片直接設定為圖層的內容。這實現起來可能不是很方便,但是在特定情況下是可行的。Core Animation提供了一些選擇:CATiledLayer和 drawsAsynchronously 屬性。
CATiledLayer
我們在第六章簡單探索了一下CATiledLayer。除了將圖層再次分割成獨立更新的小塊(類似於髒矩形自動更新的概念),CATiledLayer還有一個有趣的特性:在多個線程中為每個小塊同時調用-drawLayer:inContext:方法。這就避免了阻塞使用者互動而且能夠利用多核心新片來更快地繪製。只有一個小塊的CATiledLayer是實現非同步更新圖片視圖的簡單方法。
drawsAsynchronously
iOS 6中,蘋果為CALayer引入了這個令人好奇的屬性,drawsAsynchronously屬性對傳入 -drawLayer:inContext: 的CGContext進行改動,允許CGContext延緩繪製命令的執行以至於不阻塞使用者互動。
它與CATiledLayer使用的非同步繪製並不相同。它自己的 -drawLayer:inContext: 方法只會在主線程調用,但是CGContext並不等待每個繪製命令的結束。相反地,它會將命令排入佇列,當方法返回時,在後台線程逐個執行真正的繪製。
根據蘋果的說法。這個特性在需要頻繁重繪的視圖上效果最好(比如我們的繪圖應用,或者諸如UITableViewCell之類的),對那些只繪製一次或很少重繪的圖層內容來說沒什麼太大的協助。
總結
本章我們主要圍繞用Core Graphics軟體繪製討論了一些效能挑戰,然後探索了一些改進方法:比如提高繪製效能或者減少需要繪製的數量。
[iOS Animation]-CALayer 繪圖效率-非同步繪製