日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

iOS离屏渲染的解释:渲染与cpu、gpu

發布時間:2024/8/26 综合教程 35 生活家
生活随笔 收集整理的這篇文章主要介紹了 iOS离屏渲染的解释:渲染与cpu、gpu 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

重開一個環境(內存、資源、上下文)來完成(部分)圖片的繪制

指的是GPU在當前屏幕緩沖區以外新開辟一個緩沖區進行渲染操作

意為離屏渲染,指的是GPU在當前屏幕緩沖區以外新開辟一個緩沖區進行渲染操作。

紅色代表GPU需要做額外的工作來渲染View,綠色代表GPU無需做額外的工作來處理bitmap

UIView和CALayer關系

UIView繼承自UIResponder,可以處理系統傳遞過來的事件,如:UIApplicationUIViewControllerUIView,以及所有從UIView派生出來的UIKit類。每個UIView內部都有一個CALayer提供內容的繪制和顯示,并且作為內部RootLayer的代理視圖。

CALayer繼承自NSObject類,負責顯示UIView提供的內容contentsCALayer有三個視覺元素:背景色、內容和邊框,其中,內容的本質是一個CGImage

界面渲染過程

RunLoop有一個60fps的回調,即每16.7ms繪制一次屏幕,所以view的繪制必須在這個時間內完成,view內容的繪制是CPU的工作,然后把繪制的內容交給GPU渲染,包括多個View的拼接(Compositing)、紋理的渲染(Texture)等等,最后顯示在屏幕上。但是,如果無法是16.7ms內完成繪制,就會出現丟幀的問題,一般情況下,如果幀率保證在30fps以上,界面卡頓效果不明顯,那么就需要在33.4ms內完成View的繪制,而低于這個幀率,就會產生卡頓的效果,影響體驗。

渲染的過程如下:

UIViewlayer層有一個content,指向一塊緩存,即backing store
UIView繪制時,會調用drawRect方法,通過context將數據寫入backing store
backing store寫完后,通過render server交給GPU去渲染,將backing store中的bitmap數據顯示在屏幕上

離屏渲染

在使用圓角、陰影和遮罩等視圖功能的時候,圖層屬性的混合體被指定為在未預合成之前不能直接在屏幕中繪制,所有就需要在屏幕外的上下文中渲染,即離屏渲染。

離屏渲染卡頓原因

離屏渲染之所以會特別消耗性能,是因為要創建一個屏幕外的緩沖區,然后從當屏緩沖區切換到屏幕外的緩沖區,然后再完成渲染;其中,創建緩沖區和切換上下文最消耗性能,而繪制其實不是性能損耗的主要原因。

設置了以下屬性時,就會觸發離屏繪制:

shouldRasterize(光柵化)
masks(遮罩)
shadows(陰影)
edge antialiasing(抗鋸齒)
group opacity(不透明)
復雜形狀設置圓角等
漸變

屏幕渲染類型

CPU計算好顯示內容提交到GPUGPU渲染完成后將渲染結果放入幀緩沖區,隨后視頻控制器會按照VSync信號逐行讀取幀緩沖區的數據,經過可能的數模轉換傳遞給顯示器顯示。

屏幕渲染有如下三種:

GPU中的屏幕渲染:

1、On-Screen Rendering

意為當前屏幕渲染,指的是GPU的渲染操作是在當前用于顯示的屏幕緩沖區中進行

2、Off-Screen Rendering

意為離屏渲染,指的是GPU在當前屏幕緩沖區以外新開辟一個緩沖區進行渲染操作

3、CPU中的離屏渲染(特殊離屏渲染,即不在GPU中的渲染)

如果我們重寫了drawRect方法,并且使用任何Core Graphics的技術進行了繪制操作,就涉及到了CPU渲染

CoreGraphic通常是線程安全的,所以可以進行異步繪制,顯示的時候再放回主線程

https://www.cnblogs.com/fishbay/p/7576176.html

為什么會使用離屏渲染

當使用圓角,陰影,遮罩的時候,圖層屬性的混合體被指定為在未預合成之前不能直接在屏幕中繪制,所以就需要屏幕外渲染被喚起。

屏幕外渲染并不意味著軟件繪制,但是它意味著圖層必須在被顯示之前在一個屏幕外上下文中被渲染(不論CPU還是GPU)。

所以當使用離屏渲染的時候會很容易造成性能消耗,因為在OPENGL里離屏渲染會單獨在內存中創建一個屏幕外緩沖區并進行渲染,而屏幕外緩沖區跟當前屏幕緩沖區上下文切換是很耗性能的。

作者:齊滇大圣
鏈接:https://www.jianshu.com/p/6d24a4c29e18
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。

一、概念理解

OpenGL中,GPU屏幕渲染有以下兩種方式:

○ On-Screen Rendering

意為當前屏幕渲染,指的是GPU的渲染操作是在當前用于顯示的屏幕緩沖區中進行。

○ Off-Screen Rendering

意為離屏渲染,指的是GPU在當前屏幕緩沖區以外新開辟一個緩沖區進行渲染操作。

二、離屏渲染的是是非非

相比于當前屏幕渲染,離屏渲染的代價是很高的,主要體現在兩個方面:

