通過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是穩定的(正確的結果)

存在的問題-dc隨特效增加

100個特效dc也是2

項目落地

在驗證這一改動是正確且對性能有提高之后也對美術效果沒有影響,我花時間寫工具並整理了游戲中的所有的法師技能特效,劍聖技能特效,BOSS技能特效,UI特效(包括圖標特效,領取按鈕,品質流光),場景特效(包括掉落物模型特效,環境特效,火焰),把要修改的特效統計到一個表格,和主美進行溝通,然后推動特效進行修改。

遇到問題

如果一個特效中同時有粒子和Mesh,且RenderQueue都是透明的(Transparent),修改粒子的Order in Layer后可能會出現mesh跑到粒子的后面,那么給mesh添加Sorting Group組件,並設置Order in Layer比粒子Renderer中的order更大就可以解決。

准備工作

我的抓取環境:

使用Renderdoc抓取安卓真機數據,不需要ROOT,但需要打開手機的開發者調試模式並通過USB數據連接電腦。

  • Renderdoc v1.14
  • 自己的國產安卓手機,安卓11系統,未ROOT
  • unity2019.3.7f1
  • windows 10 ltsc

在Unity Editor中使用RenderDoc

  1. 從官網https://renderdoc.org/,下載並安裝Renderdoc
  2. 打開Unity,在Game 視圖 - 右鍵 load Renderdoc
  3. 點擊game視圖旁邊的小圖標,就會把當前內容傳輸到Renderdoc

image-20210701134654943

文檔資料

官方文檔 - 快速開始: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那列數據中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM