目标

既然要优化,肯定要有个目标:
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. java安装_我最喜欢的Java高级开发人员书籍
  2. openFeign 服务接口的调用03—— OpenFeign 超时控制
  3. ecshop 整合 QQ登陆 和 支付宝快捷登陆代码
  4. 网易MCtalk Live:漫谈短视频平台概况,全面解读头部内容
  5. 云网管—云上构建网络自动化体系
  6. 快速解决MariaDB无密码就可以登录的问题
  7. 梅花传播业大展:Focussend将精准营销融入个性化邮件
  8. java中null+和null+null的深入理解
  9. 51单片机实现蜂鸣器报警
  10. Auto CAD 批量转PDF、批量打印使用方法
  11. 高项考试-信息化知识
  12. 【软件工具使用】Ubuntu下高效工作工具使用(持续更新)
  13. Chrome扩展、装逼神器:Vimium
  14. javascript 去掉html标签,js怎么去掉html标签
  15. 光模块价格由带宽还是距离决定_广州单模光模块价格
  16. 二级c语言程序基础知识,计算机二级《C语言》基本知识点
  17. 牛客 牛牛与LCM(LCM)
  18. python使用loaddata_Python data.load_data方法代码示例
  19. [高性能MySQL]-事务与隔离界别
  20. 解决中国大学MOOC遮挡字幕问题

热门文章

  1. flutter的返回上一页功能
  2. “大厂面试很难吗,我觉着还行啊”,Android开发4+年,面试网易定薪25k*14.5,涨薪50%!
  3. APPUI 自动化测试-----常见面试题汇总
  4. DNS SERVICE配置-winserver1
  5. Python+uiautomator2实现自动刷抖音视频
  6. “再见了,b站!!”
  7. mtk使用android开关机动画,Android9.0 MTK 平板横屏方案修改(强制app横屏 + 开机logo/动画+关机充电横屏 + RecoveryUI 横屏)...
  8. uni-app 25后端api开发和前后端交互(51-60)
  9. File zilla远程连接服务器报错:服务器发回了不可路由的地址,使用服务器地址代替...
  10. 【开发技巧】-- SpringBoot使用LogBook打印http请求、响应信息