unity 渲染性能分析工具
目标
既然要优化,肯定要有个目标:
pc上一般要求:一秒渲染60帧
移动端:一秒渲染30帧
这应该是最低的要求,如果游戏运行时,游戏帧率有变化,人眼能够明显的感觉到帧率下降。
优化的首要规则是找到性能问题的所在。
一般出现问题不是在cpu就是gpu。
profiler
unity内置了性能检测工具,
可以在Window->Analysis->Profiler 打开,由于在编辑器内调试准确率有问题,一般推荐打包调试
打包调试记得开启调试模式,并开启自动连接调试器并支持深度调试,这样等打包完成自动打开场景时,unity会自动连接profiler,省得我们自己去连接。
上图为跑了一些帧后的每帧时间占用。
我们还可以在这里切换成Hierarchy模式查看每个函数列表耗时。当你选择函数时,上面图标也会高亮相关内容。
这一块可以看到每一部分占用的时间,左侧为什么类型,右侧是占用时间的变化,点击选择一帧。
在下面会看主要分了三大部分,这一帧总耗时16.74ms
左侧是代码逻辑部分占用时间,我这个测试项目没有多少逻辑占用,所以性能占用很少。中间这一部分是调用渲染占用时间,可以看到占用了2.15ms,然后是最后的同步占用时间13.61ms。相当于电脑可以一直按满帧率去跑。
如果脚本的问题话,需要让程序去排查,TA一般需要查看右边的两部分问题。
多线程的我们还可以看到渲染线程给我们分出来了,让我们查看渲染线程做的操作。灰色的部分是在等待主线程耗时上面会显示Gfx.WaitForGfxCommandsFromMainThread,而蓝色部分为实际渲染时的批次提交耗时。而在urp渲染管线,后处理的操作是在主线程做的。
上图可以看到,应该是我开启了垂直同步,导致同步时间过长,如果在排查问题,推荐将垂直同步关闭。让其使用最大性能运算。
上图为关闭了垂直同步后的视图,为每帧真实的渲染时间。但是你看画面会有撕裂感,这也是垂直同步带来的好处,调试时,我们是可以关闭的。
每帧渲染
在cpu上,每帧需要处理的事情:
- 逻辑相关:脚本,物理,动画
- 渲染:剔除,排序,绘制
- DrawCall包含了单个玩个的数据以及相关的渲染信息纹理矩阵等,然后提交渲染的命令
- SetPassCall用来设置用于渲染网格材质的所有渲染状态数据,
- Batches是包含了一个共享顶点和索引的缓冲区数据包,不用提交顶点数据,速度很快,批处理的意义在于减少了渲染状态的切换,它不能减少DrawCall,但是可以减少其它状态的切换,相对来说调用DrawCall的耗时比SetPassCall耗时更少。
- 同步:同步的问题一般会有垂直同步和帧率限制的问题,同步时都会有等待的状态,
- 垂直同步是在你的渲染帧率高于屏幕显示器最高帧率时,它会自动限制帧率和显示器保持同步。
- 帧率限制也是为了保证每秒的帧率平衡,不产生撕裂感。
- 如果同步里出现WaitForTargetFPS,是因为垂直同步的问题,调试时不建议开启。
- 如果出现GfxDeviceD3D11.WaitForLastPresent,表明CPU所有线程已经完成任务,正等待CPU,可能存在gpu性能瓶颈。
- 如果出现Gfx.WaitForPresentOnGfxThread,表示主线程已经完成非渲染任务,正在等待渲染线程,但渲染线程尚未完成。1. 若此时渲染线程正在进行Camera.Render,并且Camera.Render耗时过高,则表明性能瓶颈在cpu端渲染部分。2. 若此时渲染线程正在进行Gfx.PresentFrame,则表明性能瓶颈在gpu端。
在gpu上,影响gpu渲染效率的是像素填充率(filling rate),填充率=屏幕像素Shader复杂度Overdraw,可以影响到效率的主要内容有:
- 屏幕分辨率
- 后处理效果
- Shader复杂度
- Overdraw 重复绘制,指屏幕的同一像素进行多次绘制,一般是因为
- 带宽瓶颈:内存带宽是指gpu可以读取和写入内存的速率。当gpu当前渲染数量太大,内存无法及时传输给gpu,会造成等待耗时。常见情况在延迟渲染中常驻Gbuffer及各种缓冲区和RT,占用内存非常大,并且一直在读写。移动平台gpu的带宽性能和纹理处理能力比较低,需要注意此问题,这也是移动端很少使用延迟渲染的原因。
- 同屏三角面数,顶点数,为什么顶点的影响小,可以这样计算,一张1k的图片就是一百万个像素,而一百万个顶点的模型我们很少用。
总结一下:区分问题哪里的问题看同步的那几个函数,而在gpu上,主要看像素的计算量,屏幕分辨率是主要原因,屏幕像素渲染量是指数增加,后处理也是基于屏幕分辨率计算的,而半透明是因为模型所处的区域全部需要绘制,因为它的渲染顺序是基于相机的位置从远到近绘制的,没有被半透明遮挡的位置全部需要绘制。我们可以感觉到gpu上的计算量非常的大,毕竟每个像素都需要跑一次片元着色器内的内容。
性能分析工具
- unity内置的Profiler 上面讲的
- FrameDebugger 帧调试器,主要渲染效果调试,查看当前每帧渲染的内容
- FPS Counter 场景组件,可以直接添加到场景内,查看渲染情况
- UPR unity官方提供的性能工具 UWA 第三方专业做性能的公司
- RenderDoc 截帧工具 XCode 是ios平台使用的调试工具,一般调试苹果手机使用
场景优化
- 场景结构,层级推荐不要太复杂,动态生成的直接放在Root下面。
- 尽量使用Profab,而不是直接使用GameObject。
- Shader通用一套,保证物体使用同一个Shader,这是合批的前提。
- LightMap推荐2048,数量太多会影响合批。
- 检查ReflectionProbe,它也会影响合批
- 对静态物体尽量保证材质球共有,图片合并
- 对大量的树,草,石头使用GPU Instancing
- 检查剩余物体是否能够srp合批。
- 检查最终资源的是否有占用过大的情况
- 根据同屏面数确定是否使用LOD
- 优化场景Shader以及光照和阴影设置。
unity 渲染性能分析工具相关推荐
- sar 找出系统瓶颈的利器 目前Linux上最为全面的系统性能分析工具之一 直接 sar -dur 1 30 即可看内存 CPU和IO占用...
12. sar 找出系统瓶颈的利器 sar是System Activity Reporter(系统活动情况报告)的缩写.sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行 ...
- Web应用性能分析工具—HAR文件
Web应用性能分析工具-HAR文件 来源 https://raynorli.com/2018/06/11/web-performance-analysis-har-file/ 客户经常有的一个问题就是 ...
- Unity推出2D工具:不再只是3D引擎
本文来自 GameLook ,转载自觉标明原文出处,以示尊重! 原文:http://www.gamelook.com.cn/2013/08/128864 GameLook报道/2013 Unity全球 ...
- Unity TileMap 2D 工具基础教程
Unity TileMap 2D 工具基础教程 Unity TileMap 2D 工具基础教程 TileMap 工程创建 Sprite Editor 工具使用 TileMap 功能说明 TilePal ...
- Unity编辑器小工具——文件查重(MD5)
Unity编辑器小工具--文件查重(MD5) 算法思想: 在Unity中,每一个不同资源.文件所生成MD5码是不同的,但是相同文件,路径不同.文件名不同的同一类文件的MD5码是相同的,所以可以通过生成 ...
- Unity游戏开发工具的下载与安装
Unity游戏开发工具 Visual Studio下载 UnityHub的下载 Visual Studio下载 打开网址https://visualstudio.microsoft.com/zh-ha ...
- Unity实用小工具或脚本—以对象方式访问MySql数据库
一.前言 以对象方式处理MySql数据库顾名思义就是可以将每个数据库表作为一个类,没一条数据作为一个对象来进行操作,大致思路和我上一篇文章类似,这里不再赘述.文章后有资源下载地址,所使 ...
- Unity 可视化编辑工具 树节点 Tree Node Editor 四
Unity 可视化编辑工具 树节点 Tree Node Editor 四 接上一篇Unity Behavior Tree Editor 行为树编辑器实现 三 上一篇主要讲解编辑器的使用,像关于自定义条 ...
- Unity实用小工具或脚本——录屏工具
一.前言 本文要讲的录屏不是使用Unity自带的那个截屏方法,因为unity自带的都只能截取unity程序本身显示的画面内容,至于unity程序之外的内容,如电脑桌面上的其他的程序内容是无法录屏的.本 ...
最新文章
- java安装_我最喜欢的Java高级开发人员书籍
- openFeign 服务接口的调用03—— OpenFeign 超时控制
- ecshop 整合 QQ登陆 和 支付宝快捷登陆代码
- 网易MCtalk Live:漫谈短视频平台概况,全面解读头部内容
- 云网管—云上构建网络自动化体系
- 快速解决MariaDB无密码就可以登录的问题
- 梅花传播业大展:Focussend将精准营销融入个性化邮件
- java中null+和null+null的深入理解
- 51单片机实现蜂鸣器报警
- Auto CAD 批量转PDF、批量打印使用方法
- 高项考试-信息化知识
- 【软件工具使用】Ubuntu下高效工作工具使用(持续更新)
- Chrome扩展、装逼神器:Vimium
- javascript 去掉html标签,js怎么去掉html标签
- 光模块价格由带宽还是距离决定_广州单模光模块价格
- 二级c语言程序基础知识,计算机二级《C语言》基本知识点
- 牛客 牛牛与LCM(LCM)
- python使用loaddata_Python data.load_data方法代码示例
- [高性能MySQL]-事务与隔离界别
- 解决中国大学MOOC遮挡字幕问题
热门文章
- flutter的返回上一页功能
- “大厂面试很难吗,我觉着还行啊”,Android开发4+年,面试网易定薪25k*14.5,涨薪50%!
- APPUI 自动化测试-----常见面试题汇总
- DNS SERVICE配置-winserver1
- Python+uiautomator2实现自动刷抖音视频
- “再见了,b站!!”
- mtk使用android开关机动画,Android9.0 MTK 平板横屏方案修改(强制app横屏 + 开机logo/动画+关机充电横屏 + RecoveryUI 横屏)...
- uni-app 25后端api开发和前后端交互(51-60)
- File zilla远程连接服务器报错:服务器发回了不可路由的地址,使用服务器地址代替...
- 【开发技巧】-- SpringBoot使用LogBook打印http请求、响应信息