一、圖片顯示

GPU 渲染 --> 數據存幀緩存區 --> 顯示控制器讀取幀緩存區數據(位圖,一幀幀讀取) --> 數模轉換(大學課程已忘記...) --> 逐行掃描、顯示


二、屏幕撕裂
1、撕裂原因
顯示的完美路程是:每掃描一張圖 --> 不斷刷新不斷掃描,一邊掃描、一邊讀取 --> 掃了最新的就正好顯示,數據實時。
但是,渲染過程中,CPU GPU 處理有一定的時間上的緩存,讀取時幀緩存區中仍是舊的數據 --> 那么讀取時則讀出老的數據 --> 顯示老數據 ---> 繼續掃描、數據更新 --> 再讀取時數據更新完成 --> 讀取到新數據 --> 進行顯示 ==》 導致上下顯示的分別是舊數據和新數據,進而圖片可能出現撕裂效果。下圖藍框,老舊數據圖片顯示異常。

2、屏幕撕裂解決方案
蘋果:垂直同步Vsync + 雙緩存區
垂直同步Vsync:幀緩存區加鎖,防止撕裂 --> 掃描過程中 必須把整個圖片掃完,不論新舊都掃完為止,使之察覺不到撕裂。
雙緩存區:撕裂原因 - CPU/GPU 計算時,是需要時間的 --> 雙緩存區 下圖流程

2個緩存區依次交替,從根本上解決撕裂。
三、掉幀
雙緩存區解決了撕裂(CPU/GPU 速度問題其實並未解決)。但是他引發了另一個問題 : 掉幀
接收 Vsync 信號,但若CPU/GPU 還沒處理完新的圖片數據 --> 幀緩存區拿不到數據 --> 重復渲染顯示同一幀數據 - 掉幀
解決掉幀:三緩存區(只要安卓使用了三緩存區,蘋果是雙緩存區) - CPU/GPU相對來說會有個閑置時間 --> 同樣是治標不治本,也是有可能出現掉幀。
撕裂的本質原因是 CPU/GPU 的計算能力跟不上幀率(60FPS),而蘋果的 vsync垂直信號和雙緩存區只是讓我們察覺不到撕裂,只是偶爾會察覺掉幀,並非真正完全解決了的問題,治標不治本,類似於打補丁。但是,現實使用中,我們也很少會遇到。例:超級復雜高清的多圖層疊加的動畫放在 phone4 上可能會比較容易察覺到這個問題。
掉幀,也是CPU GPU計算能力,計算跟不上,出現一個等待(重復顯示某幀)。
顯示一個簡單的 imageView 是不會出現撕裂or掉幀的,我們在iOS設備上看到撕裂的幾率極其小。
四、屏幕卡頓原因
1、CPU/GPU 流水線計算耗時長 --> 掉幀
2、垂直同步Vsync + 雙緩存區 強制同步,以掉幀為代價,解決屏幕撕裂
3、三緩存區只能更合理的使用CPU/GPU,減少掉幀次數,並不能完全解決
五、iOS下得渲染流程
Apple 官方:If you are writing iOS apps, you are using Core Animation whether you know it or not. And if you are writing OS X apps, you can take advantage of Core Animation with extremely little effort. Core Animation sits beneath AppKit and UIKit and is integrated tightly into the view workflows of Cocoa and Cocoa Touch. Of course, Core Animation also has interfaces that extend the capabilities exposed by your app’s views and give you more fine-grained control over your app’s animations.

核心動畫 CoreAnimation 渲染 (渲染流程 推薦博客:鏈接地址)
CoreAnimation:渲染、構建 和 實現動畫 -- Render, compose, and animate visual elements.

layer 和 view 區別(推薦博客中也有講解 贊):
view:1、繪制/動畫;2、布局/view管理3、交互事件的管理響應等 UIview 基於 UIlayer 的封裝的。APPKit/UIKit
layer:渲染/動畫。只負責顯示 -- 位圖
