Unity profiler 性能查看器里面描述的含义

| 发布     | 分类 Unity  | 标签 Unity  优化  profiler 


Camera.Render 渲染模块
Render.OpaqueGeometry 不透明渲染
MeshRenderer.Render 非蒙皮网格渲染
Mesh.DrawVBO Draw Call
MeshShinning.Render 蒙皮网格渲染
Material.SetPassFast 场景中不同材质数量造成;和DrawCall类似,如果两个相同材质物体中间有一个其他材质的物体,就无法合批,这个材质就会成2个SetPassFast
Render.TransparentGeometry 半透明渲染
Mesh.DrawVBO NGUI 一般藏在这里面
ParticleSystem.ScheduleGeometryJobs 粒子系统
ParticleSystem.SubmitVBO 粒子系统渲染,提交粒子系统VBO的操作
BatchRenderer.Add UGUI一般藏在这里面, Canvas绑定了Camera的会显示在这里面。没有绑定Camera的Canvas不会显示在这里(Camera.Render)
Culing 相机裁剪
ParticleSystem.ScheduleGeometryJobs 这个函数不仅出现在Render.TransparentGeometry,也会出现在Culing里。通常他的时间占比比较高(2%-3%左右)。

如果粒子系统没有在摄像视窗内就不会有;如果在摄像机视窗内部的粒子系统越多,消耗越大。所以与摄像机视窗内粒子系统个数成正比。

主线程:ParticleSystem.ScheduleGeometryJobs

子线程:ParticleSystem.GeometryJobs

分析: 主线程做任务调度,子线程做粒子模拟
Camera.ImageEffects 图形后期处理



渲染模块


渲染模块/不透明渲染


Material.SetPassFast

Render State包含深度测试、半透明渲染、Blend混合、材质Texture修改和绑定.
所以优化不仅要控制DrawCall,还有控制Material的数量,不能太多。


渲染模块/半透明渲染


渲染模块/相机裁剪

ParticleSystem.ScheduleGeometryJobs

渲染模块,如何优化?

根据上面提到的查看profiler,定位问题出在哪个定方。然后去对美术效果做删减,让美术效果和运行效率做一个平衡。


问题方向



定量实验分析 不透明物体渲染性能实验

纵坐标:渲染耗时 单位毫秒。

横坐标:物体面片数。

柱状图:不同颜色材质数量

发现1:随着材质数的增加,渲染耗时也增加;物体面片数的增加,渲染耗时并不那么明显。

发现2:60个物体图和120个物体图对比,可以发现因为Draw Call数量的增加,对渲染耗时有比较大的影响。


为什么小于5毫秒呢?
因为游戏一般以30帧为界限。
假如游戏设定帧频为30帧,那么每帧的时间是33毫秒。
在这33毫秒中分配给渲染大概是15毫秒。
在这15毫秒中要做:不透明物体渲染、半透明物体渲染、阴影、粒子系统、图像后处理等。
所以分配给不透明物体渲染的时间大概在3-5毫秒。

在本次测试中不开启多线程渲染,为什么呢?
因为开启了多线程渲染,主线程中提交DrawCall与图像API的交互操作转移到了渲染线程。使得用Camera.Render衡量不准确。


横向表头:面片数

纵向表头:物体数量

boady:渲染耗时,小于5毫秒用红色标识。可以看到在红米2中没有小于5毫秒的情况

可以看到在红米2中没有小于5毫秒的情况,因此在红米2上建议采用面片数量小于600的模型,物体数量小于60个。




定量实验分析 不透明物体渲染性能实验

纵向表头:渲染耗时

横向表头:粒子系统数量

柱状图:单个粒子系统的粒子统数量

红米2中可以看到:

粒子系统数量越多,消耗越大。

粒子系统中的粒子数量越多,消耗越大。


横向表头:单个粒子系统的粒子统数量

纵向表头:粒子系统数量

boady:渲染耗时,小于5毫秒用红色标识。可以看到在红米2中小于5毫秒的情况设置是30个粒子系统,单个粒子系统的粒子个数40




定量实验分析 Shadow

纵向表头:Camera.Render渲染总耗时 (毫秒)

横向表头:物体的个数

柱状图:表示低、中、高三种分辨率的ShadowMap

红米2测试,面片数选择500个

ShadowMap分辨率 (低、中)和(高)有很大的差距

ShadowMap分辨率 (低)和(中)差距不是很大


横向表头:单个物体的面片数量

纵向表头:物体数量

boady:渲染耗时,小于5毫秒用红色标识。可以看到在红米2中没有小于5毫秒的情况,因此在红米2上建议不要开启实时阴影。


红米note2中最大支持面片数为1500个的物体20个。




定量实验分析 PBR与简单光照对比

纵向表头:Camera.Render渲染总耗时 (毫秒)

横向表头:物体的个数

蓝色:diffuse材质,没有贴图

红色:diffuse材质,有贴图

灰色:pdr材质


发现:pdr材质比diffuse耗时高一些,没有高很多,60个物体高2ms,300个物体高4ms。

为什么呢?

因为pdr的主要工作在gpu


横向表头:单个物体的面片数量

纵向表头:物体数量

boady:渲染耗时,小于5毫秒用红色标识。可以看到在红米2中没有小于5毫秒的情况,因此在红米2上建议不要使用pdr。




定量实验分析 多线程性能提升实验







Occlusion Culling, Unity Camrea的功能。对场景中静态的物体预计算,然后在动态渲染的时候查预算的数据分析静态物体是否被其他静态物体遮挡。如果遮挡了,就把该物体刨除掉从而降低Draw Call。但是查询CullQueryPortalVisibityUmbra是有一定开销的

有些特殊情况,我们对比开启和关闭Occlusion Culling发现:

Occlusion Culling 开启有一定的开销

Draw Call并没有什么变化

因此在这种情况下,可以不开启


减少Draw Call的几种方法

Static Batching:对于静态物体

Dynamic Batching:对于动态物体

GPU Instancing:Unity5.4以后的版本,支持GPU3.1,对CPU没有开销,在GUP有一点点Shader开销。

Static Batching和Dynamic Batching对CUP和内存都有而外的开销,他们对对顶点重新计算




UWA六月直播季第二弹之Unity引擎渲染效率全解析

UWA直播回顾| UGUI性能优化技巧

Unity Profiler 性能分析

PBR的基本理论

上一篇: ihaiu.Loger C#用来适配 Console.WriteLine 和 Unity Debug
下一篇: Sublime Text 屏蔽meta格式的文件