仿UWA對Unity項目進行性能分析<一>
最近在對項目的Unity部分進行性能分析,查找profiler的一些指標定義時,恰巧搜到了UWA的博客,看了以后感覺受益頗多。尤其是最后一部分的案例分析,包含了性能分析的參數和指標,可以作為Unity部分性能測試的范本。
以 《六龍爭霸》測評精講這篇為例,從幀率(CPU性能)指標入手,分析了《六龍爭霸》在渲染、內存、資源三大塊的優化情況。
細讀了一下整篇報告,發現除了texture紋理類型這塊沒有找到數據來源,猜測是通過解析資源的assetbundle,其余數據均來自Unity Profiler的日志數據,經過統計和二次計算。恰好手上有profiler的數據,所以準備依樣畫葫蘆來做一個類似的報告,看看自己項目的性能與UWA認可的標準的差距。
本篇是第一篇,是對《<六龍爭霸>測評精講》的深入解讀,整理一下各模塊數據的來源,因此所有截圖都來自此博客和網絡,沒有任何原創。
當然,懶如我,第二篇是什么時候,還不知道。
CPU性能
報告中CPU性能數據包括4個:
- 總幀數
- CPU耗時均值
- CPU耗時>33ms幀占比(FPS<30)
- CPU耗時>50ms幀占比(FPS<20)
不難看出,其實只要對每幀的CPU耗時進行不同維度的統計計算,即可得到上述信息。
CPU耗時這個指標,使用過Unity Profiler的不會陌生,是Profiler界面的第一欄。點擊選中某幀后,會在下面窗口顯示該幀生成時各函數的耗時,如下圖所示。
列表右上角的CPU指標即為該幀生成時CPU耗時。
渲染模塊
渲染模塊的參數同樣是4個:
- max Drawcall
- max Triangles
- avarage 半透明渲染CPU耗時
- avarage 不透明渲染CPU耗時
折線圖是每一幀的半透明和不透明渲染的CPU耗時,也就是計算后兩個指標的具體數值。
同樣的,CPU耗時依然來自Profiler的CPU Usage部分。
半透明渲染函數:Camera.Render/Drawing/Render.TransparentGeometry
不透明渲染函數:Camera.Render/Drawing/Render.OpaqueGeometry
DrawCalls和Triangles是渲染參數,來自Profiler的Rendering部分。
物理模塊
包括圖中4個指標和文中提到的Rigidbodies,物理模塊有5個指標
- avarage 物理計算CPU耗時
- max Number of Contacts
- max Static Colliders
- max Dynamic Colliders
- Active Rigidbodies
CPU耗時同樣來自于CPU Usage
函數名為:Physics2D.FixedUpdate/Physics2D.Callbacks/Physics2D.Simulate
不過,這個需要確認,我們項目用不到物理模塊,我沒有找到博客圖中所示的Physics.Simulate不代表沒有此函數,所以先定位到這個Physics2D。
剩余指標來自
動畫模塊
由于我所在項目無使用,所以簡單提一下。
CPU耗時同上,函數為:
- Animators.Update
- Animation.Update(這個也沒有找到)
- MeshSkinning.Update
Animation Clips在Memory Profiler窗口中可以間接獲得。圖見下章
內存模塊
Unity的內存分為兩行數據,一行是Reserved, 一行是Used,如下圖所示的Memory Profiler。
Used和Reserved的差值則為用于該部分的空閑內存,這與Unity的內存管理機制有關。當我們需要評估應用所占內存大小的時候,需要用到Reseved的值;需要評估代碼的內存管理時,數值則需要以Used為準。兩者的差值代表著代碼對內存管理的優劣,由于Unity不會將申請的內存還給系統,所以需要更為合理的內存管理機制來降低空閑內存的大小。
參考博客中的數值,可以看到需要關注的6個內存數值為
- Reserved Total
- Used Total
- Reserved Unity
- Used Unity
- Reserved GFX
- Reserved Mono
空閑內存 =
(Reserved Total - Used Total) - (Reserved Unity - Used Unity)
資源模塊
報告中的資源模塊包括四種類型的資源:
- Textures 貼圖
- Meshes 網格
- Animation Clips 動畫
- Audio Clips 聲音
其中共同的性能指標為
- 數量峰值
- 內存峰值
這些都可以在Memory Profiler中獲取到。
GC調用
Instantiate實例化這個沒有找到,因此只對GC的部分做統計
GC的數據同樣在CPU Usage的表格部分。會通過如下類似的方式進行調用:
BehaviourUpdate/BehaviourUpdate/----.Update()/GC.Collect|0 B|0.97|0.97
意味著在該幀調用了GC,引起GC調用的是BehaviourUpdate/BehaviourUpdate/----.Update()函數,該次GC耗時為0.97ms
粒子系統
CPU耗時,同樣在CPU Usage的表格部分。
函數為:ParticleSystem.Update