[iOS Animation]-CALayer 繪圖效率-異步繪製

異步繪製

UIKit的單線程天性意味着寄宿圖通暢要在主線程上更新,這意味着繪製會打斷用戶交互,甚至讓整個app看起來處於無響應狀態。咱們對此無能爲力,可是若是能避免用戶等待繪製完成就好多了。git

針對這個問題,有一些方法能夠用到:一些狀況下,咱們能夠推測性地提早在另一個線程上繪製內容,而後將由此繪出的圖片直接設置爲圖層的內容。這實現起來可能不是很方便,可是在特定狀況下是可行的。Core Animation提供了一些選擇:CATiledLayer和 drawsAsynchronously 屬性。github

CATiledLayer

咱們在第六章簡單探索了一下CATiledLayer。除了將圖層再次分割成獨立更新的小塊(相似於髒矩形自動更新的概念),CATiledLayer還有一個有趣的特性:在多個線程中爲每一個小塊同時調用-drawLayer:inContext:方法。這就避免了阻塞用戶交互並且可以利用多核心新片來更快地繪製。只有一個小塊的CATiledLayer是實現異步更新圖片視圖的簡單方法。app

drawsAsynchronously

iOS 6中,蘋果爲CALayer引入了這個使人好奇的屬性,drawsAsynchronously屬性對傳入 -drawLayer:inContext: 的CGContext進行改動,容許CGContext延緩繪製命令的執行以致於不阻塞用戶交互。異步

它與CATiledLayer使用的異步繪製並不相同。它本身的 -drawLayer:inContext: 方法只會在主線程調用,可是CGContext並不等待每一個繪製命令的結束。相反地,它會將命令加入隊列,當方法返回時,在後臺線程逐個執行真正的繪製。async

根據蘋果的說法。這個特性在須要頻繁重繪的視圖上效果最好(好比咱們的繪圖應用,或者諸如UITableViewCell之類的),對那些只繪製一次或不多重繪的圖層內容來講沒什麼太大的幫助。性能

總結

本章咱們主要圍繞用Core Graphics軟件繪製討論了一些性能挑戰,而後探索了一些改進方法:好比提升繪製性能或者減小須要繪製的數量。spa

相關文章
相關標籤/搜索