既然要优化,肯定要有个目标:
pc上一般要求:一秒渲染60帧
移动端:一秒渲染30帧
这应该是最低的要求,如果游戏运行时,游戏帧率有变化,人眼能够明显的感觉到帧率下降。
优化的首要规则是找到性能问题的所在。
一般出现问题不是在cpu就是gpu。
unity内置了性能检测工具,
可以在Window->Analysis->Profiler 打开,由于在编辑器内调试准确率有问题,一般推荐打包调试
打包调试记得开启调试模式,并开启自动连接调试器并支持深度调试,这样等打包完成自动打开场景时,unity会自动连接profiler,省得我们自己去连接。
上图为跑了一些帧后的每帧时间占用。
我们还可以在这里切换成Hierarchy模式查看每个函数列表耗时。当你选择函数时,上面图标也会高亮相关内容。
这一块可以看到每一部分占用的时间,左侧为什么类型,右侧是占用时间的变化,点击选择一帧。
在下面会看主要分了三大部分,这一帧总耗时16.74ms
左侧是代码逻辑部分占用时间,我这个测试项目没有多少逻辑占用,所以性能占用很少。中间这一部分是调用渲染占用时间,可以看到占用了2.15ms,然后是最后的同步占用时间13.61ms。相当于电脑可以一直按满帧率去跑。
如果脚本的问题话,需要让程序去排查,TA一般需要查看右边的两部分问题。
多线程的我们还可以看到渲染线程给我们分出来了,让我们查看渲染线程做的操作。灰色的部分是在等待主线程耗时上面会显示Gfx.WaitForGfxCommandsFromMainThread,而蓝色部分为实际渲染时的批次提交耗时。而在urp渲染管线,后处理的操作是在主线程做的。
上图可以看到,应该是我开启了垂直同步,导致同步时间过长,如果在排查问题,推荐将垂直同步关闭。让其使用最大性能运算。
上图为关闭了垂直同步后的视图,为每帧真实的渲染时间。但是你看画面会有撕裂感,这也是垂直同步带来的好处,调试时,我们是可以关闭的。
在cpu上,每帧需要处理的事情:
在gpu上,影响gpu渲染效率的是像素填充率(filling rate),填充率=屏幕像素Shader复杂度Overdraw,可以影响到效率的主要内容有: