IL2CPP (промежуточный язык для C++) серверная часть сценариев Фреймворк, поддерживающий сценарии в Unity. Unity поддерживает три различных бэкэнда для сценариев в зависимости от целевой платформы: Mono, .NET и IL2CPP. Однако универсальная платформа Windows поддерживает только два: .NET и IL2CPP. Дополнительная информация
См. в Словарь – это альтернатива серверной части Mono. IL2CPP обеспечивает лучшую поддержку приложений на более широком диапазоне платформ. Серверная часть IL2CPP преобразует код MSIL (Microsoft Intermediate Language) (например, код C# в сценариях) в код C++, а затем использует код C++ для создания собственного двоичного файла (например, .exe, .apk или .xap) для выбранная вами платформа.
Этот тип компиляции, при котором Unity компилирует код специально для целевой платформы при создании собственного двоичного файла, называется компиляцией с опережением (AOT). Бэкенд Mono компилирует код во время выполнения с помощью техники, называемой JIT-компиляцией.
На этой странице:
- Создание проекта с использованием IL2CPP
- Как работает IL2CPP
- Оптимизация времени сборки IL2CPP
- Включение проверок во время выполнения с помощью IL2CppSetOption
Некоторые платформы не поддерживают компиляцию AOTКомпиляция с опережением времени (AOT) — это метод оптимизации iOS для оптимизации размера встроенного проигрывателя iOS Подробнее
См. в Словарь, так что бэкенд IL2CPP работает не на каждой платформе. Другие платформы поддерживают AOT и IL2CPP, но не допускают JIT-компиляции и поэтому не могут поддерживать бэкэнд Mono. Когда платформа может поддерживать оба бэкенда, по умолчанию используется Mono. Дополнительную информацию см. в разделе Ограничения использования сценариев.
IL2CPP может повысить производительность на различных платформах, но необходимость включения машинного кода во встроенные приложения увеличивает как время сборки, так и размер конечного приложения. Дополнительную информацию см. в разделе Как работает IL2CPP и в серии блогов Введение во внутренние устройства IL2CPP. .
IL2CPP поддерживает отладку управляемого кода так же, как и серверная часть сценариев Mono. Дополнительную информацию см. в разделе Отладка кода C# в Unity.
Сборка проекта с использованием IL2CPP
Чтобы создать проект с помощью IL2CPP, вам необходимо установить серверную часть в вашей установке Unity. Вы можете выбрать IL2CPP в качестве дополнительного модуля при первой установке версии Unity или добавить поддержку IL2CPP в существующую установку через Unity Hub. Дополнительные сведения см. в разделах Установка Unity Hub и Добавить модули в редактор Unity.
Вы можете изменить серверную часть сценариев, которую Unity использует для создания вашего приложения, одним из двух способов:
-
Через Настройки игрокаНастройки, которые позволяют вам установить различные параметры для конкретного игрока для окончательной игры, созданной Unity. . Подробнее
См. в меню Словарь в Редакторе. Выполните следующие шаги, чтобы изменить серверную часть сценариев через меню Настройки проигрывателя:- Выберите Редактировать > Настройки проекта.
- Нажмите кнопку Настройки проигрывателя, чтобы открыть настройки проигрывателя для текущей платформы в Инспектор.
- Перейдите к заголовку раздела Конфигурация в подменю Другие настройки.
- Нажмите раскрывающееся меню Scripting Backend, затем выберите IL2CPP.
Вы также можете открыть меню Настройки проигрывателя из меню Настройки сборки; перейдите в раздел Файл > Настройки сборки и нажмите кнопку Настройки проигрывателя.
Через API сценариев редактора. Используйте свойство PlayerSettings.SetScriptingBackend, чтобы изменить серверную часть сценариев, которую использует Unity.

Как работает IL2CPP
Когда вы запускаете сборку с использованием IL2CPP, Unity автоматически выполняет следующие шаги:
- Компилятор Roslyn C# компилирует код C# вашего приложения и любой необходимый код пакета в .NET DLL (управляемые сборки).
- Unity применяет управляемое удаление байт-кода. Этот шаг может значительно уменьшить размер встроенного приложения.
- Бэкенд IL2CPP преобразует все управляемые сборки в стандартный код C++.
- Компилятор C++ компилирует сгенерированный код C++ и исполняемую часть IL2CPP с помощью собственного компилятора платформы.
- Unity создает либо исполняемый файл, либо DLL, в зависимости от целевой платформы.
Как IL2CPP, так и Mono предоставляют несколько полезных параметров, которыми можно управлять с помощью атрибутов в ваших скриптахфрагмент кода, который позволяет вы можете создавать свои собственные Компоненты, запускать игровые события, изменять свойства Компонентов с течением времени и реагировать на ввод данных пользователем любым удобным для вас способом. Подробнее
См. в Словарь. Дополнительные сведения см. в разделе Компиляция в зависимости от платформы.
IL2CPP позволяет Unity предварительно компилировать код для определенных платформ. Двоичный файл, который Unity создает в конце этого процесса, уже содержит необходимый машинный код для целевой платформы, в то время как Mono должен компилировать этот машинный код во время выполнения во время выполнения. Компиляция AOT увеличивает время сборки, но также улучшает совместимость с целевой платформой и может повысить производительность.
Для обоих бэкэндов сценариев требуется новая сборка для каждой целевой платформы. Например, для поддержки как Android, так и iOSмобильной операционной системы Apple. Подробнее
На платформах Словарь вам нужно дважды собрать приложение и создать два двоичных файла. файлы.
Этап разборки сборки помогает уменьшить окончательный размер двоичного файла. Unity удаляет любой байт-код, который не используется в готовом приложении.
Оптимизация времени сборки IL2CPP
Время сборки проекта при использовании IL2CPP может быть значительно больше, чем при использовании Mono. Однако вы можете сделать несколько вещей, чтобы сократить время сборки.
Исключить ваш проект из сканирования антивирусным ПО
Вы можете исключить папку проекта Unity и целевые папки сборки из сканирования программным обеспечением для защиты от вредоносных программ перед сборкой проекта.
Сохраните проект и целевую папку сборки на твердотельном накопителе (SSD)
Твердотельные накопители (SSD) имеют более высокую скорость чтения/записи, чем традиционные жесткие диски (HDD). Преобразование кода IL в C++ и его компиляция требуют большого количества операций чтения/записи, поэтому более быстрое запоминающее устройство ускоряет этот процесс.
Включение проверок во время выполнения с помощью Il2CppSetOption
При использовании серверной части сценариев IL2CPP можно управлять тем, как il2cpp.exe генерирует код C++. Вы можете использовать атрибут Il2CppSetOption, чтобы включить или отключить следующие проверки во время выполнения:
Свойства: | Описание: | По умолчанию: |
---|---|---|
Null checks | Если этот параметр включен, код C++, генерируемый IL2CPP, содержит проверки нулевых значений и при необходимости создает управляемые исключения NullReferenceException. Если этот параметр отключен, IL2CPP не выдает нулевые проверки в сгенерированный код C++. Для некоторых проектов отключение этого параметра может улучшить производительность во время выполнения.
Если этот параметр отключен, Unity не предотвращает попытки доступа к нулевым значениям в сгенерированном коде, что может привести к некорректному поведению. Ваше приложение, скорее всего, рухнет вскоре после того, как оно разыменует нулевое значение. Unity рекомендует не отключать эту опцию. |
Enabled |
Array bounds checks | Если этот параметр включен, код C++, создаваемый IL2CPP, содержит проверки границ массива и при необходимости создает управляемые исключения IndexOutOfRangeException. Если эта опция отключена, IL2CPP не выдает проверки границ массива в сгенерированный код C++.
Для некоторых проектов отключение этого параметра может повысить производительность во время выполнения. Однако, когда этот параметр отключен, Unity не предотвращает попытки доступа к массиву с недопустимыми индексами в сгенерированном коде, что может привести к некорректному поведению, включая чтение или запись в произвольные области памяти. В большинстве случаев эти обращения к памяти происходят без каких-либо немедленных побочных эффектов и могут повредить состояние приложения без каких-либо явных предупреждающих признаков. Это может сильно затруднить отладку этих ошибок. Unity рекомендует оставить этот параметр включенным. |
Enabled |
Divide by zero checks | Если этот параметр включен, код C++, сгенерированный IL2CPP, содержит проверки деления на ноль для целочисленного деления и при необходимости создает управляемые исключения DivideByZeroException. Если эта опция отключена, IL2CPP не выдает проверки деления на ноль при целочисленном делении в сгенерированный код C++.
Эти проверки влияют на производительность во время выполнения. Вы должны включать эту опцию только в том случае, если вам нужно выполнить проверку деления на ноль; в противном случае оставьте его отключенным. |
Disabled |
Чтобы использовать атрибут Il2CppSetOption:
- В каталоге, где установлена ваша версия Unity, перейдите в каталог Data\il2cpp в Windows или в каталог Contents/Frameworks/il2cpp в OS X.
- Найдите исходный файл Il2CppSetOptionAttribute.cs.
- Скопируйте исходный файл в папку Assets вашего проекта.
В приведенном ниже примере показано, как использовать атрибут 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();
}
}
}