【Unity 优化篇】 | 优化专栏《导航帖》,全面学习Unity优化技巧,让我们的Unity技术上升一个档次_c#


文章目录


????前言

  • ​游戏引擎​​ 是游戏开发中最基础也是最重要的开发工具,而Unity3D则是众多引擎中的佼佼者。
  • 成为一名优秀的游戏客户端开发者,不仅需要常年的实践积累和思考,更需要结实的基础做支撑。
  • 也就是所谓的“基础不牢,地动山摇”
  • 而​​优化​​ 则是老生常谈的一个话题了,在任何项目里都扮演着重要角色。
  • 所以本系列专栏是 小Y 参考几本Unity优化书籍、网上的优质优化系列教程 以及 自身的经验整理而成。
  • 会尽量保持每周都更新,本专栏的内容后续也都会同步放到​​『Unity精品学习专栏⭐️』​​中
  • 该专栏提前订阅优惠力度会大很多,所以有需要的小伙伴记得早点去订阅哦!

????Unity实用优化技巧专栏《导航帖》

本篇文章会对我开的这个 ​​『Unity精品学习专栏⭐️』​​ 做一个简单的概述,简而言之就是一个目录。

后面我会根据这个目录来写对应的优化文章,后期可能有所变动,也会同步修改更新的!

下面是一个大概的优化结构,可以一起来看一下

【Unity 优化篇】 | 优化专栏《导航帖》,全面学习Unity优化技巧,让我们的Unity技术上升一个档次_c#_02

目前暂定以这个大纲为主,后面会根据这个概述的内容进行更新(计划2022年更完~)

如果觉得 小Y 整理的这个大纲有什么地方不到位的,也可以指出参考呀!

Unity优化部分内容实际上细分的话有很多,这里只是把最常用的一部分列出来了。

上图中出现的基本上就是项目中都会用到的几个部分,所以说每个部分都是重点!

下面针对这几个部分做一个简单的概述,后面再详细介绍。


1️⃣ 优化的基本概念/意义

谈及​​优化​​,作为一个程序员来说,应该都知道是怎么一回事。

我觉得 ​​优化​​​ 和 ​​性价比​​ 其实很像。

我们在生活中使用最少的钱去买最实用的物品是性价比最高的。

同理,如何让程序在最省性能的情况下去完美执行同一个功能 就可以理解成 优化

一般来说,要实现某个功能,我们可以有N种做法,就跟一个数学题有很多种题解一样。

我们要做的 就是以一种 ​​最优解​​ 的方式用编程做出这道题!

在Unity中有一个自带的性能分析工具 Unity Profiler

【Unity 优化篇】 | 优化专栏《导航帖》,全面学习Unity优化技巧,让我们的Unity技术上升一个档次_c#_03

使用这个工具可以让我们在程序运行时,实时便捷的观察一些性能所需要的数据。

还有 性能分析的方法,有以下几部分

  • ????️‍????验证目标脚本是否出现在场景中
  • ????️‍????验证脚本在场景中出现的次数是否正确
  • ????️‍????验证事件的正确顺序
  • ????️‍????最小化正在进行的代码更改
  • ????️‍????尽量减少内部干扰
  • ????️‍????尽量减少外部干扰

具体详细信息可以来这篇文章学习:​​【Unity 优化篇】| 优化的基本概念/意义,Unity Profiler工具的使用 以及 性能分析的方法【精华收藏】​


2️⃣ 脚本代码优化策略

说完了基本的 优化概念/意义 那接下来就是实际操作部分了

那首先想到的就是脚本代码优化了,因为 优化代码 是最基础的,也是最直观的一种优化方法。

关于 脚本代码优化的策略 也有很多,后面也会针对重点出几篇博文来介绍详细内容,这里先简单介绍一下。

  • ????️‍????获取对象和组件的最佳方法
  • ????️‍????移除空回调
  • ????️‍????缓存组件使用
  • ????️‍????空引用的快速检索
  • ????️‍????避免在运行时进行的操作
  • ????️‍????禁用未使用的脚本对象

还有一些其他需要注意的点,如下图所示:

【Unity 优化篇】 | 优化专栏《导航帖》,全面学习Unity优化技巧,让我们的Unity技术上升一个档次_Unity优化_04

