参考:《Unity游戏优化第2版》

为什么要进行内存管理?

内存管理是性能优化的一个重要方面。
可能造成性能问题的原因有2个:

  • 不必要的内存分配:垃圾回收开销大,占用CPU(用户体验差?怎么差了?会卡?)
  • 内存泄露:导致崩溃

通过unity高效使用内存需要学会这些:

  • Unity引擎底层
  • Mono平台
  • C#语言
  • IL2CPP脚本后端的工作原理

为什么不只是关注高层问题呢?
因为计算机是个复杂的系统,如果长期脱离底层问题,可能会导致潜在灾难。

为什么会有Mono和IL2CPP

因为游戏引擎的设计方案通常是这样的:

  • 在底层运行C++,处理渲染、动画、资源管理等;
  • 为要实现的玩法逻辑提供高级脚本语言。

而Unity也是构建在C++之上的,并在开始的时候选择了Mono来提供这个特性(解决脚本语言到本地代码的过程)。

托管语言、托管代码

托管代码是:必须在CLR上运行的源码。
通常“托管”可以指代:依赖于独立运行时环境来执行,且由自动垃圾回收进行监控。

Mono

Mono是一个开源项目,本质上它是.NET类库的开源重置。它支持很多不同的编程语言,可以将其编译为CIL。
从IDE切换到Unity编辑器时,代码会自动编译。然而,C#代码没有直接转成机器码,而是CIL。
在运行时,CIL通过Mono虚拟机运行。虚拟机(VM)是一种基础架构元素,允许代码运行在不同的平台上,而不需要修改代码本身。Mono虚拟机是CLR的一个实现。如果在iOS上运行,就使用iOS的虚拟机,Linux则是Linux的虚拟机。
在CLR中 ,CIL通过AOT(ahead of time)或JIT(just in time)编译为需要的本地代码。

IL2CPP

IL2CPP (Intermediate Language To C++) 是一种由 Unity 开发的脚本后端,可在为各种平台构建项目时替代 Mono。使用 IL2CPP 构建项目时,Unity 会在为所选平台创建本机二进制文件(例如 .exe、apk、.xap)之前将脚本和程序集内的 IL 代码转换为 C++。IL2CPP 的一些用途包括提高 Unity 项目的性能、安全性和平台兼容性。
使用ILCPP构建项目时:
内存管理 - 图1