xiaozongpeng 发表于 2022-7-22 09:52

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]
查看完整版本: Unity渲染性能分析