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上,每帧需要处理的事情:

  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以及光照和阴影设置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/24239.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV实战(20)——图像投影关系

OpenCV实战(20)——图像投影关系 0. 前言1. 相机成像原理2. 图像对的基本矩阵3. 完整代码小结系列链接0. 前言 数码相机通过将光线通过镜头投射到图像传感器上来捕捉场景产生图像。由于通过将 3D 场景投影到 2D 平面上形成图像,因此场景与其图像之间以及同一场景的不同图像…

vscode远程到服务器(包括WSL)进行GDB调试

工欲善其事必先利其器,这句话不容小觑,调试工具做的好,对开发工作可起到事半功倍。 本文主要讲vscode远程到服务器进行在线GDB调试手段,包含对WSL的远程调试,可以轻松对照源码进行应用程序调试。 文章目录 一、vscode…

损失函数——交叉熵损失(Cross-entropy loss)

交叉熵损失(Cross-entropy loss)是深度学习中常用的一种损失函数,通常用于分类问题。它衡量了模型预测结果与实际结果之间的差距,是优化模型参数的关键指标之一。以下是交叉熵损失的详细介绍。 假设我们有一个分类问题&#xff0…

L-shape 方法

L-shape 方法是求解两阶段随机规划的一种常用方法,基本思想是利用切平面将第二阶段的反馈函数线性化,在构造切平面条件时有点类似 bender’s 方法。 注:这个图形中黑实线 Q ( x ) \mathcal{Q}(x) Q(x) 就是下面模型中的 L ( x ) \mathscr{L…

为什么要用线程池?

线程池是一种管理和复用线程资源的机制,它由一个线程池管理器和一组工作线程组成。线程池管理器负责创建和销毁线程池,以及管理线程池中的工作线程。工作线程则负责执行具体的任务。 线程池的主要作用是管理和复用线程资源,避免了线程的频繁…

IOS开发指南之自定义TableViewCell使用

演示效果: 1.自定义TableViewCell创建 File->new->File... 在iOS模板中选择Empty来创建一个空的XIB文件,然后点击下一步 输入XIB文件名Cell,然后点击Create创建 创建XIB文件成功后如下: 同时按钮Shift+command+L弹出库,然后输入 table筛选,选择Table View Cell 拖到下…

LSP:里氏替换原则

系列文章目录 C高性能优化编程系列 深入理解设计原则系列 深入理解设计模式系列 高级C并发线程编程 LSP:里氏替换原则 系列文章目录1、里氏替换原则的定义和解读2、里氏替换原则可以用于哪些设计模式中?3、如何使用里氏替换原则来降低代码耦合度&#…

ChatGPT原理简介

承接上文GPT前2代版本简介 GPT3的基本思想 GPT2没有引起多大轰动,真正改变NLP格局的是第三代版本。 GPT3训练的数据包罗万象,上通天文下知地理,所以它会胡说八道,会说的贼离谱,比如让你穿越到唐代跟李白对诗,不在一…

windows里怎么杀死一个进程?

我们可以使用 taskkill 命令,可以使用该工具按照进程 ID (PID) 或映像名称终止任务。 显示帮助消息: taskkill /?参数列表: /S:system:指定要连接的远程系统。/U:[domain\]user:指定应该在哪…

第五篇:强化学习基础之马尔科夫决策过程

你好,我是zhenguo(郭震) 今天总结强化学习第五篇:马尔科夫决策过程 基础 马尔科夫决策过程(MDP)是强化学习的基础之一。下面统一称为:MDP MDP提供了描述序贯决策问题的数学框架。 它将决策问题建模为: 状态…

7种PCB走线方式

01电源布局布线相关 数字电路很多时候需要的电流是不连续的,所以对一些高速器件就会产生浪涌电流。 如果电源走线很长,则由于浪涌电流的存在进而会导致高频噪声,而此高频噪声会引入到其他信号中去。 而在高速电路中必然会存在寄生电感和寄…

STM32G4 比较器COMPx(寄存器开发)

目录 1. 特性1.1 框图1.2 比较器输入信号SEL1.3 比较器滞回选择HYST1.4 比较器的输出1.5 LOCK机制 2. 编程2.1 初始化步骤2.2 举例 STM内部的比较器是模拟量的比较器,其与APB2时钟同步,在RCC时钟控制器中没有COMx时钟使能标志位,其时钟的使能…

RTOS专栏(一) —— rt-thread简单介绍和qemu使用

本期主题: 简单介绍rt-thread介绍qemu和rt-thread怎么配合使用qemu的简单例子 rt-thread & qemu 1.rt-thread介绍2.qemu介绍3.搭建rt-thread和qemu开发环境4.简单例子 1.rt-thread介绍 RT-Thread 是一款完全由国内团队开发维护的嵌入式实时操作系统&#xff0…

JAVA POI excel 添加下拉字典的方式与案例 以及图文详解及个人理解

场景 原有的Excel 某一个 sheet 页中某些列需要添加指定的字典下拉,而这些字典的值又是确认的。 有两种思路: 一、如果给定的下拉字典值是确定的而且关联原有列的位置也不会变,那么这些数据可以固定写死在代码中,也是最简单的一…

北邮22信通:利用BF算法解决实际问题:题目实战(超详解)设计函数 char *locatesubstr(char *str1,char *str2)

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 获取更多文章 请访问专栏~ 北邮22信通_青山如墨雨如画的博客-CSDN博客 目录 题干描述 解析 1.string库函数 2.使用KMP算法思想 注解1 注解2 注解3 题…

学懂缓存雪崩,缓存击穿,缓存穿透仅需一篇,基于Redis讲解

在了解缓存雪崩、击穿、穿透这三个问题前,我们需要知道为什么我们需要缓存。在了解这三个问题后,我们也必须知道使用Redis时,如何解决这些问题。 所以我将按照"为什么我们需要缓存"、"什么是缓存雪崩、击穿、穿透"、&qu…

​字创未来 方正字库第十二届“方正奖”设计大赛正式来袭

传承汉字文化精髓,方正字库在字体行业不断探索深耕。方正字库一直致力于弘扬中华汉字文化,不断促进行业字体设计创新发展。于2001年在行业最艰难的时候,怀揣着对字体设计未来的美好向往,首届“北大方正奖”印刷字体设计大赛&#…

家政服务预约APP的系统设计与实现

摘 要:针对家政行业蓬勃发展,老套的家政服务方式已经跟不上互联网时代的步伐这个问题。基于Android移动平台的分析和设计过程、C/S模式、Eclipse平台,采用Java语言进行开发设计,设计了基于MVC架构的实现方案。安卓客户端与服务器…

Flume系列:Flume通道拓扑结构

目录 Apache Hadoop生态-目录汇总-持续更新 1: 基础架构 2:简单串联 3:复制(Replicating)和多路复用(Multiplexing) 4:负载均衡和故障转移 5:聚合 Apache Hadoop生态-目录汇总-持续更新 系统环境:centos7 Java环境…

IDEA 创建 Springmvc 项目

一、概述 在18年的时候就开始接触 SpringBoot ,然后就一直在使用它。众所周知 SpringBoot 内嵌 Tomcat,后续再也没有单独新建过Web 项目。作为IDEA 的用户,总想要用它来建一个Web 项目自己跑一跑,但建项目不是我最终目的~~ &…