需求是來自於我在爲我司的一個線上RPG遊戲作特效的性能優化的過程當中,須要驗證對特效的一個改動是否可以提升性能,固然這個改動是在不影響美術效果的前提。html
主角的一個大招(技能)會有10個特效,其中6個是相同的特效,也就是同一時間會存在6份相同的特效,可是從profiler來看這6份相同的特效的set passcall 和dc數量是隨着特效數量而遞增的(setpasscall=單個 x 數量),根據個人知識儲備我判斷這確定有問題,最合理的狀況是:多個特效的setpass = 單個特效的setpasscall。android
遊戲主界面的DC偏高,在排除完UGUI的合批被打斷的狀況以後,我發現隨着遊戲圖標的增長(圖標上有特效),dc也成倍數增長,固然這種狀況也出如今了道具的流光特效上。git
通過個人測試驗證以後,已經肯定這兩個問題的緣由都是同樣的:github
咱們每一個特效裏面都包含子的Particle System,不一樣的粒子之間是使用單圖,沒有打圖集,也就是一個特效有多個matwindows
粒子沒有設置OrderInLayer,當出現多份相同的時候,須要unity對它們進行排序,這樣就增長了setpasscall,打斷了合批。性能優化
而在我對粒子進行修改後,就至關於提早給粒子設置了順序,這樣當出現多份相同的粒子時,由於mat,order,texture都是同樣的,就能夠被合批。ide
通過個人改動以後,當同屏存在100甚至1000個相同的特效,setpasscall和dc數量都沒有上漲,在profiler和真機上抓取的數據都獲得了驗證。函數
圖一是修改以前dc隨數量增長(存在問題),圖二是我修改以後dc是穩定的(正確的結果)工具
在驗證這一改動是正確且對性能有提升以後也對美術效果沒有影響,我花時間寫工具並整理了遊戲中的全部的法師技能特效,劍聖技能特效,BOSS技能特效,UI特效(包括圖標特效,領取按鈕,品質流光),場景特效(包括掉落物模型特效,環境特效,火焰),把要修改的特效統計到一個表格,和主美進行溝通,而後推進特效進行修改。性能
遇到問題
若是一個特效中同時有粒子和Mesh,且RenderQueue都是透明的(Transparent),修改粒子的Order in Layer後可能會出現mesh跑到粒子的後面,那麼給mesh添加Sorting Group組件,並設置Order in Layer比粒子Renderer中的order更大就能夠解決。
個人抓取環境:
使用Renderdoc抓取安卓真機數據,不須要ROOT,但須要打開手機的開發者調試模式並經過USB數據鏈接電腦。
官方文檔 - 快速開始: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那列數據中。