# 測量,而不是猜測
????于是現在你知道有哪些點可能會影響動畫性能,那該如何修復呢?好吧,其實不需要。有很多種詭計來優化動畫,但如果盲目使用的話,可能會造成更多性能上的問題,而不是修復。
????如何正確的測量而不是猜測這點很重要。根據性能相關的知識寫出代碼不同于倉促的優化。前者很好,后者實際上就是在浪費時間。
????那該如何測量呢?第一步就是確保在真實環境下測試你的程序。
## 真機測試,而不是模擬器
????當你開始做一些性能方面的工作時,一定要在真機上測試,而不是模擬器。模擬器雖然是加快開發效率的一把利器,但它不能提供準確的真機性能參數。
????模擬器運行在你的Mac上,然而Mac上的CPU往往比iOS設備要快。相反,Mac上的GPU和iOS設備的完全不一樣,模擬器不得已要在軟件層面(CPU)模擬設備的GPU,這意味著GPU相關的操作在模擬器上運行的更慢,尤其是使用`CAEAGLLayer`來寫一些OpenGL的代碼時候。
????這就是說在模擬器上的測試出的性能會高度失真。如果動畫在模擬器上運行流暢,可能在真機上十分糟糕。如果在模擬器上運行的很卡,也可能在真機上很平滑。你無法確定。
????另一件重要的事情就是性能測試一定要用*發布*配置,而不是調試模式。因為當用發布環境打包的時候,編譯器會引入一系列提高性能的優化,例如去掉調試符號或者移除并重新組織代碼。你也可以自己做到這些,例如在發布環境禁用NSLog語句。你只關心發布性能,那才是你需要測試的點。
????最后,最好在你支持的設備中性能最差的設備上測試:如果基于iOS6開發,這意味著最好在iPhone 3GS或者iPad2上測試。如果可能的話,測試不同的設備和iOS版本,因為蘋果在不同的iOS版本和設備中做了一些改變,這也可能影響到一些性能。例如iPad3明顯要在動畫渲染上比iPad2慢很多,因為渲染4倍多的像素點(為了支持視網膜顯示)。
## 保持一致的幀率
????為了做到動畫的平滑,你需要以60FPS(幀每秒)的速度運行,以同步屏幕刷新速率。通過基于`NSTimer`或者`CADisplayLink`的動畫你可以降低到30FPS,而且效果還不錯,但是沒辦法通過Core Animation做到這點。如果不保持60FPS的速率,就可能隨機丟幀,影響到體驗。
????你可以在使用的過程中明顯感到有沒有丟幀,但沒辦法通過肉眼來得到具體的數據,也沒法知道你的做法有沒有真的提高性能。你需要的是一系列精確的數據。
????你可以在程序中用`CADisplayLink`來測量幀率(就像11章“基于定時器的動畫”中那樣),然后在屏幕上顯示出來,但應用內的FPS顯示并不能夠完全真實測量出Core Animation性能,因為它僅僅測出應用內的幀率。我們知道很多動畫都在應用之外發生(在渲染服務器進程中處理),但同時應用內FPS計數的確可以對某些性能問題提供參考,一旦找出一個問題的地方,你就需要得到更多精確詳細的數據來定位到問題所在。蘋果提供了一個強大的*Instruments*工具集來幫我們做到這些。
- Introduction
- 1. 圖層樹
- 1.1 圖層與視圖
- 1.2 圖層的能力
- 1.3 使用圖層
- 1.4 總結
- 2. 寄宿圖
- 2.1 contents屬性
- 2.2 Custom Drawing
- 2.3 總結
- 3. 圖層幾何學
- 3.1 布局
- 3.2 錨點
- 3.3 坐標系
- 3.4 Hit Testing
- 3.5 自動布局
- 3.6 總結
- 4. 視覺效果
- 4.1 圓角
- 4.2 圖層邊框
- 4.3 陰影
- 4.4 圖層蒙板
- 4.5 拉伸過濾
- 4.6 組透明
- 4.7 總結
- 5. 變換
- 5.1 仿射變換
- 5.2 3D變換
- 5.3 固體對象
- 5.4 總結
- 6. 專用圖層
- 6.1 CAShapeLayer
- 6.2 CATextLayer
- 6.3 CATransformLayer
- 6.4 CAGradientLayer
- 6.5 CAReplicatorLayer
- 6.6 CAScrollLayer
- 6.7 CATiledLayer
- 6.8 CAEmitterLayer
- 6.9 CAEAGLLayer
- 6.10 AVPlayerLayer
- 6.11 總結
- 7. 隱式動畫
- 7.1 事務
- 7.2 完成塊
- 7.3 圖層行為
- 7.4 呈現與模型
- 7.5 總結
- 8. 顯式動畫
- 8.1 屬性動畫
- 8.2 動畫組
- 8.3 過渡
- 8.4 在動畫過程中取消動畫
- 8.5 總結
- 9. 圖層時間
- 9.1 CAMediaTiming協議
- 9.2 層級關系時間
- 9.3 手動動畫
- 9.4 總結
- 10. 緩沖
- 10.1 動畫速度
- 10.2 自定義緩沖函數
- 10.3 總結
- 11. 基于定時器的動畫
- 11.1 定時幀
- 11.2 物理模擬
- 12. 性能調優
- 12.1. CPU VS GPU
- 12.2 測量,而不是猜測
- 12.3 Instruments
- 12.4 總結
- 13. 高效繪圖
- 13.1 軟件繪圖
- 13.2 矢量圖形
- 13.3 臟矩形
- 13.4 異步繪制
- 13.5 總結
- 14. 圖像IO
- 14.1 加載和潛伏
- 14.2 緩存
- 14.3 文件格式
- 14.4 總結
- 15. 圖層性能
- 15.1 隱式繪制
- 15.2 離屏渲染
- 15.3 混合和過度繪制
- 15.4 減少圖層數量
- 15.5 總結