歡迎光臨
每天分享高質量文章

iOS影象顯示原理

作者:SuperBoy_Timmy

連結:https://www.jianshu.com/p/4008ec3cacaa

析構圖顯示:

影象顯示各元件分工:

 

  • ~ CPU:計算檢視frame,圖片解碼,繪製紋理交給GPU。

  • ~ GPU:紋理混合,頂點變換,渲染到幀緩衝區。

  • ~ 時鐘訊號:垂直同步訊號V-Sync / 水平同步訊號H-Sync。

  • ~ iOS裝置雙緩衝機制:前/後幀緩衝區。

  • ~ CRT:陰極電子槍發射電子,在陰極高電壓的作用下,電子由電子槍射向熒光屏,使熒光粉發光,將影象顯示在螢幕上。採用時鐘訊號控制。

  • ~ LCD:光學成像原理)在不加電壓的情況下,光線會沿著液晶分子的間隙前進旋轉90°,光可以透過。在 加入電壓後,光沿著液晶分子的間隙直線前進,被濾光板擋住。

  • ~ 註:LCD的成像原理與CRT截然不同,每一個畫素的顏色在需要改變時才去改變電壓,但扔需要按照一定的掃清頻率向GPU獲取新的影象用於顯示。

 

影象撕裂原因分析

 

  • 影象撕裂:當影片控制器還未讀取完成時,GPU將新的一幀內容提交到幀緩衝區並把兩個幀緩衝區進行更新後,影片控制器就會把新的一幀資料的下半段顯示到螢幕上,造成畫面撕裂的現象。

  • 解決方案:垂直同步機制

  • 弊端:GPU會等待顯示的V-Sync訊號發出後,才進行新的一幀渲染和快取區更新。能解決畫面撕裂現象,也增加了畫面流暢度,但需要消耗更多的計算資源,由此可能導致卡頓。

 

 

離屏渲染與光柵化

 

  • 離屏渲染:CPU渲染及非GPU緩衝區的渲染統稱為離屏渲染。

  • 離屏渲染的觸發:CoreGraphics的背景關係繪製,drawRect繪製,layer圓角/邊框/陰影/抗鋸齒/光柵化(shouldRasterize置為YES)等。

  • 離屏渲染的檢測:Instruments的CoreAnimation工具動態監測。(使用方法:Color Offscreen –Rendered Yellow :開啟後會把那些需要離屏渲染的圖層高亮成黃色,黃色圖層可能存在效能問題。)

  • 光柵化簡介:隱式建立一個點陣圖,各種陰影遮罩等效果也會儲存到點陣圖中快取起來,從而減少渲染的頻度,把GPU的操作轉到CPU上,生成點陣圖快取,直接讀取呼叫。(註:對於經常變動的內容,不要開啟光柵化,防止效能浪費,如Cell的復用)

  • 光柵化的檢測:Color Hits Green and Misses Red 開啟後,若shouldRasterize設定為YES,對應的渲染結果會快取,如果圖層是綠色,表示快取被覆用;如果是紅色,就表示快取被重覆建立,可能存在效能問題。

  • GPU快取區渲染優勢:為影象顯示做了高度最佳化,速度較快。

 

卡頓原因分析

 

 

大體有三種原因:

 

1、UI渲染需要時間較長,無法按時提交結果。

2、一些需要密集計算的處理放在了主執行緒中執行,導致主執行緒被阻塞,無法渲染UI介面。

3、網路請求由於網路狀態的問題響應較慢,UI層由於沒有模型傳回無法渲染。

 

CPU資源消耗分析

 

1、物件建立:物件的建立會分配記憶體、調整屬性、甚至還有讀取檔案等操作,比較消耗CPU資源。儘量採取輕量級物件,儘量放到後臺執行緒處理,儘量推遲物件的建立時間。(如UIView / CALayer)

2、物件調整:frame、bounds、transform及檢視層次等屬性調整很耗費CPU資源。儘量減少不必要屬性的修改,儘量避免調整檢視層次、新增和移除檢視。

3、佈局計算:隨著檢視數量的增長,Autolayout帶來的CPU消耗會呈指數級增長,所以儘量提前算好佈局,在需要時一次性調整好對應屬性。

4、文字渲染:螢幕上能看到的所有文字內容控制元件,包括UIWebView,在底層都是透過CoreText排版、繪製為點陣圖顯示的。常見的文字控制元件,其排版與繪製都是在主執行緒進行的,顯示大量文字是,CPU壓力很大。對此解決方案唯一就是自定義文字控制元件,用CoreText對文字非同步繪製。(很麻煩,開發成本高)

5、圖片解碼:當用UIImage或CGImageSource建立圖片時,圖片資料並不會立刻解碼。圖片設定到UIImageView或CALayer.contents中去,並且CALayer被提交到GPU前,CGImage中的資料才會得到解碼。這一步是發生在主執行緒的,並且不可避免。SD_WebImage處理方式:在後臺執行緒先把圖片繪製到CGBitmapContext中,然後從Bitmap直接建立圖片。

6、影象繪製:影象的繪製通常是指用那些以CG開頭的方法把影象繪製到畫布中,然後從畫布建立圖片並顯示的一個過程。CoreGraphics方法是執行緒安全的,可以非同步繪製,主執行緒回呼。

 

GPU資源消耗分析

 

  • 紋理混合:儘量減少短時間內大量圖片的顯示,盡可能將多張圖片合成一張進行顯示。

  • 檢視混合:儘量減少檢視層次和數量,併在不透明的檢視裡標明opaque屬性以避免無用的Alpha通道合成。

  • 圖形生成:儘量避免離屏渲染,儘量採用非同步繪製,儘量避免使用圓角、陰影、遮罩等屬性。必要時用靜態圖片實現展示效果,也可嘗試光柵化快取復用屬性。

Instruments 卡頓監測

Time Profiler ->Call Tree Options :

 

1、Separete By Thread :按執行緒劃分

2、Invert Call Tree :逆向呼叫樹,方便檢視呼叫順序

3、Hide System Libraries:隱藏系統庫

 

Core Animation ->Debug Options:

 

1、Color Blended Layers:監測圖層混合情況,沒有混合的部分為綠色,混合最嚴重的部分是紅色,大量圖層混合會消耗GPU的時間。

2、Color Copied Images:監測圖片顏色格式,如果GPU不支援當前圖片的顏色格式,會將其交給CPU預先進行格式轉化,並且這張圖片被標記為藍色。(Apple 的 GPU值解析32bit的顏色格式,RGBA)

3、Color Immediately :設定除錯顏色每幀更新。(一般不用)

4、Color Compositing-Fast-Path Blue :對任何直接使用OpenGL繪製的圖層高亮。

5、Flash Updated Regions :對重繪的內容高亮成黃色。(使用Core Graphics繪製的圖層)

6、Color Hits Green and Misses Red :光柵化監測,前面已述。

7、Color Offscreen-Renderded Yellow :離屏渲染監測,前面已述。

8、Color Non-Standard Surface Formats:Apple 檔案沒註解(一般不用)

 


編號322,輸入編號直達本文

●輸入m獲取文章目錄

推薦↓↓↓

 

Web開發

更多推薦18個技術類微信公眾號

涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

    贊(0)

    分享創造快樂