Unity渲染性能优化总纲
概述
本篇是Unity渲染性能优化官方文档中的渲染性能优化总纲,主要是让我们知道从哪些方面着手优化,都有哪些优化手段。
在优化之前要先定位出问题所在
在我们进行优化之前,要先分析出我们的应用的性能问题出在哪里。如果我们没有找出真正问题所在之前,就直接进行优化,很可能这部分优化工作是无效的,并且甚至可能会让问题更糟。而且,渲染性能问题可能是由CPU或者GPU引起的,对于不同原因引起的性能问题,处理方式也是不一样的,所以在我们进行优化之前一定要找出性能问题的真正原因。
减少CPU在渲染方面的消耗
一般情况下,对CPU渲染性能消耗影响最大的部分是发送渲染命令到GPU,渲染命令包括DrawCall(绘制几何图形的命令),和绘制几何图形之前的渲染状态设置的切换命令。如果是因为这个原因引起的性能问题,可以考虑下面几个操作:
1. 减少需要绘制的对象数量
a. 减少场景中的对象总数,比如,用天空盒来实现远景效果,这样子就可以减少远景对象
b. 执行更严苛的剔除,让Unity绘制更少的对象
i. 使用遮挡剔除来减少被物体遮挡的对象的绘制
https://docs.unity3d.com/Manual/OcclusionCulling.html
ii. 减小相机的远裁剪平面距离(far clip plane),这样可以让更多的远处的物体在相机的视野之外,从而不用绘制
iii. 还有一个更细的方法,就是把对象放到一个单独的层级,然后通过Camera.layerCullDistances设置不同层级的剔除距离
https://docs.unity3d.com/ScriptReference/Camera-layerCullDistances.html
2. 减少渲染每个对象的次数
a. 在合适的地方进行光影信息的烘培(预计算),用光照贴图代替实时光照。这会增加构建的时间、运行内存和存储内存,但是可以提高运行时的性能
b. 如果使用的是前向渲染(Forward rendering),要减少能照射到对象的逐像素实时灯光的数量。
https://docs.unity3d.com/Manual/RenderTech-ForwardRendering.html
c. 实时阴影性能消耗很大,所以一定要谨慎有效的使用
https://docs.unity3d.com/Manual/ShadowPerformance.html
d. 如果使用了反射探针,要优化使用方法
https://docs.unity3d.com/Manual/RefProbePerformance.html
3. 减少准备和发送渲染命令的大量工作
通常是通过更高效的批处理的方式发送渲染命令道GPU来进行优化,也就是我们常说的“合批”
https://docs.unity3d.com/Manual/DrawCallBatching.html
许多上述中的方法也是可以同时减少GPU的工作,比如,减少一帧内Unity渲染的物体总数同时可以减少CPU和GPU的工作量。
减少GPU渲染消耗
主要有三种情形会导致GPU性能消耗过高
1. Overdraw过高
即填充率过高,GPU需要绘制的像素过多,可以考虑以下方法:
a. 减少程序中overdraw重复绘制过高的地方
大部分时候引起Overdraw的主要因素是透明的对象,比如UI,粒子和Sprites。在编辑器模式下,我们可以通过查看OverdrawDrawMode来找出重复绘制过高的地方
https://docs.unity3d.com/Manual/ViewModes.html
b. 减少Shader中片元函数的计算消耗
片元函数(fragment)是逐像素计算的,减少其中的计算(比如可以的话转移到顶点函数中)可以减少消耗
https://docs.unity3d.com/Manual/SL-ShaderPerformance.html
c. 如果我们使用的是Unity的内置shader,尽量的使用Mobile或者Unlit目录下的Shader使用
这些Shader也能在非移动平台使用,但是经过了简化和更复杂的shader也是比较接近的
d. 动态渲染分辨率
Unity支持动态的缩放独立的渲染目标(Render targets)
https://docs.unity3d.com/Manual/DynamicResolution.html
2. GPU内存带宽不足
GPU的读写速度有限,需要读写的数据过多,一帧里则处理不了那么多的数据。这通常是因为贴图太多或者太大。这种情形可以考虑以下处理方法:
https://docs.unity3d.com/Manual/class-TextureImporter.html
a. 开启贴图的Mipmaps
mipmap可以使一个对象在运行时使用不同大小的贴图进行显示(在3D场景中,大部分的贴图都可以使用)。开启mipmap会增加一定的内存和存储空间(需要生成不同大小的贴图),但可以提高运行时GPU的性能
b. 使用合适的压缩格式
压缩贴图来减少贴图在内存中的大小,可以让加载更快,内存占用更小,并且提高GPU的渲染性能。相比没有压缩的贴图,压缩后的贴图所需的内存带宽也更小。
3. 需要处理的顶点过多
一帧内需要处理的顶点太多,也会导致GPU性能不足,可以考虑以下方法处理:
a. 减少顶点函数的计算处理
类似片元函数,但是这次没地方转移,只能从其它方面入手优化
https://docs.unity3d.com/Manual/SL-ShaderPerformance.html
b. 优化模型
减面,减少不需要的面数,尽可能降低 UV 贴图接缝和硬边(双倍顶点)的数量
一般来说,移动端不超过10万个顶点
https://docs.unity3d.com/Manual/ModelingOptimizedCharacters.html
c. 使用LOD
https://docs.unity3d.com/Manual/LevelOfDetail.html
减少渲染的频率
我们还可以通过降低渲染的频率的方式来减少消耗,这不会降低一帧的CPU或者GPU的消耗,但减少了渲染的频率,而且不会影响其它操作的执行(比如脚本,因为只是让渲染的频率下降了)。
我们可以在某些时候降低帧率或者整个游戏都降低帧率。降低帧率可以减少不必要的电量消耗,延长电池续航,并且防止设备温度过高,导致CPU被降频。
要调整渲染帧率,我们可以使用OnDemandRendering接口,这个接口特别适合配合Adaptive Performance package一起使用。
https://docs.unity3d.com/ScriptReference/Rendering.OnDemandRendering.html
https://docs.unity3d.com/Packages/com.unity.adaptiveperformance@3.0/manual/index.html
在以下情况,我们可以考虑降低帧率:
1. 菜单
比如应用程序入口点或者暂停菜单,菜单往往是相对简单的场景,不需要那么高的帧率
2. 等待输入的时候
比如一些游戏在等待玩家输入的时候,比如象棋,玩家花时间等待其他用户操作或者思考自己的操作
3. 内容大部分时候是静态的
为了防止输入延迟,我们可以在输入持续时间内临时增加渲染帧率(OnDemandRendering.renderFrameInterval = 1),以便移动、按钮等仍可迅速响应
注意:VR应用不支持用OnDemandRendering,因为VR应用需要非常低的延迟,如果渲染的画面跟不上头的运动,就可能增加晕动症出现的风险。
本文
https://blog.csdn.net/ithot/article/details/122520580?spm=1001.2014.3001.5501
参考
https://docs.unity3d.com/Manual/OptimizingGraphicsPerformance.html
另外发现这一篇的中英文差别有点大,Unity的中文文档有些是翻译的,有些会拗口,有些像这篇加了很多自己的理解或者说就是作者的总结,和英文文档偏差较大,也挺令人混乱的
https://docs.unity3d.com/cn/current/Manual/OptimizingGraphicsPerformance.html
扩展阅读
Unity官方性能优化教程
https://learn.unity.com/tutorial/fixing-performance-problems-2019-3/?tab=overview&uv=2019.4
Unity渲染性能优化总纲相关推荐
- 渲染性能优化之Culling 剔除
几种剔除: 背面裁剪(Backface Culling) 视锥裁剪(View Frustum Culling) 遮挡剔除(Occlusion Culling) 层次视锥裁剪(Hierarchical ...
- 渲染性能优化之几种LOD层次细节总结
CIM(城市信息模型)这种大场景或者说特大场景LOD是非常重要的,城市.BIM.地形都非常系需要,根据公司的项目需求这里做了一下总结各种LOD的技术.算法.策略. 首先,我们公司对于城市这种大场景我们 ...
- 携程RN渲染性能优化实践
一.背景 随着 React Native 在前端业界规模性的应用越来越多,各大厂也对其渲染性能越来越看重. 渲染性能的主要评判指标是FMP与TTI,在 React Native 以跨平台前端框架身份逐 ...
- 干货 | 携程RN渲染性能优化实践
作者简介 佳璐,前端开发专家,关注前端框架.性能.质量.效率和新技术. 一.背景 随着 React Native 在前端业界规模性的应用越来越多,各大厂也对其渲染性能越来越看重. 渲染性能的主要评判指 ...
- 从Webkit内部渲染机制出发,谈网站渲染性能优化
点击上方"IT平头哥联盟",选择"置顶或者星标" 一起进步- 作者:jerryOnlyZRJ 本文是对前文:网站性能优化实战--从12.67s到1.06s的故事 ...
- 【转】渲染性能优化:如何平衡GPU和CPU
本节主要讲一下虚幻渲染之前,都发生了什么. 渲染流程: 首先,虚幻的渲染由三个线程共同完成.分别是CPU线程,DRAW线程,和GPU线程. CPU线程:顾名思义,运行在CPU上,用于计算游戏中的所有逻 ...
- 奇舞周刊第 412 期:从硬件、渲染、计算三大视角解析渲染性能优化的本质
记得点击文章末尾的" 阅读原文 "查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞精选 ■ ■ ■ 从硬件.渲染.计算三大视角解析渲染性能优化的本质 渲染性能优化是个经久不衰的话 ...
- 硬件加速下webview切换闪屏_网页渲染性能优化 —— 性能优化下
博客 有更多精品文章哟. Composite 的优化 终于,我们到了像素管道的末尾.对于这一部分的优化策略,我们可以从为什么需要 Composited Layer(Graphics Layer)来入手 ...
- android app性能优化大汇总(UI渲染性能优化)
UI性能测试 性能优化都需要有一个目标,UI的性能优化也是一样.你可能会觉得"我的app加载很快"很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交 ...
- 【unity】性能优化之——视锥体剔除(Frustum Culling)(一)
一.应用背景 在现代游戏中,游戏资源越来越多,游戏场景也越来越大越来越复杂,虽说硬件设备更新迭代很快,性能也日渐强大,但这还远不能缓解复杂繁多的资源带来的性能压力,因而性能优化仍然很有必要.场景资源的 ...
最新文章
- linux改英语环境,CentOS6.8中/英文环境切换教程图解
- 九十、Python的GUI系列 | QtDesigner进行界面设计
- 如何维持手机电池寿命_充电小知识:你知道如何正确充电吗?这几种充电方式最损害电池...
- 深入分析String类型(一)
- 亚马逊 在线测试题目 amazon (变种的)三叉树的最近公共祖先问题
- 01.使用File类读写文件
- PyQt实现读取文件内容并绘制曲线
- 基于aspect的情感分析综述 论文翻译笔记 A Survey on Aspect-Based Sentiment Analysis: Tasks, Methods, and Challenges
- 方差、标准差、协方差概念与意义梳理
- 如何确定网站的关键词呢
- 什么是GB18030编码?
- wifi动不动就断开_解决iPad连接wifi网络经常中断(转)
- Redis 发布订阅功能
- 在家用手机怎么赚钱?赚钱的秘密就在这里!
- 看完CNCERT周报再来看CNVD周报 报告提示Flash及Http2.0漏洞值得关注
- 用开源力量抗击新冠疫情!腾讯作为创始成员加入Linux基金会公共卫生计划
- 《通过PMBOK看项目管理软件》交流活动
- coco2dx 游戏小包上架教程
- THUSC 2017 游记
- ARM裸机——FS2410 流水灯