Unity渲染性能分析
本文是参考了catlike的博客做的要点和笔记原文链接:Measuring Performance (catlikecoding.com)
<hr/>
名词解释:
1. VSync:中文名词为垂直同步(Vertical Synchronization),一种源于CRT显示器的名词。指示着前一帧的结束和新一帧的开始。对于高速运动的游戏,例如FPS游戏,当FPS数超过显示器的刷新率时会造成画面撕裂现象。垂直同步可以限制FPS为刷新率,因而防止画面撕裂。
2. thread:线程。可以理解为子进程。可以有多个线程并行操作。
3. SRP Batch:批处理。在渲染中常拖后腿的都是CPU,因为CPU Draw Call提供命令的速度赶不上GPU处理命令的速度。批处理合并网格发送给GPU,减少Draw Call的次数。UPR默认使用批处理。
<hr/>过程记录:
写了一个简易脚本生成了1000个球体,分别用URP和BRP渲染:
URP + SRP Batcher
URP
BRP
BRP + Dynamic Batching
整体上,URP比BRP性能更好一些,减少2/3的Batches。但是不管是SRP batching还是Dynamic对渲染的优化效果都不好,可能因为球模型不适合批处理。修改脚本,将1000个球体改为1000个正方体,再次渲染。
URP + SRP batcher
URP
BRP
BRP + Dynamic Batching
dynamic batching直接减少了36438个Batches,只剩下了49个batches。帧数也由67帧提升到了94帧。
URP + GPU instancing
BRP + GPU Instancing
GPU instance可以实例化相同的材质和网格并通过矩阵位移,对于重复的物体比如树木石头等很有效。(与SRP不兼容)batches数量由8000多减少到34。
接下来利用Frame debug探讨Dynamic batching和GPU instancing的区别。
先看BRP不加Dynamic batching
BRP
draw calls一共有36491个主要在DepthPass.Job,Shadows.RenderJobDir和RenderForward.RenderLoopJob里。
再看Dynamic batching
BRP + Dynamic batching
上述三个命令调用的draw calls分别减少到10,26,10,极大改善了CPU-GPU通讯的开销。
接下来看GPU instancing
BRP + GPU instancing
上述三个命令调用的draw calls分别减少到16,41,16。Dynamic batching不会减少shadowmap的draw calls,因此对于URP来说作用不大(存疑)。
URP
URP + Dynamic batching
URP + GPU instancing
URP + SRP batcher
可能我的Unity是2021版本的,和开头链接里的2020版本不同,我的Dynamic batching和SRP batcher command hierarcy一模一样。
后面是利用Profiler对渲染资源的具体信息,
In Play Mode:
BRP
URP
这里略显复杂,而且和原文中的不太一样(看不太懂)日后再研究。Editor会增加CPU开销,Build后可以更准确的显示游戏的资源。
有时候不需要过于详细的数据,只需要游戏帧数就可以大概了解到渲染性能。
跟随教程写了一个简单显示FPS的脚本
URP
Unity UI Text strings 是物体类型,每次调用SetText函数都会产生一个新物体。造成上图中URP 32B的空间分配。
BRP
BRP会有382B的内存分配。随着UI更新内存会增加到6.7KB,虽然不多,但是会积累,最后触发Garbage collection垃圾回收机制(GC),最终会导致一些地方出现帧数尖刺。不过SetText和UI update只会再Edit模式这样分配内存。如果执行build后只会有初始分配的内存,不会变多。所以执行build很重要。
函数可视化
https://www.zhihu.com/video/1531301383928475649
上面视频是前面教程中的函数可视化内容。利用profiler对其进行分析。
torus到wave
wave函数比torus所占用的cpu资源更少。
写一个切换函数脚本,观察script占用资源
自动切换的函数可视化
https://www.zhihu.com/video/1531359305659359232
分析资源消耗
在函数切换时加入Lerp,看起来非常炫酷
加入lerp
https://www.zhihu.com/video/1531384735473688577
资源消耗
可以看到在lerp调用的时候占用的资源比较多,因为进行了很多 https://www.zhihu.com/equation?tex=3x%5E%7B2%7D+-+2x%5E%7B3%7D 插值运算。
<hr/>终于学完了这部分内容,小小的感慨一下。
页:
[1]