[iOS Animation]-CALayer 性能優化二

Instruments

Instruments是Xcode套件中沒有被充分利用的一個工具。不少iOS開發者從沒用過Instruments,或者只是用Leaks工具檢測循環引用。實際上有不少Instruments工具,包括爲動畫性能調優的東西。git

你能夠經過在菜單中選擇Profile選項來打開Instruments(在這以前,記住要把目標設置成iOS設備,而不是模擬器)。而後將會顯示出圖12.1(若是沒有看到全部選項,你可能設置成了模擬器選項)。github

圖12.1

圖12.1 Instruments工具選項窗口緩存

就像以前提到的那樣,你應該始終將程序設置成發佈選項。幸運的是,配置文件默認就是發佈選項,因此你不須要在分析的時候調整編譯策略。服務器

咱們將討論以下幾個工具:多線程

  • 時間分析器 - 用來測量被方法/函數打斷的CPU使用狀況。框架

  • Core Animation - 用來調試各類Core Animation性能問題。函數

  • OpenGL ES驅動 - 用來調試GPU性能問題。這個工具在編寫Open GL代碼的時候頗有用,但有時也用來處理Core Animation的工做。工具

Instruments的一個很棒的功能在於它能夠建立咱們自定義的工具集。除了你初始選擇的工具以外,若是在Instruments中打開Library窗口,你能夠拖拽別的工具到左側邊欄。咱們將建立以上咱們提到的三個工具,而後就能夠並行使用了(見圖12.2)。性能

圖12.2

圖12.2 添加額外的工具到Instruments側邊欄測試

時間分析器

時間分析器工具用來檢測CPU的使用狀況。它能夠告訴咱們程序中的哪一個方法正在消耗大量的CPU時間。使用大量的CPU並不必定是個問題 - 你可能指望動畫路徑對CPU很是依賴,由於動畫每每是iOS設備中最苛刻的任務。

可是若是你有性能問題,查看CPU時間對於判斷性能是否是和CPU相關,以及定位到函數都頗有幫助(見圖12.3)。

圖12.3

圖12.3 時間分析器工具

時間分析器有一些選項來幫助咱們定位到咱們關心的的方法。可使用左側的複選框來打開。其中最有用的是以下幾點:

  • 經過線程分離 - 這能夠經過執行的線程進行分組。若是代碼被多線程分離的話,那麼就能夠判斷究竟是哪一個線程形成了問題。

  • 隱藏系統庫 - 能夠隱藏全部蘋果的框架代碼,來幫助咱們尋找哪一段代碼形成了性能瓶頸。因爲咱們不能優化框架方法,因此這對定位到咱們能實際修復的代碼頗有用。

  • 只顯示Obj-C代碼 - 隱藏除了Objective-C以外的全部代碼。大多數內部的Core Animation代碼都是用C或者C++函數,因此這對咱們集中精力到咱們代碼中顯式調用的方法就頗有用。

Core Animation

Core Animation工具用來監測Core Animation性能。它給咱們提供了週期性的FPS,而且考慮到了發生在程序以外的動畫(見圖12.4)。

圖12.4

圖12.4 使用可視化調試選項的Core Animation工具

Core Animation工具也提供了一系列複選框選項來幫助調試渲染瓶頸:

  • Color Blended Layers - 這個選項基於渲染程度對屏幕中的混合區域進行綠到紅的高亮(也就是多個半透明圖層的疊加)。因爲重繪的緣由,混合對GPU性能會有影響,同時也是滑動或者動畫幀率降低的罪魁禍首之一。

  • ColorHitsGreenandMissesRed - 當使用shouldRasterizep屬性的時候,耗時的圖層繪製會被緩存,而後當作一個簡單的扁平圖片呈現。當緩存再生的時候這個選項就用紅色對柵格化圖層進行了高亮。若是緩存頻繁再生的話,就意味着柵格化可能會有負面的性能影響了(更多關於使用shouldRasterize的細節見第15章「圖層性能」)。

  • Color Copied Images - 有時候寄宿圖片的生成意味着Core Animation被強制生成一些圖片,而後發送到渲染服務器,而不是簡單的指向原始指針。這個選項把這些圖片渲染成藍色。複製圖片對內存和CPU使用來講都是一項很是昂貴的操做,因此應該儘量的避免。

  • Color Immediately - 一般Core Animation Instruments以每毫秒10次的頻率更新圖層調試顏色。對某些效果來講,這顯然太慢了。這個選項就能夠用來設置每幀都更新(可能會影響到渲染性能,並且會致使幀率測量不許,因此不要一直都設置它)。

  • Color Misaligned Images - 這裏會高亮那些被縮放或者拉伸以及沒有正確對齊到像素邊界的圖片(也就是非整型座標)。這些中的大多數一般都會致使圖片的不正常縮放,若是把一張大圖當縮略圖顯示,或者不正確地模糊圖像,那麼這個選項將會幫你識別出問題所在。

  • Color Offscreen-Rendered Yellow - 這裏會把那些須要離屏渲染的圖層高亮成黃色。這些圖層極可能須要用shadowPath或者shouldRasterize來優化。

  • Color OpenGL Fast Path Blue - 這個選項會對任何直接使用OpenGL繪製的圖層進行高亮。若是僅僅使用UIKit或者Core Animation的API,那麼不會有任何效果。若是使用GLKView或者CAEAGLLayer,那若是不顯示藍色塊的話就意味着你正在強制CPU渲染額外的紋理,而不是繪製到屏幕。

  • Flash Updated Regions - 這個選項會對重繪的內容高亮成黃色(也就是任何在軟件層面使用Core Graphics繪製的圖層)。這種繪圖的速度很慢。若是頻繁發生這種狀況的話,這意味着有一個隱藏的bug或者說經過增長緩存或者使用替代方案會有提高性能的空間。

這些高亮圖層的選項一樣在iOS模擬器的調試菜單也可用(圖12.5)。咱們以前說過用模擬器測試性能並很差,但若是你能經過這些高亮選項識別出性能問題出在什麼地方的話,那麼使用iOS模擬器來驗證問題是否解決也是比真機測試更有效的。

圖12.5

圖12.5 iOS模擬器中Core Animation可視化調試選項

OpenGL ES驅動

OpenGL ES驅動工具能夠幫你測量GPU的利用率,一樣也是一個很好的來判斷和GPU相關動畫性能的指示器。它一樣也提供了相似Core Animation那樣顯示FPS的工具(圖12.6)。

圖12.6

圖12.6 OpenGL ES驅動工具

側欄的郵編是一系列有用的工具。其中和Core Animation性能最相關的是以下幾點:

  • Renderer Utilization - 若是這個值超過了~50%,就意味着你的動畫可能對幀率有所限制,極可能由於離屏渲染或者是重繪致使的過分混合。

  • Tiler Utilization - 若是這個值超過了~50%,就意味着你的動畫可能限制於幾何結構方面,也就是在屏幕上有太多的圖層佔用了。

相關文章
相關標籤/搜索