概述

本篇是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渲染性能优化总纲相关推荐

  1. 渲染性能优化之Culling 剔除

    几种剔除: 背面裁剪(Backface Culling) 视锥裁剪(View Frustum Culling) 遮挡剔除(Occlusion Culling) 层次视锥裁剪(Hierarchical ...

  2. 渲染性能优化之几种LOD层次细节总结

    CIM(城市信息模型)这种大场景或者说特大场景LOD是非常重要的,城市.BIM.地形都非常系需要,根据公司的项目需求这里做了一下总结各种LOD的技术.算法.策略. 首先,我们公司对于城市这种大场景我们 ...

  3. 携程RN渲染性能优化实践

    一.背景 随着 React Native 在前端业界规模性的应用越来越多,各大厂也对其渲染性能越来越看重. 渲染性能的主要评判指标是FMP与TTI,在 React Native 以跨平台前端框架身份逐 ...

  4. 干货 | 携程RN渲染性能优化实践

    作者简介 佳璐,前端开发专家,关注前端框架.性能.质量.效率和新技术. 一.背景 随着 React Native 在前端业界规模性的应用越来越多,各大厂也对其渲染性能越来越看重. 渲染性能的主要评判指 ...

  5. 从Webkit内部渲染机制出发,谈网站渲染性能优化

    点击上方"IT平头哥联盟",选择"置顶或者星标" 一起进步- 作者:jerryOnlyZRJ 本文是对前文:网站性能优化实战--从12.67s到1.06s的故事 ...

  6. 【转】渲染性能优化:如何平衡GPU和CPU

    本节主要讲一下虚幻渲染之前,都发生了什么. 渲染流程: 首先,虚幻的渲染由三个线程共同完成.分别是CPU线程,DRAW线程,和GPU线程. CPU线程:顾名思义,运行在CPU上,用于计算游戏中的所有逻 ...

  7. 奇舞周刊第 412 期:从硬件、渲染、计算三大视角解析渲染性能优化的本质

    记得点击文章末尾的" 阅读原文 "查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞精选 ■ ■ ■ 从硬件.渲染.计算三大视角解析渲染性能优化的本质 渲染性能优化是个经久不衰的话 ...

  8. 硬件加速下webview切换闪屏_网页渲染性能优化 —— 性能优化下

    博客 有更多精品文章哟. Composite 的优化 终于,我们到了像素管道的末尾.对于这一部分的优化策略,我们可以从为什么需要 Composited Layer(Graphics Layer)来入手 ...

  9. android app性能优化大汇总(UI渲染性能优化)

    UI性能测试 性能优化都需要有一个目标,UI的性能优化也是一样.你可能会觉得"我的app加载很快"很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交 ...

  10. 【unity】性能优化之——视锥体剔除(Frustum Culling)(一)

    一.应用背景 在现代游戏中,游戏资源越来越多,游戏场景也越来越大越来越复杂,虽说硬件设备更新迭代很快,性能也日渐强大,但这还远不能缓解复杂繁多的资源带来的性能压力,因而性能优化仍然很有必要.场景资源的 ...

最新文章

  1. linux改英语环境,CentOS6.8中/英文环境切换教程图解
  2. 九十、Python的GUI系列 | QtDesigner进行界面设计
  3. 如何维持手机电池寿命_充电小知识:你知道如何正确充电吗?这几种充电方式最损害电池...
  4. 深入分析String类型(一)
  5. 亚马逊 在线测试题目 amazon (变种的)三叉树的最近公共祖先问题
  6. 01.使用File类读写文件
  7. PyQt实现读取文件内容并绘制曲线
  8. 基于aspect的情感分析综述 论文翻译笔记 A Survey on Aspect-Based Sentiment Analysis: Tasks, Methods, and Challenges
  9. 方差、标准差、协方差概念与意义梳理
  10. 如何确定网站的关键词呢
  11. 什么是GB18030编码?
  12. wifi动不动就断开_解决iPad连接wifi网络经常中断(转)
  13. Redis 发布订阅功能
  14. 在家用手机怎么赚钱?赚钱的秘密就在这里!
  15. 看完CNCERT周报再来看CNVD周报 报告提示Flash及Http2.0漏洞值得关注
  16. 用开源力量抗击新冠疫情!腾讯作为创始成员加入Linux基金会公共卫生计划
  17. 《通过PMBOK看项目管理软件》交流活动
  18. coco2dx 游戏小包上架教程
  19. THUSC 2017 游记
  20. ARM裸机——FS2410 流水灯

热门文章

  1. ISO14443 PICC 与 PCD 调制解调方式
  2. 内网主机通过外网地址访问内网服务器
  3. lily+Solr 原理与配置
  4. golang java 对比_golang编程语言和java的性能对比
  5. 海康摄像头如何查看IP,重置密码
  6. 微信小程序双向绑定数据
  7. 解决plsqldev连接oracle数据库出现ORA-12154:TNS:无法解析指定的连接标识符
  8. 营收与预测:线性回归建立预测收入水平的线性回归模型。
  9. 大漠插件最新版dm7.2135
  10. [Linux 高并发服务器] 信号