目前也是写了两篇文章来介绍部分脚本代码优化策略的文章:

​【Unity优化篇】 | Unity脚本代码优化策略,快速获取 游戏对象 和 组件 的方法​

​【Unity优化篇】 | Unity脚本代码优化策略,空引用快速检索、使用合适的数据结构、禁用脚本和对象等 性能优化方法​

该部分的文章目前也只是讲了一下最基本的表面上很好解决的部分,脚本代码的地方钻研下去还是有很多难点的。


3️⃣ UI常规优化逻辑

这里说的 UI优化 指得是Unity的 ​​UGUI​​,也是目前主流用的UI系统,其他的就不做介绍了

UI优化 这块的话核心其实就一个地方:降低DrawCall

DrawCall 可以理解成 CPU向GPU每发出一条渲染指令,这个过程就可以称作一个DrawCall

降低DrawCall 的方法有很多种,比较常用的有层级控制、图集制作、Mask、Graphics Rebuild等等

后面会单独写文章来介绍这部分的关键内容,这里先简单说一下大概思路,方便后续学习整理。

  • ????️‍????降低DrawCall
  • ????️‍????内存优化
  • ????️‍????动静分离
  • ????️‍????禁用某些组件预选项
    【Unity 优化篇】 | 优化专栏《导航帖》,全面学习Unity优化技巧,让我们的Unity技术上升一个档次_Unity优化_05

4️⃣ 物理引擎优化篇

物理引擎是Unity中的一类独特的子系统,其行为和一致性是影响产品质量的主要因素。

这部分主要是介绍减少Unity物理引擎中的CPU峰值、开销和内存消耗的方式,同时包括改变物理行为的方法,在保持游戏质量的同时优化性能。

主要包括下面几个部分:

  • ????️‍????时间步长和FixUpdate
  • ????️‍????碰撞器类型
  • ????️‍????碰撞
  • ????️‍????射线发射
  • ????️‍????刚体激活状态
  • ????️‍????如何构造场景以优化物理行为
  • ????️‍????使用相同的碰撞器类型
  • ????️‍????优化碰撞矩阵
  • ????️‍????提升物理一致性并避免容易出错的行为等

【Unity 优化篇】 | 优化专栏《导航帖》,全面学习Unity优化技巧,让我们的Unity技术上升一个档次_Unity优化_06

后续详细文章出来之后会在这里更新,这里暂时展示这些。


5️⃣ 图形渲染优化篇

图形渲染 这一部分无疑是相当复杂的,UI处理其实也可以归纳为这部分之下。

这里的话我们就从管道渲染、CPU和GPU的逻辑处理等方面开始学习介绍。

学习如何收集正确的数据,深入了解管道渲染,探索各种解决方案和潜在的一些其它问题。

包括下面这几部分:

  • ????️‍????GPU实例化
  • ????️‍????LOD(多细节层次)和其他筛选组
  • ????️‍????遮挡剔除
  • ????️‍????粒子系统
  • ????️‍????着色器优化
  • ????️‍????光照和阴影优化

【Unity 优化篇】 | 优化专栏《导航帖》,全面学习Unity优化技巧,让我们的Unity技术上升一个档次_游戏引擎_07

后面讲到这部分的时候会先简单的介绍管道渲染等一些基本的理念。


6️⃣ 批处理的优势

​批处理​​ 是3D图形和游戏中一个通用的术语,它描述了将大量的任意数据块组合到一起并将它们作为单个大数据块进行处理的过程。

这对于 CPU和GPU 是非常友好的,因为它可以使用 多个内核同时处理多个任务 。

批处理对象 指的是 网格、顶点、边、UV坐标和其他用于描述3D对象的不同数据类型的大集合。

也可以简单的代表 批处理音频文件、精灵、纹理文件和其他大数据集的行为。

本系列这部分讲的主要是两种用于 批处理网格数据 的主要机制:动态批处理静态批处理

这两种方法本质上是几何体合并的两种形式,用于将多个对象的网格合并到一起,并在单一指令中渲染他们,而不是单独准备和绘制每个几何体。

这部分主要介绍一下内容

  • ????️‍????管线渲染 和 Draw Call 概念
  • ????️‍????Unity的材质和着色器如何一起工作来渲染对象
  • ????️‍????使用Frame Debugger可视化渲染行为
  • ????️‍????动态批处理的工作原理及优化方式
  • ????️‍????静态批处理的工作原理及优化方式

