移動端GPU——渲染流程

PattiSmith

1. IMR——桌面 GPU 的渲染流程

1.1 IMR 渲染特點

  • DrawCall 中的模型順序執(zhí)行 VS 和 PS

  • 每個DrawCall 完成后檩淋,PS 將所有像素顏色、深度等寫入 FrameBuffer

  • 每個像素可以被多次寫入模闲,寫入順序和 DrawCall 執(zhí)行順序一致

1.2 作為寫入目標(biāo)的FrameBuffer ,對顯存的性能要求

  • 訪問速度:極高的訪問速度

  • 容量要求:滿足響應(yīng)分辨率和格式(RGBA崭捍,HDR等)的容量

  • 功耗:電池供電設(shè)備的低功耗要求

在目前的移動設(shè)備硬件水平下尸折,這三個目標(biāo)通常最多只能滿足兩個。目前的主流選擇:犧牲容量殷蛇,換取更快的訪問速度和更低的功耗实夹。

2. 解決方案:TBR(Tile Based Rendering)

引入TileBuffer

2.1 SIMD 核心不直接寫到 FrameBuffer,而是寫到TileBuffer晾咪,TileBuffer 的內(nèi)容在恰當(dāng)?shù)臅r候?qū)懙?FrameBuffer

  • 小容量收擦、高速 On chip 的 TileBuffer 作為 SIMD 的寫入目標(biāo)

  • FrameBuffer 會分塊依次渲染

  • 單Tile上所有任務(wù),即每個 Tile 上的 DrawCall 都完成后才一次寫入顯存

TBR渲染流程

2.2 TBR 中的深度測試

TBR中的深度測試
  • Early-Z:在 PS 之前執(zhí)行谍倦,測試失敗的像素不執(zhí)行PS
  • Late-Z:在 PS 之后執(zhí)行塞赂,測試失敗的像素不寫入 Color Buffer
  • 可見 Early-Z 能顯著降低 PS 的性能壓力,最好在無法應(yīng)用 Early-Z 的時候再啟用 Late-Z

什么情況下 Early-Z 失效昼蛀?

因為 Early-Z 在PS 之前執(zhí)行宴猾,所以需要必須在 PS 之前就確定深度,也就是說 執(zhí)行PS時像素深度不能發(fā)生變化

  • Alpha Test / Clip:需要執(zhí)行完 PS 后叼旋,才能確定該像素深度是否被寫入
  • Custom depth仇哆,PS中改寫深度值,硬件能夠感知夫植,Early-Z 階段無法獲取最終的深度值讹剔,失效。

2.3 移動端 GPU 的 Early-Z

移動端 GPU 的 Early-Z
  • TileList 保存當(dāng)前 Tile 上的所有三角形列表
  • 隱藏面剔除HSR(Apple/PowerVR), LRZ(Adreno), FPK(Mali)
  • 原理:硬件層面先對 Tile 中的三角面進行 Depth Prepass详民,相當(dāng)于先進行了一邊深度測試延欠,剔除掉看不到的 fragment,可以顯著降低 overdraw 程度沈跨,減少 PS 調(diào)用次數(shù)
  • 移動端 Early-Z 失效:打斷了硬件的 Depth Prepass

2.4 性能關(guān)注點

2.4.1 頂點開銷

  • TBR 中頂點會存在 TileList 中由捎,過多的頂點會使得 TileList 過大,影響訪問性能和內(nèi)存開銷
  • 移動端 Early-Z 雖然會降低 PS 開銷饿凛,但是會增加 VS 開銷(額外做一遍 Depth Prepass狞玛,有些廠商的GPU實際上是執(zhí)行了良次 VS,其中一次會優(yōu)化掉和位置計算無關(guān)的部分)涧窒,因此優(yōu)化 VS 復(fù)雜度(特別是位置計算)尤為重要

2.4.2 Tessellation

  • 移動 GPU 中通常沒有專門的 Tessellation 單元心肪,效率更低
  • Tessellation 產(chǎn)生更多頂點,需要執(zhí)行更多次 VS杀狡,增加開銷

2.4.3 充分利用 TileBuffer

TileBuffer 和主顯存之間消耗大量帶寬蒙畴,針對這個消耗進行如下的優(yōu)化

  • 每一幀對 TileBuffer 執(zhí)行Clear ,避免上一幀的 Color Buffer/ Depth Buffer 又被從主存加載一邊
  • 渲染完成后 Discard 掉不需要的 Render Target 或 Depth Buffer,避免會寫到顯存膳凝,節(jié)省大量帶寬碑隆。

3. TBDR:基于 TileBuffer 的延遲渲染

3.1 延遲渲染傳統(tǒng)流程

延遲渲染傳統(tǒng)流程
  • 需要提供較多的顯存空間,支持多張 RT(MRT)蹬音,也就是GBuffer上煤,寫入材質(zhì)各種屬性
  • 獨立的一個 LightPass,讀入每個像素的GBuffer屬性著淆,并進行光照處理劫狠,得到最終的 ColorBuffer
  • 移動平臺上難以實現(xiàn)的原因:延遲渲染因為 MRT 的存在,大量消耗顯存讀寫的帶寬

