遊戲圖形批量渲染及優化:Unity靜態合批技術
(本文首發於公眾號“偶爾學學Unity”,文章僅為作者觀點,不代表GWB立場)
最近在準備公司的技術分享,主題是入門批量渲染,想著反正也總結了,不如充幾篇部落格吧,也算顯得沒有那麼半途而廢,一舉兩得了。
所以,這次將分四篇介紹一下與批量渲染有關的知識:
第一篇的主題是靜態合批;
第二篇的主題是動態合批;
第三篇的主題是例項化渲染;
第四篇的主題是優化骨骼蒙皮動畫,以及兩種常用的批量渲染方式:烘焙頂點動畫與烘焙骨骼矩陣動畫。
那就開始吧。
1、批量渲染
批量渲染其實是個老生常談的話題,它的另一個名字叫做“合批”。在日常開發中,通常說到優化、提高幀率時,總是會提到它。
可以簡單的理解為:批量渲染是通過減少CPU向GPU傳送渲染命令(DrawCall)的次數,以及減少GPU切換渲染狀態的次數,儘量讓GPU一次多做一些事情,來提升邏輯線和渲染線的整體效率。但這是建立在GPU相對空閒,而CPU把更多的時間都耗費在渲染命令的提交上時,才有意義。
如果瓶頸在GPU,比如GPU效能偏差,或片段著色器過於複雜等,那麼沒準適當減少批處理,反而能達到優化的效果。
所以要做效能優化,還是應該先定位瓶頸到底在哪兒,然後再考慮優化方案,而不是一股腦的就啪啪啪合批。
當然,通常情況下,確實是以CPU出現瓶頸更為常見,所以適當的瞭解些批量渲染的技法,是有那麼一丟丟必要的。
2、靜態合批
靜態合批是一種聽起來很常用,但在大多數手遊專案裡又沒那麼常用的合批技術。
這裡,我簡單的將靜態合批分為預處理階段的合併,和執行階段的批處理。
合併階段
合併時,引擎將符合合批條件的渲染器身上的網格取出,對網格上的頂點進行空間變換,變換到合併根節點的座標系下後,再合併成一個新的網格;這裡需要注意的是,新網格是以若干個子網格的形式組合而成的,因為需要記錄每一個合併前網格的索引數量和起始索引(相對於合併後的新網格)。
空間變換的目的,是為了“固化”頂點緩衝區和索引緩衝區內的資料,使其頂點位置等資訊都在相同的座標系下。這樣執行時如果需要對合並後的物件進行空間變換(手動靜態合批物件的根節點可被空間變換),則無需修改緩衝區內的頂點屬性,只提供根節點的變換矩陣即可。
儘管網格不同、材質不同,Unity也會將它們的網格進行合併
在Unity中,可以通過勾選靜態批處理標記,讓引擎在打包時自動合併;當然,也可以在執行時呼叫合併函式,手動合併。
通過勾選開關標記單位參與靜態合批
打包時的自動合併會膨脹場景檔案,會在一定程度上影響場景的載入時間。
包含靜態合批的場景體積大了一丟丟
此外,不同平臺對於合併是有頂點和索引數量限制的,超過此限制則會合併成多個新網格。
批處理階段
執行時是否可以合批(Batch)成功,還取決於渲染器材質的設定。
使用不同的材質,會分為不同的批次
當然,如果手動替換過場景中所有Material,也會打斷批次。
執行時手動替換所有渲染器的材質球
不再有合批發生
如果偷偷修改了渲染器使用的網格(不再使用合批後的大網格),也會打斷批處理。
替換網格後,也不會再被批處理
除上述之外,還有一些不常用,且不太有用的知識點。
執行時動態載入?
動態載入並例項化一個帶靜態標記的GameObject到場景中,是不會被當做靜態合批處理的。換言之,靜態標記只被作為是打包時的考慮引數,並不會在執行時被引擎處理。如果在場景載入後,希望對手動例項化的單位進行靜態合批,可以使用手動靜態合批。
合併根節點的空間變換
自動靜態合批的根節點在場景上,因此無法對其進行空間變換;而手動靜態合批,因為根節點不是場景而是一個遊戲物件,所以可以通過修改根節點的空間屬性(位置、大小及縮放值),達到諸如移動整個合批單位的目的。
當然,即使修改了合批後物件的空間屬性,頂點和索引緩衝區裡的資料也不會被修改,引擎會在渲染前,通過ConstBuffer(UniformBuffer)傳入根節點的變換矩陣,達到了整體變換的目的。
Batch ≠ DrawCall
一次靜態合批,並不表示一定只有一次DrawCall命令的呼叫。
合併發生後,每個參與合批的網格資訊(頂點、索引等)就會被最終確定,不再被修改。當一個參與合併的單位不顯示時,如被設定為隱藏或被視椎體剔除,引擎並不會修改頂點緩衝區和索引緩衝區的內容,而會拆分若干個小的DrawCall來分次渲染。通過調整每個DrawCall的索引(起始索引、索引個數)來跳過不應該被顯示的單位。
通過兩次DrawCall來跳過隱藏的三角形
由於,這些DrallCall之間幾乎沒有渲染狀態的切換,效率較高,所以引擎也將其統計為一次合批(儘管包含若干個DrawCall)。
隱藏掉部分立方體後,形成了兩次DrawCall
引擎的Statistics視窗、FrameDebugger和Profiler(Renderer)會體現出這種差異
靜態合批包含了多個材質時,引擎在材質分組後的處理方式也是相同的,只是不同材質在渲染時,都使用了相同的頂點、索引緩衝區。
與直接使用大網格的不同
靜態合批與直接使用大網格(是指直接製作而成,非靜態合併產生的網格)的不同,主要體現在兩方面。
其一,靜態合批可以主動隱藏部分物件。靜態合批在執行時,由於每個參與合併的物件可以通過起始索引等彼此區分,因此可以通過上述多次DrawCall的策略,實現隱藏指定的物件;而直接使用大網格,則無法做到這一點。
其二,靜態合批可以有效參與CPU的視錐剔除。當有剔除發生時,被送進渲染管線的頂點數量就會減少(通過引數控制),也就意味著被頂點著色器處理的頂點會減少,提升了GPU的效率;而使用大網格渲染時,由於整個網格都會被送進渲染管線,因此每一個頂點都需要被頂點著色器處理,如果攝像機只能照到一點點,那麼絕大多數參與計算的頂點最後都會被裁減掉,有一些浪費。
大網格不會被視錐體剔除,全部頂點都會被送進渲染管線
靜態合批會被視錐體剔除,只有部分頂點被送進渲染管線
靜態合批下合併後的網格
靜態合批下,頂點著色器只處理了部分頂點
當然,這並不意味著靜態合批一定就比使用大網格要更好。如果子網格數量非常多,視錐剔除時CPU的壓力也會增加,所以具體情況具體分析吧~
3、靜態合批的利弊
靜態合批採用了以空間換時間的策略來提升渲染效率。
其優勢在於:網格通常在預處理階段(打包)時合併,執行時頂點、索引資訊也不會發生變化,所以無需CPU消耗算力維護;若採用相同的材質,則以一次渲染命令,便可以同時渲染出多個本來相對獨立的物體,減少了DrawCall的次數。
在渲染前,可以先進行視錐體剔除,減少了頂點著色器對不可見頂點的處理次數,提高了GPU的效率。
其弊端在於:合批後的網格會常駐記憶體,在有些場景下可能並不適用。比如森林中的每一棵樹的網格都相同,如果對它採用靜態合批策略,合批後的網格基本等同於:單顆樹網格 x 樹的數量,這對記憶體的消耗可能就十分巨大了。
極端情況下可能導致記憶體佔用過高
總而言之,靜態合批在解決場景中材質基本相同、網格不同、且自始至終都保持靜止的物體上時,很適用。
不出意外的話,下次更新的內容應該是動態合批。
下回見。
來源:騰訊GWB遊戲無界
原文:https://mp.weixin.qq.com/s/OQ4E_YlI7np32CZnQnV6tg
相關文章
- 靜態合批和動態合批
- 淺談GPU虛擬化技術:GPU圖形渲染虛擬化GPU
- 圖形學之Unity渲染管線流程Unity
- 動態合批與靜態合批的網格記憶體佔用記憶體
- 頁面靜態化技術演進
- Web靜態資源快取及優化Web快取優化
- 有人工智慧加持,英偉達的圖形渲染技術會讓遊戲畫面變得更好嗎?人工智慧遊戲
- unity程式使用雲渲染技術是否要修改?Unity
- 靜態路由及綜合實驗路由
- iOS 圖形效能優化iOS優化
- 沒有遊戲,還會有現如今的數字圖形技術嗎?遊戲
- 雲遊戲:未來遊戲的初級形態已“觸手可及”遊戲
- Unity中的各種合批Unity
- 靜態轉移預測技術
- 【unity 技術教程】自動>手動 用隨機地圖豐滿你的遊戲Unity隨機地圖遊戲
- 從零開始做一個SLG遊戲(三):用unity繪製圖形遊戲Unity
- 影片美顏SDK動態處理技術與靜態處理技術
- 「技美之路 第01篇」圖形 1.1 渲染流水線
- 手遊逆向分析: Unity內還原遊戲場景/角色渲染效果Unity遊戲
- Unity和騰訊遊戲成立聯合創新實驗室,從技術創新探索遊戲產品新模式和概念Unity遊戲模式
- 遊戲技術遊戲
- Nuxtjs實現服務端渲染和靜態化站點UXJS服務端
- 靜態化與伺服器渲染(Static vs. Server Rendering)伺服器Server
- 探索高效能圖形渲染能力,應對嚴苛視訊遊戲環境遊戲
- 深度學習和圖形學渲染的結合和應用深度學習
- 批量修改azure內網地址為靜態內網
- DAPP智慧合約互助遊戲開發詳情丨DAPP智慧合約互助遊戲系統開發技術分析及規則APP遊戲開發
- canvas核心技術-如何繪製圖形Canvas
- 莉莉絲遊戲引擎渲染專家凱丁:從MMO到獨立遊戲,再到引擎技術遊戲引擎
- Unity效能最佳化GPU渲染最佳化UnityGPU
- css 渲染優化CSS優化
- [譯] 提高 10 倍效能:優化靜態網站優化網站
- 從“遊戲批評”到“玩遊戲批評”遊戲
- 遊戲引擎市場佔有率超50%,Unity將用這些新技術改變“遊戲玩法”遊戲引擎Unity
- 技術賦能構築鴻蒙生態精品遊戲,PGS 2.0全新升級加速原生遊戲商用化程序鴻蒙遊戲
- 同時渲染兩個世界:恐怖遊戲《靈媒》背後的尖端技術遊戲
- 網頁渲染方式-從靜態頁面到服務端渲染網頁服務端
- 2020年Unity線上大會遊戲專場廠商技術分享彙總Unity遊戲