图形学进阶——移动端TB(D)R架构基础
移動端TB(D)R架構基礎
百人計劃學習鏈接:【技術美術百人計劃】圖形 3.7 移動端TB(D)R架構基礎
一、當前移動端的設備概況
1. 移動端CPU占比
2. 移動端GPU占比
3. 各類電子設備功耗對比
4. 帶寬比較
二、專有名詞解釋
1. SOC(System on Chip)
System on Chip(Soc)Soc是把CPU、GPU、內存、通信基帶、GPS模塊等等整合在一起的芯片稱呼。
常見有A系Soc(蘋果),驍龍Soc(高通),麒麟Soc(華為),聯發科Soc,獵戶座Soc(三星),去年蘋果推出的M系Soc,暫用于Mac,但這說明手機、筆記本和PC的通用芯片已經出現了
2. 物理內存(System Memory)
Soc中GPU和CPU共用一塊片內LPDDR物理內存,就是我們常說的手機內存,也叫System Memory,大概幾個G。
此外CPU和GPU還分別有自己的高速SRAM的Cache緩存,也叫On-chip Memory,一般幾百K~幾M。
不同距離的內存訪問存在不同的時間消耗,距離越近消耗越低,讀取System Memory的時間消耗大概是On-chip Memory的幾倍到幾十倍。
PS:手機上GPU和CPU是共享一個內存地址空間(PC上一般分為內存和顯存)
3 .On-Chip Buffer
在TB(D)R架構下會存儲Tile的顏色、深度和模板緩沖,讀寫修改都非常快。
如果Load/Store指令中緩沖需要被Preserve,將會被寫入一份到System Memory中。
4 .Stall
當一個GPU核心的兩次計算結果之間有依賴關系而必須串行時,等待的過程便是Stall。
5.FillRate 像素填充率
像素填充率 = ROP運行的時鐘頻率 x ROP的個數 x 每個時鐘ROP可以處理的像素個數
三、關于TBDR
什么是TBDR?
TBR(Tile-Based (Deferred) Rendering)是目前主流的移動GPU渲染架構,對應一般PC上的GPU渲染架構則是IMR(Immediate Mode Rendering )。
通俗的講就是:屏幕被分成很多塊進行渲染
TBR和TBDR的區別
- TBR :頂點著色器——》Defer———》光柵化——》像素著色器
- TBDR :頂點著色器——》Defer———》光柵化——》Defer——》像素著色器
什么是Defer?
從字面上理解就是延遲(處理);從渲染數據的角度上看,Defer是批處理一幀中的多個數據(后面詳細有講)
四、關于IMR
沒有Defer的操作:用戶數據——》頂點著色器———》光柵化——》片段著色器
渲染管線如下:直接和系統內存進行交互
五、TB(D)R詳細的渲染流程
1. TB(D)R宏觀上總共分2個階段
簡單的說:
- 第一步:將分圖元到對于的塊上,確定Tile上的圖元有哪些
- 第二步:在片元著色器計算后先將結果寫到塊內存(Tile Buffer)中,最后在寫到系統內存(System Memory)上
TBDR詳細示意圖:
- TBDR中有一個Tiling的過程:將幾何著色器計算出的頂點數據刷到系統內存(System Memory)上
- 最終經過片元著色器計算的結果,將會被刷到片內存(Tile Buffer)上面,在最后的操作才是把片內存寫入Frame Buffer中
2. TBR與IMR的一些對比
a圖為TBR,B圖為IMR
3 .TBR的優缺點
TBR的核心目的是降低帶寬,減少功耗,但渲染幀率上并不比IMR快
優點:
- TBR給消除Overdraw提供了機會,PowerVR用了HSR技術,Mali用了Forward Pixel Killing技術,目標一樣,就是要最大限度減少被遮擋pixel的texturing和shading。
- TBR主要是緩存友好, 在緩存里頭的速度要比全局內存的速度快的多,以及有可能降低幀率為代價,來降低帶寬,省電
缺點:
- 分配圖元過程(bining 過程):這個過程在vertex階段之后,將輸出的幾何數據寫入到系統內存,然后才被fragment shader讀取。幾何數據過多的管線,容易在此處有性能瓶頸
- 如果某些三角形疊加在數個tile(塊)上,則需要繪制數次。意味著總渲染時間將高于即時渲染模式
4 .TBDR中的D——Defer是什么
Bining過程(類似四叉樹)/第一個Defer
將需要處理的圖元分配到對應的塊中,來進行處理
不同GPU的Eearly-DT/第二個Defer
Android的處理
FPK技術:
IOS的HSR技術:
六、TB(D)R的優化建議
1. 記得不使用Framebuffer的時候clear或者discard
主要是清空積存在tile buff上的中間數據,所以在unity里面對render texture的使用也特別說明了一下,當不再使用這個rt之前,調用一次Discard。在OpenGL ES上善用glClear,gllnvalidateFrameBuffer避免不必要的Resolve(就是tile buff刷新到system memeory)行為
2. 要在一幀里面頻繁的切換framebuffer的綁定
本質上就是減少tile buffer 和system memory之間的 的stall(同步) 操作
3. 對于移動平臺,建議你使用 Alpha 混合,而非 Alpha 測試
在實際使用中,你應該分析并比較 Alpha 測試和 Alpha 混合的表現,因為這取決于具體內容,因此需要測量,通常在移動平臺上應避免使用 Alpha 混合來實現透明。需要進行 Alpha 混合時,嘗試縮小混合區域的覆蓋范圍
4. 其余優化
- 手機上必須要做Alpha Test,先做一遍Depth prepass
- 圖片盡量壓縮 例如:ASTC ETC2
- 圖片盡量走 mipmap
- 盡量使用從Vertex Shader傳來的Varying變量UV值采樣貼圖(連續的),不要在FragmentShader里動態計算貼圖的UV值(非連續的)
- 在延遲渲染盡量利用Tile Buffer 存儲數據
- 如果你在Unity 里面調整 ProjectSetting/Quality/Rendering/Texture Quality 不同的設置,或者不同的分辨率下,幀率有很多的變化,那么十有八九是帶寬出問題啦
- MSAA其實在TBDR上反而是非常快速的。
- 少在片元著色器中使用 discard 函數,調用gl_FragDepth從而打斷Early-DT( HLSL中為Clip,GLSL中為discard )
- 盡可能的在Shader里使用浮點數,有目的的區分Half Float,好處:(1)帶寬用量減少(2)GPU中使用的周期數減少,因為著色器編譯器可以優化你的代碼以提高并行化程度。(3)要求的統一變量寄存器數量減少,這反過來又降低了寄存器數量溢出風險。
- 在移動端的TBDR架構中,頂點處理部分,容易成為瓶頸,避免使用曲面細分shader,置換貼圖等負操作,提倡使用模型LOD,本質上減少FrameData的壓力,Unity中盡早在應用階段借助umbra(unity自帶的剔除功能)遮擋剔除
總結
以上是生活随笔為你收集整理的图形学进阶——移动端TB(D)R架构基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王垠博客 linux,前段时间花了一个通
- 下一篇: SQL Server 2008服务器安装