仿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耗时。
渲染模块
《六龙争霸》渲染性能-三星S3(From Blog)渲染模块的参数同样是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部分。
RenderProfiler.png物理模块
《六龙争霸》物理模块性能 - 三星S3 (From Blog)包括图中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。
Unity Manual - Memory ProfilerUsed和Reserved的差值则为用于该部分的空闲内存,这与Unity的内存管理机制有关。当我们需要评估应用所占内存大小的时候,需要用到Reseved的值;需要评估代码的内存管理时,数值则需要以Used为准。两者的差值代表着代码对内存管理的优劣,由于Unity不会将申请的内存还给系统,所以需要更为合理的内存管理机制来降低空闲内存的大小。
《六龙争霸》内存模块性能分析 - 三星S3参考博客中的数值,可以看到需要关注的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
网友评论