通過RenderDoc真機抓取資料來落地驗證和解決特效效能的問題
前言
需求是來自於我在為我司的一個線上RPG遊戲做特效的效能優化的過程中,需要驗證對特效的一個改動是否能夠提高效能,當然這個改動是在不影響美術效果的前提。
特效效能問題
技能特效
主角的一個大招(技能)會有10個特效,其中6個是相同的特效,也就是同一時間會存在6份相同的特效,但是從profiler來看這6份相同的特效的set passcall 和dc數量是隨著特效數量而遞增的(setpasscall=單個 x 數量),根據我的知識儲備我判斷這肯定有問題,最合理的情況是:多個特效的setpass = 單個特效的setpasscall。
UI特效
遊戲主介面的DC偏高,在排除完UGUI的合批被打斷的情況之後,我發現隨著遊戲圖示的增加(圖示上有特效),dc也成倍數增加,當然這種情況也出現在了道具的流光特效上。
找出問題
經過我的測試驗證之後,已經確定這兩個問題的原因都是一樣的:
我們每個特效裡面都包含子的Particle System,不同的粒子之間是使用單圖,沒有打圖集,也就是一個特效有多個mat
粒子沒有設定OrderInLayer,當出現多份相同的時候,需要unity對它們進行排序,這樣就增加了setpasscall,打斷了合批。
而在我對粒子進行修改後,就相當於提前給粒子設定了順序,這樣當出現多份相同的粒子時,因為mat,order,texture都是一樣的,就可以被合批。
驗證結果
經過我的改動之後,當同屏存在100甚至1000個相同的特效,setpasscall和dc數量都沒有上漲,在profiler和真機上抓取的資料都得到了驗證。
圖一是修改之前dc隨數量增加(存在問題),圖二是我修改之後dc是穩定的(正確的結果)
專案落地
在驗證這一改動是正確且對效能有提高之後也對美術效果沒有影響,我花時間寫工具並整理了遊戲中的所有的法師技能特效,劍聖技能特效,BOSS技能特效,UI特效(包括圖示特效,領取按鈕,品質流光),場景特效(包括掉落物模型特效,環境特效,火焰),把要修改的特效統計到一個表格,和主美進行溝通,然後推動特效進行修改。
準備工作
我的抓取環境:
使用Renderdoc抓取安卓真機資料,不需要ROOT,但需要開啟手機的開發者除錯模式並通過USB資料連線電腦。
- Renderdoc v1.14
- 自己的國產安卓手機,安卓11系統,未ROOT
- unity2019.3.7f1
- windows 10 ltsc
在Unity Editor中使用RenderDoc
- 從官網https://renderdoc.org/,下載並安裝Renderdoc
- 開啟Unity,在Game 檢視 - 右鍵 load Renderdoc
- 點選game檢視旁邊的小圖示,就會把當前內容傳輸到Renderdoc
文件資料
官方文件 - 快速開始:https://renderdoc.org/docs/getting_started/quick_start.html
PS. 官方文件比較簡單,主要介紹軟體的使用,如果你想查閱抓取出來的不同條目或關鍵詞代表的意思,需要去查閱OpenGL或Directx的資料
超級詳細的軟體入門使用教程:renderdoc的使用
在Rnderdoc中抓包其它的遊戲:RenderDoc[01] 使用RenderDoc 分析Android遊戲(免Root)
引數解釋
glDrawElement:呼叫glDrawElements函式進行繪製就是Drawcall的一種形式
glDrawElementsBaseVertex:準備頂點資料
OpenGL的文件:http://docs.gl/gl4/glDrawElements
LearnOpenGL系列教程的簡體中文翻譯:https://learnopengl-cn.github.io/
儲存記錄
因為我是使用自己的手機來調取,所以我抓取完我把記錄儲存到本地檔案,這樣當手機斷開連線時,也可以檢視抓取的資料,但是在我的使用中儲存的記錄無法檢視貼圖,其它資訊可以檢視。
遇到問題
無法連線手機
Core 20364 15:59:27 android.cpp(1363) Error Couldn't get PID when launching com.qing.dcTest with activity com.unity3d.player.UnityPlayerActivity and intent args
一開始我在安卓手機端的開發者模式中手動選擇了要除錯應用,出現上面的錯誤。
解決辦法:只需要開啟USB除錯模式,像我的是國產定製系統,有ADB授權,把那個關閉就可以了,其它的不要多設定,就可以正常使用。
連線不穩定
在連線的過程中,每隔幾分鐘就會斷開連線,我後來把資料線連線到電腦後置USB介面上就沒斷開過了。
其它
在SnapDragonProfiler中也是看glDrawElements,顯示在glDraw call那列資料中。