【Unity 优化篇】 | 优化专栏《导航帖》,全面学习Unity优化技巧,让我们的Unity技术上升一个档次_游戏引擎_08

后续详细内容请看具体的文章,敬请期待相关文章~


7️⃣ 艺术类资源优化

前边的内容基本上已经把Unity中一些重要的子系统优化技巧都介绍了,那接下来就来看看怎样优化 ​​艺术类资源​​ 。

这里说的艺术类资源,指的是Unity中的音频纹理动画方面,这块的核心其实是美术分工来搞的。

但是既然是一个完整的Unity项目,那我们就应该对这方面有所了解,程序美术 协商好才能完成更好的一个效果。

无论是视图最小化运行时的内存占用,保持尽可能小的可执行文件大小,最大限度的提高加载速度,保持帧速率的一致性等等其他技巧。

都有多种选项提供给我们进行选择,多数情况下结果应该都是很理想的,但是也有些方法在我们采用之前是值得考虑的。

因为在优化过程中,除了一开始可能进行了某些没必要的操作 浪费了一些性能之外,后期基本上就是选择牺牲某个子系统的消耗来达到我们迫切所需的一个优化结果。比如美术方面就是一个很好的例子,往往可能需要降低质量来提高性能。

那这部分就会针对音频、纹理和网格 动画来做一个详细的优化过程,下面先来看看内容简介:

  • ????️‍????音频处理
  • ????️‍????纹理文件
  • ????️‍????网格和动画处理

【Unity 优化篇】 | 优化专栏《导航帖》,全面学习Unity优化技巧,让我们的Unity技术上升一个档次_游戏引擎_09

后续详细内容请看具体的文章,敬请期待相关文章~


8️⃣ 内存管理优化

上面的好几个部分都是涉及到内存优化,实际上内存优化的涉及范围很广,所以这里我们再来梳理一下内存管理相关内容。

既然涉及到​​内存优化​​,那就不可避免的需要涉及到底层原理

研究底层原理是一件领开发人员头疼的事,大多数的开发者更喜欢在上层做开发,只需要实现游戏玩法、关卡设计 和 艺术资源管理即可。

但是内存效率是性能优化的一个重要元素,这使得我们必须去研究到一些底层部分,这也是走向高级开发工程师必须要走的一步!

只有对Unity引擎底层、Mono平台 和C#语言有较为深刻的理解 才能通过Unity高效的使用内存。

本部分就来理解内存分配 和 C#语言特性,他们如何与Mono平台交互以及Mono如何与Unity引擎交互。

通过本节可以学到Unity引擎底层的方方面面,如:Mono平台、C#语言、IL2CPP 以及 .NET Framework

大致内容整理如下:

  • ????️‍????Mono平台:本地和托管内存域、垃圾回收 和内存碎片
  • ????️‍????内存性能分析
  • ????️‍????内存相关性能增强
  • ????️‍????美术方面内存处理
    【Unity 优化篇】 | 优化专栏《导航帖》,全面学习Unity优化技巧,让我们的Unity技术上升一个档次_Unity优化_10

后续详细内容请看具体的文章,敬请期待相关文章~


????总结

  • 本篇文章是Unity实用优化技巧专栏的《导航帖》,主要是将Unity优化各个部分进行一个简单介绍。
  • 我一直觉得优化部分的内容是最值得我们深入学习的,一个好的优化技巧 当然是我们想要的一个结果。
  • 但是更多的则是我们借助优化的过程,可以学习到更多表面上看不到的东西。
  • 优化技巧跟底层系统的逻辑关系密切,我们在学习优化的过程其实就是把整个Unity系统的复习了一遍。
  • 还能更好的了解Unity的系统运行逻辑,在之后的做项目过程中我们就会知道哪些做法对程序来说是更好的选择。
  • 尽可能早的学习并养成一个性价比最高的工作方法,提高我们做项目的效率。
  • 所以说优化技巧不管是在编程的哪个领域,都是占据相当重要的位置,一定要重视起来哦!
  • 本篇文章就介绍到这里了,想学习更多Unity知识记得点赞关注我哦!