包含此页的版本:
不含此页的版本:
IL2CPP(C++ 的中间语言)脚本后端为Unity中的脚本提供支持的框架。Unity 支持三种不同的脚本后端,具体取决于目标平台:Mono、.NET 和 IL2CPP。但是,通用 Windows 平台仅支持两个:.NET 和 IL2CPP。更多信息
请参阅术语表是 Mono 后端的替代方法。IL2CPP 为跨更广泛平台的应用程序提供更好的支持。IL2CPP 后端将 MSIL(Microsoft 中间语言)代码(例如,脚本中的 C# 代码)转换为C++代码,然后使用C++代码为所选平台创建本机二进制文件(例如,.exe、.apk 或 .xap)。
这种类型的编译,即 Unity 在构建原生二进制文件时专门为目标平台编译代码,称为提前 (AOT) 编译。Mono 后端在运行时编译代码,使用一种称为即时编译 (JIT) 的技术。
本页内容:
某些平台不支持AOT 编译提前 (AOT) 编译是除 iOS 之外的所有平台都用于优化构建播放器大小的优化方法。更多信息
请参阅术语表,因此 IL2CPP 后端并非在每个平台上都有效。其他平台支持 AOT 和 IL2CPP,但不允许 JIT 编译,因此无法支持 Mono 后端。当平台可以同时支持两个后端时,Mono 是默认的。有关详细信息,请参阅脚本限制。
IL2CPP 可以提高跨各种平台的性能,但在构建的应用程序中包含机器代码的需求会增加构建时间和最终构建应用程序的大小。有关详细信息,请参阅 IL2CPP 的工作原理和博客系列 IL2CPP 内部简介。
IL2CPP 支持以与 Mono 脚本后端相同的方式调试托管代码。有关详细信息,请参阅在 Unity 中调试 C# 代码。
要使用 IL2CPP 构建项目,您需要在 Unity 安装中安装后端。您可以在首次安装 Unity 版本时选择 IL2CPP 作为可选模块,或者通过 Unity Hub 将 IL2CPP 支持添加到现有安装中。有关更多信息,请参阅安装 Unity Hub 和将模块添加到 Unity 编辑器。
IL2CPP 还需要目标平台原生的某些系统来生成 C++ 代码。这意味着,要在特定平台上使用 IL2CPP,您需要在该平台上构建应用程序。例如,要将 IL2CPP 与 MacOS 一起使用作为生成目标,您需要在使用 MacOS 的计算机上构建应用程序。有关桌面平台系统要求(包括各个平台的 IL2CPP 要求)的详细信息,请参阅 Unity 的系统要求的桌面部分。
您可以通过以下两种方式之一更改 Unity 用于构建应用程序的脚本后端:
通过编辑器中的 玩家设置(Player Settings) 菜单。执行以下步骤,通过 玩家设置(Player Settings) 菜单更改脚本后端:
您还可以从 构建配置文件(Build Profiles) 窗口打开 播放器设置(Player Settings) 菜单;转到 文件(File) > 构建配置文件(Build Profiles),然后单击 播放器设置(Player Settings) 选项卡。
通过编辑器脚本 API。使用 PlayerSettings.SetScriptingBackend 属性更改 Unity 使用的脚本后端。
要启动构建过程,请打开构建配置文件 为目标平台创建构建时使用的一组可自定义配置设置。更多信息
请参阅术语表窗口,然后单击 构建(Build) 按钮。然后,Unity 将 C# 代码和程序集转换为 C++,最后为目标平台生成二进制文件。
当您使用 IL2CPP 启动构建时,Unity 会自动执行以下步骤:
IL2CPP 和 Mono 都提供了一些有用的选项,您可以使用脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性以及以您喜欢的任何方式响应用户输入。更多信息
请参阅术语表.有关详细信息,请参阅依赖于平台的编译。
IL2CPP 使 Unity 能够为特定平台预编译代码。Unity 在此过程结束时生成的二进制文件已经包含目标平台所需的机器代码,而 Mono 必须在执行过程中在运行时编译此机器代码。AOT 编译确实增加了构建时间,但它也提高了与目标平台的兼容性,并且可以提高性能。
这两个脚本后端都需要为要定位的每个平台进行新的构建。例如,要同时支持 Android 和 iOS 平台,您需要构建应用程序两次并生成两个二进制文件。
装配剥离阶段有助于减小最终二进制尺寸。Unity 会删除最终生成的应用程序不使用的任何托管代码。
使用 IL2CPP 时的项目构建时间可能比使用 Mono 时要长得多。但是,您可以执行多项作来减少构建时间。
从反恶意软件扫描中排除项目
在生成项目之前,可以从反恶意软件扫描中排除 Unity 项目文件夹和目标生成文件夹。
将项目和目标构建文件夹存储在固态硬盘 (SSD) 上
固态硬盘 (SSD) 的读/写速度比传统硬盘驱动器 (HDD) 更快。将 IL 代码转换为 C++ 并编译它涉及大量的读/写作,因此更快的存储设备可以加快此过程。
更改播放器设置中的 IL2CPP 代码生成选项
若要更改 IL2CPP 生成代码的方式,请打开玩家设置设置,可让您为 Unity 构建的最终游戏设置各种特定于玩家的选项。更多信息
请参阅术语表并配置 IL2CPP 代码生成选项。默认情况下,“优化运行时速度”选项处于启用状态,这会生成更多机器代码,从而减少 IL2CPP 在运行时的影响。若要缩短生成时间,可以将此选项设置为“针对代码大小和生成时间进行优化”。此方法在二进制可执行文件中生成和包含的机器代码较少,因此可以降低运行时的性能,但也会显着减少构建时间和二进制文件大小。
使用 IL2CPP 脚本后端时,可以控制 il2cpp.exe 生成C++代码的方式。可以使用 Il2CppSetOption 属性启用或禁用以下运行时检查:
| 财产: | 描述: | 违约: |
|---|---|---|
| 空检查 | 如果启用此选项,则 IL2CPP 生成的 C++ 代码包含空检查,并根据需要引发托管 NullReferenceException 异常。如果禁用此选项,IL2CPP 不会在生成的 C++ 代码中发出空检查。对于某些项目,禁用此选项可能会提高运行时性能。 禁用此设置后,Unity 不会阻止尝试访问生成的代码中的空值,这可能会导致不正确的行为。您的应用程序在取消引用空值后可能会很快崩溃。Unity 建议您不要禁用此选项。 |
启用 |
| 数组边界检查 | 如果启用此选项,则 IL2CPP 生成的 C++ 代码包含数组边界检查,并根据需要引发托管 IndexOutOfRangeException 异常。如果禁用此选项,则 IL2CPP 不会在生成的 C++ 代码中发出数组边界检查。 对于某些项目,禁用此选项可能会提高运行时性能。但是,禁用此选项后,Unity 不会阻止尝试访问生成的代码中索引无效的数组,这可能会导致不正确的行为,包括读取或写入任意内存位置。在大多数情况下,这些内存访问不会产生任何直接副作用,并且可能会损坏应用程序的状态,而没有明显的警告信号。这可能会使调试这些错误变得极其困难。Unity 建议您保持启用此选项。 |
启用 |
| 除以零检查 | 如果启用此选项,则 IL2CPP 生成的 C++ 代码包含整数除法的除以零检查,并根据需要引发托管 DivideByZeroException 异常。如果禁用此选项,则 IL2CPP 不会在生成的 C++ 代码中发出整数除法的除以零检查。 这些检查会影响运行时的性能。仅当需要运行除以零检查时才应启用此选项;否则,请将其禁用。 |
禁用 |
若要使用 Il2CppSetOption 属性,请执行以下作:
以下示例介绍如何使用 Il2CppSetOption 属性:
[Il2CppSetOption(Option.NullChecks, false)]
public static string MethodWithNullChecksDisabled()
{
var tmp = new object();
return tmp.ToString();
}
可以将 Il2CppSetOption 属性应用于程序集、类型、方法和属性。Unity 使用最本地范围内的属性。
[Il2CppSetOption(Option.NullChecks, false)]
public class TypeWithNullChecksDisabled
{
public static string AnyMethod()
{
// Unity doesn’t perform null checks in this method.
var tmp = new object();
return tmp.ToString();
}
[Il2CppSetOption(Option.NullChecks, true)]
public static string MethodWithNullChecksEnabled()
{
// Unity performs null checks in this method.
var tmp = new object();
return tmp.ToString();
}
}
public class SomeType
{
[Il2CppSetOption(Option.NullChecks, false)]
public string PropertyWithNullChecksDisabled
{
get
{
// Unity doesn’t perform null checks here.
var tmp = new object();
return tmp.ToString();
}
set
{
// Unity doesn’t perform null checks here.
value.ToString();
}
}
public string PropertyWithNullChecksDisabledOnGetterOnly
{
[Il2CppSetOption(Option.NullChecks, false)]
get
{
// Unity doesn’t perform null checks here.
var tmp = new object();
return tmp.ToString();
}
set
{
// Unity performs null checks here.
value.ToString();
}
}
}