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

來源:互聯網
上載者:User

標籤:

非同步繪製

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 繪圖效率-非同步繪製

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.