3.2 移動設(shè)備上的延遲渲染(TBDR)

TBDR示意
  • 像素的屬性(MRT)不被寫入主顯存永部,只存在于 TileBuffer中独泞,最終只復(fù)制 Color 信息到主顯存中,降低了帶寬消耗
  • 幾乎不會占用額外帶寬

4. 移動設(shè)備上的 MSAA

4.1 傳統(tǒng) MSAA 流程

傳統(tǒng)MSAa
  • 需要一個4倍RT來獲得4倍的fragment苔埋,最后再 resolve 會1倍的 RT

4.2 移動設(shè)備 MSAA 流程

移動端MSAA
  • 多倍采樣的 RT 僅在 TileBuffer 中存在
  • Resolve 發(fā)生在 TileBuffer 中懦砂,逐 Tile 執(zhí)行
  • 僅單倍采樣的 RT 被寫回顯存

5. GPU 和 CPU 協(xié)作(Frame Pacing)

5.1 基本的 FramePacing 流程

FramePacing
  • CPU 和 GPU 異步運行
  • Command Buffer 作為 CPU 和 GPU 的協(xié)議包
  • CPU 填充 CommandBuffer,在提交后(DrawCall)后 GPU 才開始執(zhí)行 CommandBuffer

5.2 對 FramePacing 進行優(yōu)化

目標(biāo):最大程度的并行化

  • 盡早提交渲染命令组橄,讓 GPU 盡早開始工作荞膘,但避免將 CommandBuffer 拆分過于細碎,提交本身也有消耗
  • 非渲染相關(guān)的 CPU 任務(wù)不必要等待上一幀渲染完成(不要等 GameUpdate)
  • 保存數(shù)據(jù)單向流動(CPU到GPU)玉工,避免單幀內(nèi) CPU 依賴 GPU 執(zhí)行結(jié)果

CPU 幀內(nèi)依賴于 GPU 執(zhí)行結(jié)果的一個例子是 “硬件遮擋查詢”機制羽资,它需要 CPU 創(chuàng)建遮擋查詢命令提交給 GPU,等待 GPU 的運算結(jié)果遵班,再根據(jù)結(jié)果執(zhí)行渲染屠升。

5.3 垂直同步

渲染結(jié)果只能在固定的時間點顯示到屏幕,比如移動設(shè)備的屏幕刷新率為 60Hz狭郑,意思是手機屏幕每秒最多進行 60 次的緩沖區(qū)交換(渲染刷新)
問題:

  1. 若某幀渲染太快弥激,到了第一個同步點就刷新到屏幕了,而下一陣太慢愿阐,第二個同步點才刷新,則幀率不穩(wěn)定趾疚,有卡頓感
  2. 若刷新率慢而幀渲染率快缨历,未開啟垂直同步的情況下,可能畫面撕裂糙麦,上一個 FrameBuffer 才顯示一半辛孵,下一幀 FrameBuffer 已經(jīng)提交,再刷新就變成了下一幀的畫面
  • 移動設(shè)備上始終開啟垂直同步赡磅,保證最小的幀間隔時間
  • 做幀率限制時魄缚,保持最大幀率和屏幕刷新率整除的關(guān)系,如60Hz設(shè)備可限制 30FPS,20FPS冶匹,但不要限制 25FPS
  • 使用圖形層 API 接口來限制
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末习劫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嚼隘,更是在濱河造成了極大的恐慌诽里,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件飞蛹,死亡現(xiàn)場離奇詭異谤狡,居然都是意外死亡,警方通過查閱死者的電腦和手機卧檐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門墓懂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人霉囚,你說我怎么就攤上這事捕仔。” “怎么了佛嬉?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵逻澳,是天一觀的道長。 經(jīng)常有香客問我暖呕,道長斜做,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任湾揽,我火速辦了婚禮瓤逼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘库物。我一直安慰自己霸旗,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布戚揭。 她就那樣靜靜地躺著诱告,像睡著了一般。 火紅的嫁衣襯著肌膚如雪民晒。 梳的紋絲不亂的頭發(fā)上精居,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音潜必,去河邊找鬼靴姿。 笑死,一個胖子當(dāng)著我的面吹牛磁滚,可吹牛的內(nèi)容都是我干的佛吓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼维雇!你這毒婦竟也來了淤刃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤谆沃,失蹤者是張志新(化名)和其女友劉穎钝凶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唁影,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡耕陷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了据沈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哟沫。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖锌介,靈堂內(nèi)的尸體忽然破棺而出嗜诀,到底是詐尸還是另有隱情,我是刑警寧澤孔祸,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布隆敢,位于F島的核電站,受9級特大地震影響崔慧,放射性物質(zhì)發(fā)生泄漏拂蝎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一惶室、第九天 我趴在偏房一處隱蔽的房頂上張望温自。 院中可真熱鬧,春花似錦皇钞、人聲如沸悼泌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馆里。三九已至,卻和暖如春可柿,著一層夾襖步出監(jiān)牢的瞬間也拜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工趾痘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蔓钟。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓永票,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子侣集,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容