Notifications
Article
Profiler深挖-Rendering面板(4)
Published 2 years ago
1.0 K
3
Rendering
GPU在处理片元着色器之前会进行裁剪(Clipping)功能,会丢弃掉超出屏幕以外的所有像素,这样可以提高效率。所以我们在面板中看到的像素都是已经裁剪过的,也就是俗称屏幕内的东西。
在看Renderering面板之前我觉得有必要先看下状态面板,Unity程序员应该都见过这个,如下图所示,我先来解释一下。
Graphics:
1)FPS:帧数,1秒中游戏一共有多少帧。这个值在编辑器下很奇怪,请看上图居然跑了1000多帧。。。所以我封装了一个查看FPS的方法,只需要一行代码即可。
private void OnGUI() { GUILayout.Label(string.Format("<size=50>FPS : {0}</size>", (1f / Time.smoothDeltaTime).ToString("F2"))); }
<size=50>txt</size>
这种写法可以让字体变得大一些,比如在手机上用默认的字体小的基本看不见。
这里解释一下为什么要用 1f/Time.smoothDeltaTime。1f表示1秒,Time.smoothDeltaTime表示Time.deltaTime的平滑时间,因为单位都是秒,所以1f/Time.smoothDeltaTime就表示FPS了。
2)CPU:main表示主线程消耗的时间,renderer thread表示渲染线程消耗的时间,渲染线程在之前的文章中我们也唠叨过,这里就不赘述了。
3)Batches:如果你用过unity4.x以及以前的版本的话,那么这里显示的其实就是DrawCall。到了Unity5.x改名成了Batches,我觉得Batches其实更准确,因为Unity有动态合批的功能,所以叫DrawCall有点不准确。Save by batching表示一共有多少个Mesh出现了合批。
4)Tris:就是三角形的数量,俗称面数。一般会要求美术,同屏不要超过多少面,说的就是它。例如一个Quad,由2个三角形组成,所以它就是2个面,4个顶点。这里需要注意一下点光源,直光可以将颜色值直接加上,但是点光不行因为点光有衰减,所以Unity的做法就是生成更多的面来处理每个点光。所以你会发现每添加一个点光,面数就会增加很多。未来项目可以考虑延迟渲染以及LWRP。
5)Verts:顶点的数量,由面的数量决定,面越多顶点自然就越多。一般我们都会要求美术控制某某模型不能超过多少面。
6)Screen:屏幕大小,以及内存使用情况。
7)SetPass Call:这个数值有点意思,官方给的意思是 The number of rendering passes. Each pass requires Unity runtime to bind a new shader which may introduce CPU overhead. 翻译一下 渲染的Pass数量,每个渲染的Pass都需要绑定一个新的shader,它可能会导致CPU的开销。
这里你肯定会有疑问,到底SetPass Call 和Draw Call有啥区别呢?SetPass Call绑定了新的Shader所以它会更新到新的渲染状态,而DrawCall呢就是根据这个状态来进行绘制,但是一个Shader可能由多个Pass组成,所以同一个SetPass Call 就会产生多个DrawCall了。还不明白?我在举个更详细点的例子。将下面有两个Pass的shader放入游戏。
Shader "Unlit/NewUnlitShader" { SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag float4 vert (float4 vertex : POSITION) : SV_POSITION { return UnityObjectToClipPos(vertex); } fixed4 frag () : SV_Target { return fixed4(1,0,0,1); } ENDCG } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag float4 vert (float4 vertex : POSITION) : SV_POSITION { return UnityObjectToClipPos(vertex); } fixed4 frag () : SV_Target { return fixed4(0,1,0,1); } ENDCG } } }
如下图所示,你会发现无论怎么复制,SetPass Call永远不会变。因为它渲染的shader没有变,所以渲染状态也不需要变。但是由于shader有两个不同的pass所以无法进行动态合批,那么自然每添加一个对象,DrawCall就会增加两个了。
8)Shadow casters:场景中参与投射阴影物体的数量,也就是Mesh Renderer组件上的Cast Shadow的,如果选择On,那么这里就会+1。
9)Visible skinned meshes animations :当前渲染蒙皮的数量,以及播放动画的数量。
如下图所示,我们来正式的看看Profiler的Rendering面板。左上方面板中的Batches、SetPass Calls 、Triangles、Vertices这些前面我们都已经解释过了,这里就不再赘述。
详细说下下面面板中的内容
1)Dynamic Batching :动态合批其实就是在CPU先将Mesh动态合并好,然后在一次性送进GPU。如果Mesh特别的大,那么动态合批肯定就非常慢了。所以Unity的动态合批是有要求的,只有顶点属性和1套UV限制900顶点以内,在增加法线后限制300顶点以内,在增加2套UV、切线限制180顶点以内。总结一下就是用CPU来换drawcall。
2)Static Batching:静态合批,就是游戏对象勾选static属性。这样打包的时候就会提前生成一个大的mesh,总结一下就是用包体大小来换drawcall。
3)Instancing:GPU Instancing技术,同mesh、同材质、同shader、同参数。一般可用来做草、石头,比较坑的是不支持lightingmap,unity2018支持了lightingmap 但是需要开启实时GI.
4)Used Textures:当前使用到的贴图数量。
5)RenderTexture Switches :RT数量。
6)VRAM USAGE: 显存使用量。
7)VBO:全称Vertex Buffer Objects(顶点缓冲对象)从CPU发送顶点数据到GPU时比较慢的,如果一个一个发实在太慢了。所以先将渲染的顶点都保存到VBO中,在一次性发给显存给顶点着色器使用。
8)VB uploads: 顶点对象上传的大小。
9)IB uploads:有了VBO其实我们还需要有IBO(索引缓冲对象)记录三角形正确的索引顺序,这里表示上传它的大小。
10)Shadow castes:阴影投射数量。
总结一下,渲染是个大麻烦尤其是现在的手机,稍微加点压力就开始发热。
Okay~ Rendering已经介绍完毕,下一篇我们将继续介绍其他性能面板窗口。
Tags:
雨松MOMO
程序员 - Programmer
17
Comments
y
ylaier
a year ago
不错,把错别字改了更好
0
Wu Xiaomu
a year ago
Programmer
为了CJ门票和外滩之夜门票和Unity周边!
0
hua2
2 years ago
good
1