· 創建新緩沖區

要想進行離屏渲染,首先要創建一個新的緩沖區。

· 上下文切換

離屏渲染的整個過程,需要多次切換上下文環境:先是從當前屏幕(On-Screen)切換到離屏(Off-Screen);等到離屏渲染結束以后,將離屏緩沖區的渲染結果顯示到屏幕上有需要將上下文環境從離屏切換到當前屏幕。而上下文環境的切換是要付出很大代價的。

三、離屏渲染觸發方式

設置了以下屬性時,都會觸發離屏繪制:

· shouldRasterize(光柵化)

· masks(遮罩)

· shadows(陰影)

· edge antialiasing(抗鋸齒)

· group opacity(不透明)

需要注意的是,如果shouldRasterize被設置成YES,在觸發離屏繪制的同時,會將光柵化后的內容緩存起來,如果對應的layer及其sublayers沒有發生改變,在下一幀的時候可以直接復用。這將在很大程度上提升渲染性能。

而其它屬性如果是開啟的,就不會有緩存,離屏繪制會在每一幀都發生。

四、另一種特殊的“離屏渲染”

按照之前的說法,如果將不在GPU的當前屏幕緩沖區中進行的渲染都稱為離屏渲染,那么就還有另一種特殊的“離屏渲染”方式:CPU渲染。

如果我們重寫了drawRect方法,并且使用任何Core Graphics的技術進行了繪制操作,就涉及到了CPU渲染。整個渲染過程由CPU在App內同步地完成,渲染得到的bitmap最后再交由GPU用于顯示。

五、Instruments

Instruments的Core Animation工具中有幾個和離屏渲染相關的檢查選項:

· Color Offscreen-Rendered Yellow

開啟后會把那些需要離屏渲染的圖層高亮成黃色,這就意味著黃色圖層可能存在性能問題。

· Color Hits Green and Misses Red

如果shouldRasterize被設置成YES,對應的渲染結果會被緩存,如果圖層是綠色,就表示這些緩存被復用;如果是紅色就表示緩存會被重復創建,這就表示該處存在性能問題了。

六、如何抉擇

現在擺在我們面前得有三個選擇:當前屏幕渲染、離屏渲染、CPU渲染,該用哪個呢?這需要根據具體的使用場景來決定。

· 盡量使用當前屏幕渲染

鑒于離屏渲染、CPU渲染可能帶來的性能問題,一般情況下,我們要盡量使用當前屏幕渲染。

· 離屏渲染 VS CPU渲染

由于GPU的浮點運算能力比CPU強,CPU渲染的效率可能不如離屏渲染;但如果僅僅是實現一個簡單的效果,直接使用CPU渲染的效率又可能比離屏渲染好,畢竟離屏渲染要涉及到緩沖區創建和上下文切換等耗時操作。

總之,具體的選擇應該由性能測試結果來決定。

七、寫在最后

在趙巖同學的點撥下才理解了離屏渲染的概念,在此表示感謝!

如理解有誤還請大家指出。

http://imgtec.eetrend.com/d6-imgtec/blog/2018-08/17019.html

在第一章的1.2節中有提到渲染的流程圖,我們再更深入點,先看看最基本的渲染通道流程:

引自WWDC2014 #419 Advanced Graphics and Animations for iOS Apps

注:iOS的GPU渲染機制是Tile-Based的,而Tile-BasedGPU也是現在移動設備的主流;

我們再來看看需要Offscreen Render的渲染通道流程:

引自WWDC2014 #419 Advanced Graphics and Animations for iOS Apps

一般情況下,OpenGL會將應用提交到Render Server的動畫直接渲染顯示(基本的Tile-Based渲染流程),但對于一些復雜的圖像動畫的渲染并不能直接渲染疊加顯示,而是需要根據Command Buffer分通道進行渲染之后再組合,這一組合過程中,就有些渲染通道是不會直接顯示的;對比基本渲染通道流程和Masking渲染通道流程圖,我們可以看到到Masking渲染需要更多渲染通道和合并的步驟;而這些沒有直接顯示在屏幕的上的通道(如上圖的 Pass 1 和 Pass 2)就是Offscreen Rendering Pass。

Offscreen Render為什么卡頓,從上圖我們就可以知道,Offscreen Render需要更多的渲染通道,而且不同的渲染通道間切換需要耗費一定的時間,這個時間內GPU會閑置,當通道達到一定數量,對性能也會有較大的影響;

那哪些情況會Offscreen Render呢?

1)drawRect
2)layer.shouldRasterize=true;
3)有mask或者是陰影(layer.masksToBounds,layer.shadow*);
4)Text(UILabel,CATextLayer,CoreText,etc)
...

注:layer.cornerRadius,layer.borderWidth,layer.borderColor并不會Offscreen Render,因為這些不需要加入Mask。

還有更多與Offscreen Render以及動畫圖形優化相關的知識,請認真觀看WWDC。

參考:

WWDC2011 #121 Understanding UIKit Rendering

WWDC2014 #419 Advanced Graphics and Animations for iOS Apps

http://oncenote.com/2015/12/08/How-to-build-UI/

總結

以上是生活随笔為你收集整理的iOS离屏渲染的解释:渲染与cpu、gpu的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。