目标

既然要优化,肯定要有个目标:
pc上一般要求:一秒渲染60帧
移动端:一秒渲染30帧
这应该是最低的要求,如果游戏运行时,游戏帧率有变化,人眼能够明显的感觉到帧率下降。
优化的首要规则是找到性能问题的所在。
一般出现问题不是在cpu就是gpu。

profiler

unity内置了性能检测工具,

可以在Window->Analysis->Profiler 打开,由于在编辑器内调试准确率有问题,一般推荐打包调试

打包调试记得开启调试模式,并开启自动连接调试器并支持深度调试,这样等打包完成自动打开场景时,unity会自动连接profiler,省得我们自己去连接。

上图为跑了一些帧后的每帧时间占用。

我们还可以在这里切换成Hierarchy模式查看每个函数列表耗时。当你选择函数时,上面图标也会高亮相关内容。

这一块可以看到每一部分占用的时间,左侧为什么类型,右侧是占用时间的变化,点击选择一帧。

在下面会看主要分了三大部分,这一帧总耗时16.74ms
左侧是代码逻辑部分占用时间,我这个测试项目没有多少逻辑占用,所以性能占用很少。中间这一部分是调用渲染占用时间,可以看到占用了2.15ms,然后是最后的同步占用时间13.61ms。相当于电脑可以一直按满帧率去跑。
如果脚本的问题话,需要让程序去排查,TA一般需要查看右边的两部分问题。

多线程的我们还可以看到渲染线程给我们分出来了,让我们查看渲染线程做的操作。灰色的部分是在等待主线程耗时上面会显示Gfx.WaitForGfxCommandsFromMainThread,而蓝色部分为实际渲染时的批次提交耗时。而在urp渲染管线,后处理的操作是在主线程做的。

上图可以看到,应该是我开启了垂直同步,导致同步时间过长,如果在排查问题,推荐将垂直同步关闭。让其使用最大性能运算。

上图为关闭了垂直同步后的视图,为每帧真实的渲染时间。但是你看画面会有撕裂感,这也是垂直同步带来的好处,调试时,我们是可以关闭的。

每帧渲染

在cpu上,每帧需要处理的事情:

  1. 逻辑相关:脚本,物理,动画
  2. 渲染:剔除,排序,绘制
    • DrawCall包含了单个玩个的数据以及相关的渲染信息纹理矩阵等,然后提交渲染的命令
    • SetPassCall用来设置用于渲染网格材质的所有渲染状态数据,
    • Batches是包含了一个共享顶点和索引的缓冲区数据包,不用提交顶点数据,速度很快,批处理的意义在于减少了渲染状态的切换,它不能减少DrawCall,但是可以减少其它状态的切换,相对来说调用DrawCall的耗时比SetPassCall耗时更少。
  3. 同步:同步的问题一般会有垂直同步和帧率限制的问题,同步时都会有等待的状态,
    • 垂直同步是在你的渲染帧率高于屏幕显示器最高帧率时,它会自动限制帧率和显示器保持同步。
    • 帧率限制也是为了保证每秒的帧率平衡,不产生撕裂感。
    • 如果同步里出现WaitForTargetFPS,是因为垂直同步的问题,调试时不建议开启。
    • 如果出现GfxDeviceD3D11.WaitForLastPresent,表明CPU所有线程已经完成任务,正等待CPU,可能存在gpu性能瓶颈。
    • 如果出现Gfx.WaitForPresentOnGfxThread,表示主线程已经完成非渲染任务,正在等待渲染线程,但渲染线程尚未完成。1. 若此时渲染线程正在进行Camera.Render,并且Camera.Render耗时过高,则表明性能瓶颈在cpu端渲染部分。2. 若此时渲染线程正在进行Gfx.PresentFrame,则表明性能瓶颈在gpu端。

在gpu上,影响gpu渲染效率的是像素填充率(filling rate),填充率=屏幕像素Shader复杂度Overdraw,可以影响到效率的主要内容有:

  1. 屏幕分辨率
  2. 后处理效果
  3. Shader复杂度
  4. Overdraw 重复绘制,指屏幕的同一像素进行多次绘制,一般是因为
  5. 带宽瓶颈:内存带宽是指gpu可以读取和写入内存的速率。当gpu当前渲染数量太大,内存无法及时传输给gpu,会造成等待耗时。常见情况在延迟渲染中常驻Gbuffer及各种缓冲区和RT,占用内存非常大,并且一直在读写。移动平台gpu的带宽性能和纹理处理能力比较低,需要注意此问题,这也是移动端很少使用延迟渲染的原因。
  6. 同屏三角面数,顶点数,为什么顶点的影响小,可以这样计算,一张1k的图片就是一百万个像素,而一百万个顶点的模型我们很少用。
    总结一下:区分问题哪里的问题看同步的那几个函数,而在gpu上,主要看像素的计算量,屏幕分辨率是主要原因,屏幕像素渲染量是指数增加,后处理也是基于屏幕分辨率计算的,而半透明是因为模型所处的区域全部需要绘制,因为它的渲染顺序是基于相机的位置从远到近绘制的,没有被半透明遮挡的位置全部需要绘制。我们可以感觉到gpu上的计算量非常的大,毕竟每个像素都需要跑一次片元着色器内的内容。

性能分析工具

  1. unity内置的Profiler 上面讲的
  2. FrameDebugger 帧调试器,主要渲染效果调试,查看当前每帧渲染的内容
  3. FPS Counter 场景组件,可以直接添加到场景内,查看渲染情况
  4. UPR unity官方提供的性能工具 UWA 第三方专业做性能的公司
  5. RenderDoc 截帧工具 XCode 是ios平台使用的调试工具,一般调试苹果手机使用

