省頻寬、耗電小,騰訊遊戲學院專家解析手遊渲染架構

遊資網發表於2020-01-02
編者按 如何讓手遊更省頻寬,耗電量更少?渲染或是其中一個可突破的點。本文中,騰訊遊戲學院專家Hailong將從為大家解析TBR渲染架構的特點。

什麼是TBR?

全稱是Tile Based Rendering,主要用在移動裝置(手機、平板)上的一種渲染架構,渲染時將螢幕分割成小塊,分別渲染。每塊大小為16×16 或32×32等(不同產品各不相同),特點是省頻寬,耗電小。

與之對應的是IMR(Immediate Mode Rendering),提交的每個渲染要求都會立即開始,這是一種簡單而又粗暴的思路,優點缺點都非常明顯,如果不用為效能擔憂,這種方式會很省事。

片上快取(On-Chip Buffer)

TBR裝置在GPU內部整合有很小的片上快取(On-Chip Buffer),片上快取,在渲染時會先將一個Tile內的影象先渲染到片上快取,然後在拷貝到主視訊記憶體中。而IMR渲染則是直接由GPU操作視訊記憶體。片上快取相比於視訊記憶體中的Frame Buffer具有更快的訪問速度,但是隻有很小的儲存空間(16×16畫素或32×32畫素)。

省頻寬、耗電小,騰訊遊戲學院專家解析手遊渲染架構

與IMR相比,TBR在GPU上多出一塊片上快取。

省頻寬、耗電小,騰訊遊戲學院專家解析手遊渲染架構

IMR與TBR在渲染流程上的對比(紅色陰影表示頻寬消耗熱點)

由上圖可以看出,IMR和TBR在頻寬消耗上有比較大的差異,左側的IMR渲染時,Depth Test和Alpha Test等由於需要頻繁訪問視訊記憶體,導致有很大的頻寬消耗。而右側的TBR渲染方式由於Depth Test和Alpha Test都只需要跟片上快取互動即可,避免了和視訊記憶體之間的頻寬消耗。

Tiling(分塊)

為了能夠按照逐個Tile渲染,在一幀的繪圖指令全部提交完成並經過頂點運算後後,會在記錄下每個Tile中對應的Triangle List。並儲存在FrameBuffer中,等待光柵化時從FrameBuffer讀取相應的Tile的TriangleList進行處理。

省頻寬、耗電小,騰訊遊戲學院專家解析手遊渲染架構

Resove和Restore

由於GPU的片上快取的儲存空間非常有限,因此渲染完成一個Tile之後,需要將結果複製到FrameBuffer中,這個過程稱作Resove。

如果一幀內需要多遍渲染時,在對Tile進行渲染的時候往往需要從FrameBuffer中將對應Tile中舊的資料讀取到片上快取,這個過程稱為Restore。

Resove和Restore會導致大量的頻寬消耗,需要儘量避免。

如果在渲染過程中需要頻繁的切換FrameBuffer,要注意呼叫順序,避免浪費頻寬。

省頻寬、耗電小,騰訊遊戲學院專家解析手遊渲染架構

省頻寬、耗電小,騰訊遊戲學院專家解析手遊渲染架構

會導致Resove+Restore的OpenGL ES呼叫。

  • eglSwapBuffers
  • glBindFramebuffer
  • glTexImage2D,glTexSubImage2D,
  • glBufferData,glBufferSubData
  • glCopyTexImage2D ,glCopyTexSubImage2
  • glReadPixels()
  • (參考:Adreno_Developer_Guide.pdf第38頁)


例項:為什麼在Unity中使用Grap Pass實現螢幕扭曲非常慢?

由於Unity中的Grap Pass是插在渲染過程中的,每渲染一次,會呼叫一次glBufferSubData,會導致Resorve和Restore。

可能做的優化:
等場景全部渲染完之後再在最上層疊加一個扭曲效果。
跟其他後處理合並處理。

例項:關於後處理

每個後處理會導至少增加一次Resorve。

可能的優化:
將多種後處理效果放在一個shader中可以減少Resove發生次數。
某些效果低解析度可以減少頻寬。

例項:實時陰影

Shadow map方式實現的實時陰影,需要首先將攝像機放在光源處,將場景深度渲染到一張紋理上,因此除了draw call的增加外,頻寬的增加也很多。

  • 可能的優化:
  • 使用更小的RT。
  • 如果能接受的話,可以嘗試鎮魔曲中影子的做法,即將主角壓扁,用黑色紋理渲出來。


減少頻寬消耗的建議

1、減少頂點數和圖片尺寸。

2、圖片壓縮(ETC,ATC,PVRTC等)。

3、除介面外,幾乎所有貼圖都建議生成Mipmap(減小頻寬消耗,增加快取命中)。

4、儘量減少Resove和Restore,儘量減小RenderTexture的尺寸。

  • 全屏後處理
  • 實時陰影(shadow map)
  • 扭曲
  • 實時反射
  • 5、優化Shader。
  • 使用低精度浮點數


TBR特有的兩個OpenGL ES擴充套件

1、Framebuffer Fetch

允許Shader中直接訪問片上快取中當前的顏色和深度。

可以用來實現高效的Color Grading、高度霧之類。

2、Pixel Local Storage

允許在片上快取中儲存和讀取自定義的資料格式,大小為每畫素128位元組或256位元組。

可以用來實現高效的延遲光照渲染(在片上快取中儲存G-Buffer)。

省頻寬、耗電小,騰訊遊戲學院專家解析手遊渲染架構

關於騰訊遊戲學院專家團
如果你的遊戲也富有想法充滿創意,如果你的團隊現在也遇到了一些開發瓶頸,那麼歡迎你來聯絡我們。騰訊遊戲學院聚集了騰訊及行業內策劃、美術、程式等領域的遊戲專家,我們將為全世界的創意遊戲團隊提供專業的技術指導和遊戲調優建議,解決團隊在開發過程中遇到的一系列問題。


申請專家資源請前往:
https://gwb.tencent.com/cn/tutor


作者:Hailong  
來源:騰訊GWB遊戲無界
原地址:https://mp.weixin.qq.com/s/AaFyeIb9ZCPyZzcKEhh1rw

相關文章