场景优化

  1. 场景结构,层级推荐不要太复杂,动态生成的直接放在Root下面。
  2. 尽量使用Profab,而不是直接使用GameObject。
  3. Shader通用一套,保证物体使用同一个Shader,这是合批的前提。
  4. LightMap推荐2048,数量太多会影响合批。
  5. 检查ReflectionProbe,它也会影响合批
  6. 对静态物体尽量保证材质球共有,图片合并
  7. 对大量的树,草,石头使用GPU Instancing
  8. 检查剩余物体是否能够srp合批。
  9. 检查最终资源的是否有占用过大的情况
  10. 根据同屏面数确定是否使用LOD
  11. 优化场景Shader以及光照和阴影设置。

unity 渲染性能分析工具相关推荐

  1. sar 找出系统瓶颈的利器 目前Linux上最为全面的系统性能分析工具之一 直接 sar -dur 1 30 即可看内存 CPU和IO占用...

    12. sar 找出系统瓶颈的利器 sar是System Activity Reporter(系统活动情况报告)的缩写.sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行 ...

  2. Web应用性能分析工具—HAR文件

    Web应用性能分析工具-HAR文件 来源 https://raynorli.com/2018/06/11/web-performance-analysis-har-file/ 客户经常有的一个问题就是 ...

  3. Unity推出2D工具:不再只是3D引擎

    本文来自 GameLook ,转载自觉标明原文出处,以示尊重! 原文:http://www.gamelook.com.cn/2013/08/128864 GameLook报道/2013 Unity全球 ...

  4. Unity TileMap 2D 工具基础教程

    Unity TileMap 2D 工具基础教程 Unity TileMap 2D 工具基础教程 TileMap 工程创建 Sprite Editor 工具使用 TileMap 功能说明 TilePal ...

  5. Unity编辑器小工具——文件查重(MD5)

    Unity编辑器小工具--文件查重(MD5) 算法思想: 在Unity中,每一个不同资源.文件所生成MD5码是不同的,但是相同文件,路径不同.文件名不同的同一类文件的MD5码是相同的,所以可以通过生成 ...

  6. Unity游戏开发工具的下载与安装

    Unity游戏开发工具 Visual Studio下载 UnityHub的下载 Visual Studio下载 打开网址https://visualstudio.microsoft.com/zh-ha ...

  7. Unity实用小工具或脚本—以对象方式访问MySql数据库

    一.前言         以对象方式处理MySql数据库顾名思义就是可以将每个数据库表作为一个类,没一条数据作为一个对象来进行操作,大致思路和我上一篇文章类似,这里不再赘述.文章后有资源下载地址,所使 ...

  8. Unity 可视化编辑工具 树节点 Tree Node Editor 四

    Unity 可视化编辑工具 树节点 Tree Node Editor 四 接上一篇Unity Behavior Tree Editor 行为树编辑器实现 三 上一篇主要讲解编辑器的使用,像关于自定义条 ...

  9. Unity实用小工具或脚本——录屏工具

    一.前言 本文要讲的录屏不是使用Unity自带的那个截屏方法,因为unity自带的都只能截取unity程序本身显示的画面内容,至于unity程序之外的内容,如电脑桌面上的其他的程序内容是无法录屏的.本 ...

最新文章

  1. Python Qt GUI设计:窗口布局管理方法【基础】(基础篇—5)
  2. 如何使用有限的数据来训练 GANs?
  3. “大树底下”的阿里电商 淘品牌的“配角变名角”
  4. OpenCV视频加速Video acceleration的实例(附完整代码)
  5. 人工计算机的相关信息,第三届计算机信息科学与人工智能国际学术会议(CISAI 2020)...
  6. 5.微服务设计 --- 分解单块系统
  7. php中有关目录的几个函数 basename() dirname() pathinfo()
  8. Tomcat热部署(linux服务器)
  9. 阿里云ACP云计算认证有用吗?
  10. Everything+Wox介绍和使用方式
  11. verilog学习笔记:简单的数据选择器modelsim仿真
  12. springboot访问下载/resource/static下的静态资源;下载excel文件损坏,打不开
  13. 你会使用Excel中的【照相机】吗?
  14. 推箱子 | Java课程设计
  15. java程序设计课程培训心得体会_20165226 2017-2018-2《Java程序设计》课程总结
  16. NDS游戏与FLASH游戏
  17. 全国计算机二级office考试选择题知识汇总
  18. CAD ObjectARX扩展工具的源码(一)
  19. 从0开始的OpenGL学习(九)-FPS摄像机
  20. python积分计算高等数学_Python与高等数学之Python与积分!用Python学数学

热门文章

  1. word添加日期快捷键当前时间不自动更新
  2. 计算机网络基础复用,计算机网络基础:数据通信技术之频分复用与时分复用技术...
  3. 4月4号服务器维护什么时候结束,绝地求生维护更新到什么时候结束 4月28日正式服维护公告一览...
  4. iOS一套代码适配所有iPhone手机布局实现方案
  5. JavaScript——JSON数据和解析
  6. IP地址的划分、分配
  7. idea 取消自动导入包
  8. C++ 标准库读书杂记6 Tuple
  9. 前端面试真题系列(一)-李游Leo-专题视频课程
  10. 不用代码html表格边框,让表格table呈现边框,不用给tr、td加边框的写法