Unity windows build support il2cpp что это

Handling platform specific settings for IL2CPP additional arguments

The IL2CPP (Intermediate Language To C++) scripting backendA framework that powers scripting in Unity. Unity supports three different scripting backends depending on target platform: Mono, .NET and IL2CPP. Universal Windows Platform, however, supports only two: .NET and IL2CPP. More info
See in Glossary
is an alternative to the Mono backend. IL2CPP provides better support for applications across a wider range of platforms. The IL2CPP backend converts MSIL (Microsoft Intermediate Language) code (for example, C# code in scripts) into C++ code, then uses the C++ code to create a native binary file (for example, .exe, .apk, or .xap) for your chosen platform.

This type of compilation, in which Unity compiles code specifically for a target platform when it builds the native binary, is called ahead-of-time (AOT) compilation. The Mono backend compiles code at runtime, with a technique called just-in-time compilation (JIT).

On this page:

  • Building a project using IL2CPP
  • How IL2CPP works
  • Optimising IL2CPP build times
  • Enabling runtime checks using IL2CppSetOption

Some platforms don’t support AOT compilationAhead of Time (AOT) compilation is an optimization method used by all platforms except iOS for optimizing the size of the built player. . More info
See in Glossary
, so the IL2CPP backend doesn’t work on every platform. Other platforms support AOT and IL2CPP, but don’t allow JIT compilation, and so can’t support the Mono backend. When a platform can support both backends, Mono is the default. For more information, see Scripting restrictions.

IL2CPP can improve performance across a variety of platforms, but the need to include machine code in built applications increases both the build time and the size of the final built application. For more information, see How IL2CPP works and the blog series An introduction to IL2CPP internals.

IL2CPP supports the debugging of managed code in the same way as the Mono scripting backend. For more information, see Debugging C# code in Unity.

Building a project using IL2CPP

To build a project with IL2CPP, you need to have the backend installed in your Unity installation. You can select IL2CPP as an optional module when you first install a version of Unity, or add IL2CPP support to an existing installation through the Unity Hub. For more information, see Installing the Unity Hub and Add modules to the Unity Editor.

IL2CPP also requires some systems native to the target platform to generate the C++ code. This means that to use IL2CPP on a specific platform, you need to build the application on that platform. For example, to use IL2CPP with MacOS as a build target, you need to build the application on a machine that uses MacOS. For more information about system requirements for desktop platforms, including IL2CPP requirements for individual platforms, see the Desktop section of System Requirements for Unity.

You can change the scripting backend Unity uses to build your application in one of two ways:

  • Through the Player SettingsSettings that let you set various player-specific options for the final game built by Unity. More info
    See in Glossary
    menu in the Editor. Perform the following steps to change the scripting backend through the Player Settings menu:

    1. Go to Edit > Project Settings.
    2. Click on the Player Settings button to open the Player settings for the current platform in the Inspector.
    3. Navigate to the Configuration section heading under the Other Settings sub-menu.
    4. Click on the Scripting Backend dropdown menu, then select IL2CPP.

    You can also open the Player Settings menu from inside the Build Settings menu; go to File > Build Settings and click on the Player Settings button.

  • Through the Editor scripting API. Use the PlayerSettings.SetScriptingBackend property to change the scripting backend that Unity uses.

The Configuration section of the Player settings

The Configuration section of the Player settings

To start the build process, open the Build Settings window and click the Build button. Unity then converts your C# code and assemblies into C++ and finally produces a binary file for your target platform.

How IL2CPP works

When you start a build using IL2CPP, Unity automatically performs the following steps:

  1. The Roslyn C# compiler compiles your application’s C# code and any required package code to .NET DLLs (managed assemblies).
  2. Unity applies managed bytecode stripping. This step can significantly reduce the size of a built application.
  3. The IL2CPP backend converts all managed assemblies into standard C++ code.
  4. The C++ compiler compiles the generated C++ code and the runtime part of IL2CPP with a native platform compiler.
  5. Unity creates either an executable file or a DLL, depending on the platform you target.

Both IL2CPP and Mono provide a few useful options which you can control with attributes in your scriptsA piece of code that allows you to create your own Components, trigger game events, modify Component properties over time and respond to user input in any way you like. More info
See in Glossary
. For more information, see Platform-dependent compilation.

IL2CPP enables Unity to pre-compile code for specific platforms. The binary file Unity produces at the end of this process already contains necessary machine code for the target platform, while Mono has to compile this machine code at runtime during execution. AOT compilation does increase build time, but it also improves compatibility with the target platform and can improve performance.

Both scripting backends require a new build for each platform you want to target. For example, to support both the Android and iOS platforms, you need to build your application twice and produce two binary files.

The assembly stripping stage helps reduce the final binary size. Unity removes any bytecode that the final built application doesn’t use.

Optimizing IL2CPP build times

Project build times when using IL2CPP can be significantly longer than when using Mono. However, you can do several things to reduce build time.

Exclude your project from anti-malware software scans

You can exclude your Unity project folder and target build folders from anti-malware software scans before you build your project.

Store your project and target build folder on a solid-state drive (SSD)

Solid-state drives (SSDs) have faster read/write speeds than traditional hard disk drives (HDD). Converting IL code to C++ and compiling it involves a large number of read/write operations, so a faster storage device speeds up this process.

Change the IL2CPP Code Generation option in the Build Settings

To change how IL2CPP generates code, open the Build Settings and configure the IL2CPP Code Generation option By default, the Faster runtime option is enabled, which produces more machine code that reduces the impact of IL2CPP at runtime. To reduce build times, you can set this option to Faster (smaller) builds. This method produces and includes less machine code in the binary executable and so can reduce performance at runtime, but also significantly reduces build times and binary size.

Enabling runtime checks using Il2CppSetOption

When you use the IL2CPP scripting backend, you can control how il2cpp.exe generates C++ code. You can use the Il2CppSetOption attribute to enable or disable the following runtime checks:

Property: Description: Default:
Null checks If this option is enabled, the C++ code that IL2CPP generates contains null checks and throws managed NullReferenceException exceptions as necessary. If this option is disabled, IL2CPP doesn’t emit the null checks into the generated C++ code. For some projects, disabling this option might improve runtime performance.

When this setting is disabled, Unity doesn’t prevent attempts to access null values in the generated code, which might lead to incorrect behavior. Your application is likely to crash soon after it dereferences the null value. Unity recommends that you don’t disable this option.

Enabled
Array bounds checks If this option is enabled, the C++ code that IL2CPP generates contains array bounds checks and throws managed IndexOutOfRangeException exceptions as necessary. If this option is disabled, IL2CPP doesn’t emit the array bounds checks into the generated C++ code.

For some projects, disabling this option might improve runtime performance. However, when this option is disabled, Unity doesn’t prevent attempts to access an array with invalid indices in the generated code, which might lead to incorrect behavior, including reading from or writing to arbitrary memory locations. In most cases, these memory accesses occur without any immediate side effects, and can corrupt the state of the application with no obvious warning signs. This can make debugging these errors extremely difficult. Unity recommends that you keep this option enabled.

Enabled
Divide by zero checks If this option is enabled, C++ code generated by IL2CPP contains divide by zero checks for integer division and throw managed DivideByZeroException exceptions as necessary. If this option is disabled, IL2CPP doesn’t emit the divide by zero checks on integer division into the generated C++ code.

These checks have an impact on performance at runtime. You should only enable this option if you need to run divide by zero checks; otherwise, leave it disabled.

Disabled

To use the Il2CppSetOption attribute:

  1. In the directory where your Unity version is installed, navigate to the Data\il2cpp directory on Windows, or the Contents/Frameworks/il2cpp directory on OS X.
  2. Find the Il2CppSetOptionAttribute.cs source file.
  3. Copy the source file into your project’s Assets directory.

The below example describes how to use the Il2CppSetOption attribute:

[Il2CppSetOption(Option.NullChecks, false)]
public static string MethodWithNullChecksDisabled()
{
    var tmp = new object();
    return tmp.ToString();
}

You can apply Il2CppSetOption attribute to types, methods, and properties. Unity uses the attribute from the most local scope.

[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();
        }
    }
}

• 2018–05–15 Page amended

Handling platform specific settings for IL2CPP additional arguments

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. . Подробнее
    См. в меню Словарь
    в Редакторе. Выполните следующие шаги, чтобы изменить серверную часть сценариев через меню Настройки проигрывателя:

    1. Выберите Редактировать > Настройки проекта.
    2. Нажмите кнопку Настройки проигрывателя, чтобы открыть настройки проигрывателя для текущей платформы в Инспектор.
    3. Перейдите к заголовку раздела Конфигурация в подменю Другие настройки.
    4. Нажмите раскрывающееся меню Scripting Backend, затем выберите IL2CPP.

    Вы также можете открыть меню Настройки проигрывателя из меню Настройки сборки; перейдите в раздел Файл > Настройки сборки и нажмите кнопку Настройки проигрывателя.

  • Через API сценариев редактора. Используйте свойство PlayerSettings.SetScriptingBackend, чтобы изменить серверную часть сценариев, которую использует Unity.

Раздел «Конфигурация» в настройках проигрывателя

Раздел «Конфигурация» в настройках проигрывателя

Как работает IL2CPP

Когда вы запускаете сборку с использованием IL2CPP, Unity автоматически выполняет следующие шаги:

  1. Компилятор Roslyn C# компилирует код C# вашего приложения и любой необходимый код пакета в .NET DLL (управляемые сборки).
  2. Unity применяет управляемое удаление байт-кода. Этот шаг может значительно уменьшить размер встроенного приложения.
  3. Бэкенд IL2CPP преобразует все управляемые сборки в стандартный код C++.
  4. Компилятор C++ компилирует сгенерированный код C++ и исполняемую часть IL2CPP с помощью собственного компилятора платформы.
  5. 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:

  1. В каталоге, где установлена ваша версия Unity, перейдите в каталог Data\il2cpp в Windows или в каталог Contents/Frameworks/il2cpp в OS X.
  2. Найдите исходный файл Il2CppSetOptionAttribute.cs.
  3. Скопируйте исходный файл в папку 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();
}
}
}

Время на прочтение
6 мин

Количество просмотров 39K

Unity продолжают совершенствовать технологию IL2CPP, а мы публикуем перевод статьи о том, как она работает.

Около года назад мы писали о будущем скриптинга в Unity. Новая технология скриптинга IL2CPP должна была обеспечить движок высокопроизводительной портативной виртуальной машиной. В январе мы выпустили нашу первую платформу на 64-битной iOS, использующую IL2CPP. С выходом Unity 5 появилась еще одна платформа – WebGL. При поддержке огромного сообщества пользователей мы выпустили множество патчей и обновлений для IL2CPP, постепенно оптимизируя компилятор и повышая быстродействие среды.

А пока мы продолжаем совершенствовать технологию IL2CPP, было бы неплохо рассказать о том, как она работает. Мы планируем написать серию статей, посвященных таким темам:

1. Основы – набор инструментов и аргументы командной строки (эта статья).
2. Экскурсия по генерируемому коду.
3. Советы по отладке генерируемого кода.
4. Вызовы методов: обычные методы, виртуальные методы и другие.
5. Реализация общего обмена.
6. Обёртки P/Invoke для типов и методов.
7. Интеграция сборщика мусора.
8. Тестирование и применение фреймворков.

В этих статьях мы обсудим некоторые особенности реализации IL2CPP. Надеюсь, эта информация вам пригодится.

Что такое IL2CPP?

Технология IL2CPP состоит из двух частей:

• компилятор Ahead-of-time (AOT);
• исполняемая библиотека для поддержки виртуальной машины.

AOT-компилятор переводит промежуточный язык (IL) из .NET-компиляторов в исходный код C++. Исполняемая библиотека предоставляет сервисы и абстракции (такие как сборщик мусора), межплатформенный доступ к потокам и файлам, а также способы реализации внутренних вызовов (неуправляемый код, напрямую изменяющий управляемые структуры данных).

AOT-компилятор

AOT-компилятор IL2CPP называется il2cpp.exe. В Windows его можно найти в директории Editor\Data\il2cpp, а в OS X – в директории Contents/Frameworks/il2cpp/build в месте установки Unity. Утилита il2cpp.exe полностью написана на языке C# и скомпилирована с помощью .NET и компиляторов Mono.

Эта утилита принимает управляемые сборки, скомпилированные Mono-компилятором, поставляемым с Unity, и генерирует код C++, который мы передаем в компилятор C++ для конкретной платформы.
Инструментарий IL2CPP можно схематически представить так:

Исполняемая библиотека

Вторая часть технологии IL2CPP – это исполняемая библиотека для поддержки виртуальной машины. Мы написали эту библиотеку почти полностью на C++ (в ней есть немного платформенного кода, но пусть это останется между нами) и назвали ее libil2cpp. Она поставляется в виде статической библиотеки, связанной с исполняемым файлом плеера, а ее простота и портативность являются одними из ключевых преимуществ технологии IL2CPP.

Вы можете получить более четкое представление об организации кода libil2cpp, глядя на файлы заголовков, поставляемых с Unity (их можно найти в директории Editor\Data\PlaybackEngines\webglsupport\BuildTools\Libraries\libil2cpp\include в Windows, или в директории Contents/Frameworks/il2cpp/libil2cpp – в OS X). Например, интерфейс между кодом C++, генерируемым il2cpp.exe, и средой libil2cpp находится в файле заголовка codegen/il2cpp-codegen.h.

Один из ключевых элементов среды – сборщик мусора. В комплект Unity 5 входит libgc, сборщик мусора Boehm-Demers-Weiser. Однако libil2cpp поддерживает и другие сборщики. Например, мы рассматриваем возможность интеграции с Microsoft GC – сборщиком с открытым исходным кодом в комплекте CoreCLR. В одной из следующих статей мы расскажем о нём подробнее.

Как выполняется il2cpp.exe?

Давайте рассмотрим на примере. Для этого я создам новый пустой проект в Unity 5.0.1 на Windows. Чтобы у нас был хотя бы один пользовательский скрипт, я добавлю к главной камере простой компонент MonoBehaviour:

При сборке для платформы WebGL я могу использовать Process Explorer, чтобы увидеть команду для запуска il2cpp.exe:

"C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\bin\mono.exe" "C:\Program Files\Unity\Editor\Data\il2cpp/il2cpp.exe" --copy-level=None --enable-generic-sharing --enable-unity-event-support --output-format=Compact --extra-types.file="C:\Program Files\Unity\Editor\Data\il2cpp\il2cpp_default_extra_types.txt" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\Assembly-CSharp.dll" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\UnityEngine.UI.dll" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\il2cppOutput"

Это достаточно длинная строка, поэтому давайте разберем ее по частям. Сперва Unity запускает этот исполняемый файл:

«C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\bin\mono.exe»

Следующий аргумент – сама утилита il2cpp.exe.

«C:\Program Files\Unity\Editor\Data\il2cpp/il2cpp.exe»

Остальные аргументы передаются il2cpp.exe, а не mono.exe. Давайте разберем и их. Во-первых, Unity передает 5 флагов il2cpp.exe:

• -copy-level=None
Указывает, что il2cpp.exe не следует выполнять специальные копии файлов генерируемого кода C++.

• -enable-generic-sharing
Уменьшает размер кода и бинарного файла. Со временем мы опубликуем процесс выполнения универсальных методов в IL2CPP.

• -enable-unity-event-support
Обеспечивает корректную генерацию кода для событий Unity, вызываемых при помощи рефлексии.

• -output-format=Compact
Генерирует код C++ в формате с меньшим количеством символов для имен типов и методов. Учитывая, что имена на промежуточном языке не сохраняются, такой код сложнее отлаживать, но зато он быстрее компилируется, поскольку компилятору C++ нужно разобрать меньше кода.

• -extra-types.file=»C:\Program Files\Unity\Editor\Data\il2cpp\il2cpp_default_extra_types.txt»
Использует стандартный пустой файл для дополнительных типов. Его можно добавить в проект Unity, чтобы il2cpp.exe знал, какие универсальные или индексируемые типы создаются во время выполнения, но не указаны в коде IL.

Стоит отметить, что этот набор аргументов командной строки для il2cpp.exe всё еще нестабилен и, скорее всего, изменится в последующих версиях.

Итак, в командной строке указаны 2 файла и 1 директория:

• «C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\Assembly-CSharp.dll»
• «C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\UnityEngine.UI.dll»
• «C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\il2cppOutput»

Утилита il2cpp.exe принимает список всех сборок IL, подлежащих конвертации. В нашем случае сюда входит мой простой скрипт MonoBehaviour, Assembly-CSharp.dll и UnityEngine.UI.dll. Обратите внимание, что здесь явно отсутствует несколько сборок. Очевидно, что мой скрипт ссылается на UnityEngine.dll, а значит нужен хотя бы mscorlib.dll, и, возможно, другие сборки. Но где они? Дело в том, что разрешение сборок происходит внутри il2cpp.exe. Их можно упомянуть в командной строке, но это необязательно. Получается, Unity нужно всего лишь указать корневые сборки (на которые не ссылаются другие сборки).

Последний аргумент командной строки il2cpp.exe – каталог, в котором создаются файлы C++. Если вам интересно, вы можете сами ознакомиться со сгенерированными файлами, но мы еще поговорим о них подробнее в следующей статье. Прежде чем открыть каталог, вам стоит выбрать опцию Development Player в настройках сборки WebGL. Это удалит аргумент -output-format=Compact и улучшит отображение имен типов и методов в коде C++.

Попробуйте поиграть с настройками Player Settings WebGL или iOS. Вы увидите различные параметры командной строки, передаваемые il2cpp.exe и отвечающие за различные этапы генерации кода. Например, задав параметру Enable Exceptions в WebGL Player Settings значение Full, вы добавите в командную строку аргументы -emit-null-checks, -enable-stacktrace и -enable-array-bounds-check.

Чего не делает IL2CPP?

Хотелось бы обратить внимание на одну сложность, которую мы решили обойти стороной и таким образом избежали многих проблем. Мы не пытались переписать стандартную библиотеку C# под IL2CPP. При создании проекта Unity с использованием IL2CPP весь код стандартных библиотек C# (mscorlib.dll, System.dll и т. д.) является точной копией кода Mono-скриптов.

Мы используем код стандартных библиотек C#, потому что он уже успел хорошо зарекомендовать себя во многих проектах. Таким образом, если где-то возникает ошибка, мы можем быть уверены, что проблема в AOT-компиляторе или исполняемой библиотеке.

Разработка, тестирование и выпуск IL2CPP

С момента первого официального релиза IL2CPP версии 4.6.1p5 в январе мы выпустили 6 полноценных обновлений и 7 патчей (для Unity 4.6 и 5.0), в которых исправили более ста ошибок.

Чтобы обеспечить непрерывную оптимизацию, мы разрабатываем обновления на базе одной версии кода. Перед каждым релизом мы передаем все изменения в конкретную релизную ветку, проводим тестирование и проверяем, все ли ошибки были успешно исправлены. Наши команды QA и Sustained Engineering прикладывают максимум усилий, чтобы разработка велась в таком темпе, и ошибки исправлялись каждую неделю.

Наше сообщество оказало нам бесценную помощь, предоставив множество полезных сообщений об ошибках. Мы очень благодарны пользователям за все отзывы, которые помогают непрерывно улучшать IL2CPP.

Для разработчиков IL2CPP тестирование стоит на первом месте. Мы часто берем за основу технику разработки через тестирование и крайне редко отправляем запросы на включение, если код не был полностью протестирован. Эта стратегия хорошо работает для таких технологий, как IL2CPP, где есть четкие входы и выходы. Это означает, что подавляющее большинство ошибок, с которыми мы сталкиваемся, являются скорее частными случаями, чем неожиданным поведением системы (например, при использовании 64-битного IntPtr в качестве 32-битного индекса массива может произойти вылет с ошибкой компилятора С++). Таким образом, мы можем быстро определять и исправлять любые баги.
При поддержке нашего сообщества мы всё время делаем IL2CPP стабильнее и производительнее.

Продолжение следует
Боюсь, я слишком часто упоминаю о следующих статьях. Просто хочется рассказать очень много, и это не уместить в одном посте. В следующий раз мы покопаемся в коде, генерируемом il2cpp.exe, и поговорим о работе компилятора C++.

Мы не планируем прекращать поддержку и развитие IL2CPP, но мы подумали, что было бы неплохо сделать шаг в сторону и рассказать немного о том, как работает IL2CPP. В течение следующих нескольких месяцев мы планируем написать о следующих темах (возможно. и о других) в серии постов об IL2CPP:

Основы — набор инструментов и аргументы командной строки (этот пост).

  1. Экскурсия по генерируемому коду.
  2. Советы по отладке генерируемого кода.
  3. Вызовы методов (обычные методы, виртуальные методы, и т.д.).
  4. Реализация общего обмена.
  5. Обертки P/вызова для типов и методов.
  6. Интеграция сборщика мусора.
  7. Тестирование и применение фреймворков.

Мы собираемся обсудить некоторые детали о реализации IL2CPP, что, несомненно, изменится в будущем. Надеюсь, мы все еще можем предоставить некоторую полезную и интересную информацию.

Что такое IL2CPP?

Технология, которую мы называем IL2CPP, состоит из двух отдельных частей:

  • Ahead-of-time (AOT) компилятор
  • Исполняемая библиотека для поддержки виртуальной машины

AOT компилятор переводит промежуточный язык (IL) из .NET компиляторов в C++ код. Исполняемая библиотека предоставляет инструменты, такие как сборщик мусора, независимый от платформы доступ к потокам и файлам, реализации внутренних вызовов (нативный код, который изменяет управляемые структуры данных напрямую).

AOT компилятор

AOT компилятор IL2CPP называется il2cpp.exe. В Windows вы можете найти его в директории Editor\Data\il2cpp. На OSX – в директории Contents/Frameworks/il2cpp/build в месте установки Unity. Утилита Il2cpp.exe полностью написана на C#. Мы скомпилировали ее с помощью .NET и Mono компиляторов во время разработки IL2CPP.

Утилита Il2cpp.exe принимает управляемые сборки, собранные с компилятором Mono, который поставляется с Unity, и генерирует C++ код, который мы передаем в C++ компилятор конкретной платформы.

Вы можете думать об инструментах IL2CPP так:

What is IL2CPP?

Мы не планируем прекращать поддержку и развитие IL2CPP, но мы подумали, что было бы неплохо сделать шаг в сторону и рассказать немного о том, как работает IL2CPP. В течение следующих нескольких месяцев мы планируем написать о следующих темах (возможно. и о других) в серии постов об IL2CPP:

Основы — набор инструментов и аргументы командной строки (этот пост).

  1. Экскурсия по генерируемому коду.
  2. Советы по отладке генерируемого кода.
  3. Вызовы методов (обычные методы, виртуальные методы, и т.д.).
  4. Реализация общего обмена.
  5. Обертки P/вызова для типов и методов.
  6. Интеграция сборщика мусора.
  7. Тестирование и применение фреймворков.

Мы собираемся обсудить некоторые детали о реализации IL2CPP, что, несомненно, изменится в будущем. Надеюсь, мы все еще можем предоставить некоторую полезную и интересную информацию.

Что такое IL2CPP?

Технология, которую мы называем IL2CPP, состоит из двух отдельных частей:

  • Ahead-of-time (AOT) компилятор
  • Исполняемая библиотека для поддержки виртуальной машины

AOT компилятор переводит промежуточный язык (IL) из .NET компиляторов в C++ код. Исполняемая библиотека предоставляет инструменты, такие как сборщик мусора, независимый от платформы доступ к потокам и файлам, реализации внутренних вызовов (нативный код, который изменяет управляемые структуры данных напрямую).

AOT компилятор

AOT компилятор IL2CPP называется il2cpp.exe. В Windows вы можете найти его в директории Editor\Data\il2cpp. На OSX – в директории Contents/Frameworks/il2cpp/build в месте установки Unity. Утилита Il2cpp.exe полностью написана на C#. Мы скомпилировали ее с помощью .NET и Mono компиляторов во время разработки IL2CPP.

Утилита Il2cpp.exe принимает управляемые сборки, собранные с компилятором Mono, который поставляется с Unity, и генерирует C++ код, который мы передаем в C++ компилятор конкретной платформы.

Вы можете думать об инструментах IL2CPP так:

The AOT compiler

Мы не планируем прекращать поддержку и развитие IL2CPP, но мы подумали, что было бы неплохо сделать шаг в сторону и рассказать немного о том, как работает IL2CPP. В течение следующих нескольких месяцев мы планируем написать о следующих темах (возможно. и о других) в серии постов об IL2CPP:

Основы — набор инструментов и аргументы командной строки (этот пост).

  1. Экскурсия по генерируемому коду.
  2. Советы по отладке генерируемого кода.
  3. Вызовы методов (обычные методы, виртуальные методы, и т.д.).
  4. Реализация общего обмена.
  5. Обертки P/вызова для типов и методов.
  6. Интеграция сборщика мусора.
  7. Тестирование и применение фреймворков.

Мы собираемся обсудить некоторые детали о реализации IL2CPP, что, несомненно, изменится в будущем. Надеюсь, мы все еще можем предоставить некоторую полезную и интересную информацию.

Что такое IL2CPP?

Технология, которую мы называем IL2CPP, состоит из двух отдельных частей:

  • Ahead-of-time (AOT) компилятор
  • Исполняемая библиотека для поддержки виртуальной машины

AOT компилятор переводит промежуточный язык (IL) из .NET компиляторов в C++ код. Исполняемая библиотека предоставляет инструменты, такие как сборщик мусора, независимый от платформы доступ к потокам и файлам, реализации внутренних вызовов (нативный код, который изменяет управляемые структуры данных напрямую).

AOT компилятор

AOT компилятор IL2CPP называется il2cpp.exe. В Windows вы можете найти его в директории Editor\Data\il2cpp. На OSX – в директории Contents/Frameworks/il2cpp/build в месте установки Unity. Утилита Il2cpp.exe полностью написана на C#. Мы скомпилировали ее с помощью .NET и Mono компиляторов во время разработки IL2CPP.

Утилита Il2cpp.exe принимает управляемые сборки, собранные с компилятором Mono, который поставляется с Unity, и генерирует C++ код, который мы передаем в C++ компилятор конкретной платформы.

Вы можете думать об инструментах IL2CPP так:

il2cpp toolchain smalleril2cpp toolchain smaller

The runtime library

Исполняемая библиотека

Другая часть технологии IL2CPP — это исполняемая библиотека для поддержки виртуальной машины. Мы написали эту библиотеку почти полностью на C++ (он содержит немного платформенного кода, но пусть это останется между нами). Мы назвали ее libil2cpp, она поставляется в статической библиотеке связанной с исполняемым файлом плеера. Одно из ключевых преимуществ технологии IL2CPP — это простая и портативная исполняемая библиотека.

Вы можете найти некоторые подсказки о том, как код libil2cpp организован глядя на файлы заголовков для libil2cpp, которые поставляются с Unity (вы найдете их в директории Editor\Data\PlaybackEngines\webglsupport\BuildTools\Libraries\libil2cpp\include на Windows, или в Contents/Frameworks/il2cpp/libil2cpp на OSX). Например, интерфейс между генерацией C++ кода il2cpp.exe и libil2cpp находится в файле заголовка codegen/il2cpp-codegen.h.

Один из ключевых элементов — сборщик мусора. Мы поставляем Unity 5 с libgc, сборщиком мусора Boehm-Demers-Weiser. Тем не менее, libil2cpp была разработана, чтобы позволить нам использовать другие сборщики мусора. Например, мы исследуем интеграцию Microsoft GC, который стал с открытым кодом в рамках CoreCLR. Мы расскажем больше об этом позже в нашей статье об интеграции сборщика мусора.

Как выполняется il2cpp.exe?

Давайте рассмотрим на примере. Я буду использовать Unity 5.0.1 на Windows, и я начну с нового проекта. Так что у нас есть один пользовательский скрипт, я добавлю этот простой компонент MonoBehaviour к главной камере в сцене:

[csharp]using UnityEngine;

public class HelloWorld : MonoBehaviour {
void Start () {
Debug.Log(«Hello, IL2CPP!»);
}
}[/csharp]

Когда я соберу проект для WebGL, я могу использовать Process Explorer, чтобы увидеть команду Unity, используемую для запуска il2cpp.exe:

"C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\bin\mono.exe" "C:\Program Files\Unity\Editor\Data\il2cpp/il2cpp.exe" --copy-level=None --enable-generic-sharing --enable-unity-event-support --output-format=Compact --extra-types.file="C:\Program Files\Unity\Editor\Data\il2cpp\il2cpp_default_extra_types.txt" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\Assembly-CSharp.dll" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\UnityEngine.UI.dll" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\il2cppOutput"

Это строка довольно длинная и страшная, так что давайте разберем ее. Во-первых, Unity запускает этот исполняемый файл:

"C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\bin\mono.exe"

Следующий аргумент — сама утилита il2cpp.exe.

"C:\Program Files\Unity\Editor\Data\il2cpp/il2cpp.exe"

Остальные аргументы передаются il2cpp.exe, а не mono.exe. Давайте посмотрим на них. Во-первых, Unity передает пять флагов il2cpp.exe:

  • —copy-level=None
    • Указывает, что il2cpp.exe не следует выполнять специальные копии файлов генерируемого C++ кода.
  • —enable-generic-sharing
    • Функция уменьшения размера кода и бинарника. IL2CPP поделятся реализацией генерированных методов, когда это возможно.
  • —enable-unity-event-support
    • Специальная поддержка кода для событий Unity, доступ к которым осуществляется с помощью рефлексии.
  • —output-format=Compact
    • Создание C++ кода в формате, который требует меньше символов для имен типов и методов. Этот код трудно отлаживать, поскольку имена в коде IL не сохраняются, но часто компилируется быстрее, так как будет меньше кода для разбора компилятором C++.
  • —extra-types.file=»C:\Program Files\Unity\Editor\Data\il2cpp\il2cpp_default_extra_types.txt»
    • Использует значение по умолчанию (или пустой) дополнительный файл типов. Этот файл может быть добавлен в проект Unity, чтобы знать, какие il2cpp.exe типы будут созданы во время выполнения, но не присутствуют в коде IL.

Важно отметить, что эти аргументы могут быть и будут изменены в более поздних версиях. Ещё не то время, когда у нас есть стабильный и поддерживаемый набор аргументов для il2cpp.exe.

В итоге у нас есть два файла и одна директория:

  • «C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\Assembly-CSharp.dll»
  • «C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\UnityEngine.UI.dll»
  • «C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\il2cppOutput»

Утилита il2cpp.exe принимает список всех сборок IL, которые следует конвертировать. В нашем случае это сборка, содержащая мой простой скрипт MonoBehaviour, Assembly-CSharp.dll и UnityEngine.UI.dll. Обратите внимание, что здесь есть несколько явно недостающих сборок. Очевидно, что мой скрипт ссылается на UnityEngine.dll, и, по крайней мере необходима mscorlib.dll, и, возможно, другие сборки. Где они? На самом деле, il2cpp.exe определяет эти сборки внутри. Они могут быть упомянуты в командной строке, но это необязательно. Unity явно нужно указать только главные сборки (те, на которые не ссылаются другие сборки).

Последний аргумент в il2cpp.exe — каталог, где должны быть созданы файлы C++. Если вам интересно, посмотрите на сгенерированные файлы в этом каталоге, они будут предметом следующей статьи в этой серии. Прежде чем это сделать, вы, возможно, захотите выбрать опцию «Development Player» в настройках сборки WebGL. Это удалит аргумент –output-format=Compact и даст вам лучшие имена типов и методов в созданном C++ коде.

Попробуйте изменить различные параметры в Player Settings WebGL или iOS. Вы увидите различные аргументы, передаваемые il2cpp.exe включающие различные этапы генерации кода. Например, изменение опции «Enable Exceptions» в Player Settings WebGL на «Full» добавляет аргументы –emit-null-checks, –enable-stacktrace, и –enable-array-bounds-check к вызову il2cpp.exe.

Чего не делает IL2CPP?

Я хотел бы указать на одну из проблем, которые мы не учли в IL2CPP. Мы не пытались переписать стандартную библиотеку C# в IL2CPP. При создании проекта Unity, который использует IL2CPP, весь код стандартных библиотек C# mscorlib.dll, System.dll и т.д. является точно таким же кодом, какой используется для написания скриптов с Mono.

Мы полагаемся на код стандартных библиотек C#, который уже известен пользователям и хорошо проверен в проектах Unity. Поэтому, когда мы исследуем ошибки, связанные с IL2CPP, мы можем быть достаточно уверены, что это ошибка в компиляторе AOT или в исполняемой библиотеки, и нигде больше.

Как мы разрабатываем, тестируем и выпускаем IL2CPP

С момента первоначального публичного релиза IL2CPP в версии 4.6.1p5 в январе, мы выпустили 6 полных релизов и 7 патчей (в разных версиях Unity 4.6 и 5.0). Мы исправили более 100 ошибок, упомянутых в примечаниях к выпуску.

Для того чтобы сделать это процесс совершенствования непрерывным, мы разрабатываем только одну версию кода IL2CPP. Перед каждым выпуском мы портируем изменения IL2CPP для конкретной ветки версий, запускаем наши тесты и проверяем, все ли исправления корректно работают в этой версии. Наши команды QA и Sustained Engineering проделали невероятную работу, чтобы сделать возможным выпуск обновлений так быстро. Это означает, что наши пользователи будут ждать не более одной недели с момента последних исправлений для IL2CPP.

Наше сообщество пользователей, оказалось бесценным, представив множество полезных сообщений об ошибках. Мы ценим все отзывы от наших пользователей, помогающие непрерывно улучшать IL2CPP, и мы с нетерпением ждем больше.

Команда разработчиков работает над IL2CPP имея настрой на сильный тест. Мы часто используем методы Test Driven Design, и редко отправляем запросы на слияние без хороших тестов. Эта стратегия хорошо работает для технологий, таких как IL2CPP, где у нас есть четкие входы и выходы. Это означает, что подавляющее большинство ошибок, которые мы видим, не неожиданное поведение, а неожиданные случаи (например, можно использовать 64-битный IntPtr как 32-битный индекс массива, в результате чего вылет с ошибкой компилятора С++, и в реальном коде на самом деле так делают!). Это различие позволяет нам быстро исправлять ошибки.

С помощью нашего сообщества мы работаем над тем, чтобы IL2CPP работал стабильно и быстро, насколько возможно. Кстати, если это интересно вам, у нас есть вакансия (просто говорю).

Дальше — больше

Боюсь, что я провел слишком много времени здесь, говоря о будущих записях в блоге. Нам многое хочется рассказать, и все это просто не уместятся в одном посте. В следующий раз мы будем копаться в коде, созданном il2cpp.exe, чтобы узнать, как ваш проект на самом деле выглядит для компилятора C++.

How is il2cpp.exe executed?

Исполняемая библиотека

Другая часть технологии IL2CPP — это исполняемая библиотека для поддержки виртуальной машины. Мы написали эту библиотеку почти полностью на C++ (он содержит немного платформенного кода, но пусть это останется между нами). Мы назвали ее libil2cpp, она поставляется в статической библиотеке связанной с исполняемым файлом плеера. Одно из ключевых преимуществ технологии IL2CPP — это простая и портативная исполняемая библиотека.

Вы можете найти некоторые подсказки о том, как код libil2cpp организован глядя на файлы заголовков для libil2cpp, которые поставляются с Unity (вы найдете их в директории Editor\Data\PlaybackEngines\webglsupport\BuildTools\Libraries\libil2cpp\include на Windows, или в Contents/Frameworks/il2cpp/libil2cpp на OSX). Например, интерфейс между генерацией C++ кода il2cpp.exe и libil2cpp находится в файле заголовка codegen/il2cpp-codegen.h.

Один из ключевых элементов — сборщик мусора. Мы поставляем Unity 5 с libgc, сборщиком мусора Boehm-Demers-Weiser. Тем не менее, libil2cpp была разработана, чтобы позволить нам использовать другие сборщики мусора. Например, мы исследуем интеграцию Microsoft GC, который стал с открытым кодом в рамках CoreCLR. Мы расскажем больше об этом позже в нашей статье об интеграции сборщика мусора.

Как выполняется il2cpp.exe?

Давайте рассмотрим на примере. Я буду использовать Unity 5.0.1 на Windows, и я начну с нового проекта. Так что у нас есть один пользовательский скрипт, я добавлю этот простой компонент MonoBehaviour к главной камере в сцене:

[csharp]using UnityEngine;

public class HelloWorld : MonoBehaviour {
void Start () {
Debug.Log(«Hello, IL2CPP!»);
}
}[/csharp]

Когда я соберу проект для WebGL, я могу использовать Process Explorer, чтобы увидеть команду Unity, используемую для запуска il2cpp.exe:

"C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\bin\mono.exe" "C:\Program Files\Unity\Editor\Data\il2cpp/il2cpp.exe" --copy-level=None --enable-generic-sharing --enable-unity-event-support --output-format=Compact --extra-types.file="C:\Program Files\Unity\Editor\Data\il2cpp\il2cpp_default_extra_types.txt" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\Assembly-CSharp.dll" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\UnityEngine.UI.dll" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\il2cppOutput"

Это строка довольно длинная и страшная, так что давайте разберем ее. Во-первых, Unity запускает этот исполняемый файл:

"C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\bin\mono.exe"

Следующий аргумент — сама утилита il2cpp.exe.

"C:\Program Files\Unity\Editor\Data\il2cpp/il2cpp.exe"

Остальные аргументы передаются il2cpp.exe, а не mono.exe. Давайте посмотрим на них. Во-первых, Unity передает пять флагов il2cpp.exe:

  • —copy-level=None
    • Указывает, что il2cpp.exe не следует выполнять специальные копии файлов генерируемого C++ кода.
  • —enable-generic-sharing
    • Функция уменьшения размера кода и бинарника. IL2CPP поделятся реализацией генерированных методов, когда это возможно.
  • —enable-unity-event-support
    • Специальная поддержка кода для событий Unity, доступ к которым осуществляется с помощью рефлексии.
  • —output-format=Compact
    • Создание C++ кода в формате, который требует меньше символов для имен типов и методов. Этот код трудно отлаживать, поскольку имена в коде IL не сохраняются, но часто компилируется быстрее, так как будет меньше кода для разбора компилятором C++.
  • —extra-types.file=»C:\Program Files\Unity\Editor\Data\il2cpp\il2cpp_default_extra_types.txt»
    • Использует значение по умолчанию (или пустой) дополнительный файл типов. Этот файл может быть добавлен в проект Unity, чтобы знать, какие il2cpp.exe типы будут созданы во время выполнения, но не присутствуют в коде IL.

Важно отметить, что эти аргументы могут быть и будут изменены в более поздних версиях. Ещё не то время, когда у нас есть стабильный и поддерживаемый набор аргументов для il2cpp.exe.

В итоге у нас есть два файла и одна директория:

  • «C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\Assembly-CSharp.dll»
  • «C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\UnityEngine.UI.dll»
  • «C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\il2cppOutput»

Утилита il2cpp.exe принимает список всех сборок IL, которые следует конвертировать. В нашем случае это сборка, содержащая мой простой скрипт MonoBehaviour, Assembly-CSharp.dll и UnityEngine.UI.dll. Обратите внимание, что здесь есть несколько явно недостающих сборок. Очевидно, что мой скрипт ссылается на UnityEngine.dll, и, по крайней мере необходима mscorlib.dll, и, возможно, другие сборки. Где они? На самом деле, il2cpp.exe определяет эти сборки внутри. Они могут быть упомянуты в командной строке, но это необязательно. Unity явно нужно указать только главные сборки (те, на которые не ссылаются другие сборки).

Последний аргумент в il2cpp.exe — каталог, где должны быть созданы файлы C++. Если вам интересно, посмотрите на сгенерированные файлы в этом каталоге, они будут предметом следующей статьи в этой серии. Прежде чем это сделать, вы, возможно, захотите выбрать опцию «Development Player» в настройках сборки WebGL. Это удалит аргумент –output-format=Compact и даст вам лучшие имена типов и методов в созданном C++ коде.

Попробуйте изменить различные параметры в Player Settings WebGL или iOS. Вы увидите различные аргументы, передаваемые il2cpp.exe включающие различные этапы генерации кода. Например, изменение опции «Enable Exceptions» в Player Settings WebGL на «Full» добавляет аргументы –emit-null-checks, –enable-stacktrace, и –enable-array-bounds-check к вызову il2cpp.exe.

Чего не делает IL2CPP?

Я хотел бы указать на одну из проблем, которые мы не учли в IL2CPP. Мы не пытались переписать стандартную библиотеку C# в IL2CPP. При создании проекта Unity, который использует IL2CPP, весь код стандартных библиотек C# mscorlib.dll, System.dll и т.д. является точно таким же кодом, какой используется для написания скриптов с Mono.

Мы полагаемся на код стандартных библиотек C#, который уже известен пользователям и хорошо проверен в проектах Unity. Поэтому, когда мы исследуем ошибки, связанные с IL2CPP, мы можем быть достаточно уверены, что это ошибка в компиляторе AOT или в исполняемой библиотеки, и нигде больше.

Как мы разрабатываем, тестируем и выпускаем IL2CPP

С момента первоначального публичного релиза IL2CPP в версии 4.6.1p5 в январе, мы выпустили 6 полных релизов и 7 патчей (в разных версиях Unity 4.6 и 5.0). Мы исправили более 100 ошибок, упомянутых в примечаниях к выпуску.

Для того чтобы сделать это процесс совершенствования непрерывным, мы разрабатываем только одну версию кода IL2CPP. Перед каждым выпуском мы портируем изменения IL2CPP для конкретной ветки версий, запускаем наши тесты и проверяем, все ли исправления корректно работают в этой версии. Наши команды QA и Sustained Engineering проделали невероятную работу, чтобы сделать возможным выпуск обновлений так быстро. Это означает, что наши пользователи будут ждать не более одной недели с момента последних исправлений для IL2CPP.

Наше сообщество пользователей, оказалось бесценным, представив множество полезных сообщений об ошибках. Мы ценим все отзывы от наших пользователей, помогающие непрерывно улучшать IL2CPP, и мы с нетерпением ждем больше.

Команда разработчиков работает над IL2CPP имея настрой на сильный тест. Мы часто используем методы Test Driven Design, и редко отправляем запросы на слияние без хороших тестов. Эта стратегия хорошо работает для технологий, таких как IL2CPP, где у нас есть четкие входы и выходы. Это означает, что подавляющее большинство ошибок, которые мы видим, не неожиданное поведение, а неожиданные случаи (например, можно использовать 64-битный IntPtr как 32-битный индекс массива, в результате чего вылет с ошибкой компилятора С++, и в реальном коде на самом деле так делают!). Это различие позволяет нам быстро исправлять ошибки.

С помощью нашего сообщества мы работаем над тем, чтобы IL2CPP работал стабильно и быстро, насколько возможно. Кстати, если это интересно вам, у нас есть вакансия (просто говорю).

Дальше — больше

Боюсь, что я провел слишком много времени здесь, говоря о будущих записях в блоге. Нам многое хочется рассказать, и все это просто не уместятся в одном посте. В следующий раз мы будем копаться в коде, созданном il2cpp.exe, чтобы узнать, как ваш проект на самом деле выглядит для компилятора C++.

What does IL2CPP not do?

Исполняемая библиотека

Другая часть технологии IL2CPP — это исполняемая библиотека для поддержки виртуальной машины. Мы написали эту библиотеку почти полностью на C++ (он содержит немного платформенного кода, но пусть это останется между нами). Мы назвали ее libil2cpp, она поставляется в статической библиотеке связанной с исполняемым файлом плеера. Одно из ключевых преимуществ технологии IL2CPP — это простая и портативная исполняемая библиотека.

Вы можете найти некоторые подсказки о том, как код libil2cpp организован глядя на файлы заголовков для libil2cpp, которые поставляются с Unity (вы найдете их в директории Editor\Data\PlaybackEngines\webglsupport\BuildTools\Libraries\libil2cpp\include на Windows, или в Contents/Frameworks/il2cpp/libil2cpp на OSX). Например, интерфейс между генерацией C++ кода il2cpp.exe и libil2cpp находится в файле заголовка codegen/il2cpp-codegen.h.

Один из ключевых элементов — сборщик мусора. Мы поставляем Unity 5 с libgc, сборщиком мусора Boehm-Demers-Weiser. Тем не менее, libil2cpp была разработана, чтобы позволить нам использовать другие сборщики мусора. Например, мы исследуем интеграцию Microsoft GC, который стал с открытым кодом в рамках CoreCLR. Мы расскажем больше об этом позже в нашей статье об интеграции сборщика мусора.

Как выполняется il2cpp.exe?

Давайте рассмотрим на примере. Я буду использовать Unity 5.0.1 на Windows, и я начну с нового проекта. Так что у нас есть один пользовательский скрипт, я добавлю этот простой компонент MonoBehaviour к главной камере в сцене:

[csharp]using UnityEngine;

public class HelloWorld : MonoBehaviour {
void Start () {
Debug.Log(«Hello, IL2CPP!»);
}
}[/csharp]

Когда я соберу проект для WebGL, я могу использовать Process Explorer, чтобы увидеть команду Unity, используемую для запуска il2cpp.exe:

"C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\bin\mono.exe" "C:\Program Files\Unity\Editor\Data\il2cpp/il2cpp.exe" --copy-level=None --enable-generic-sharing --enable-unity-event-support --output-format=Compact --extra-types.file="C:\Program Files\Unity\Editor\Data\il2cpp\il2cpp_default_extra_types.txt" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\Assembly-CSharp.dll" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\UnityEngine.UI.dll" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\il2cppOutput"

Это строка довольно длинная и страшная, так что давайте разберем ее. Во-первых, Unity запускает этот исполняемый файл:

"C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\bin\mono.exe"

Следующий аргумент — сама утилита il2cpp.exe.

"C:\Program Files\Unity\Editor\Data\il2cpp/il2cpp.exe"

Остальные аргументы передаются il2cpp.exe, а не mono.exe. Давайте посмотрим на них. Во-первых, Unity передает пять флагов il2cpp.exe:

  • —copy-level=None
    • Указывает, что il2cpp.exe не следует выполнять специальные копии файлов генерируемого C++ кода.
  • —enable-generic-sharing
    • Функция уменьшения размера кода и бинарника. IL2CPP поделятся реализацией генерированных методов, когда это возможно.
  • —enable-unity-event-support
    • Специальная поддержка кода для событий Unity, доступ к которым осуществляется с помощью рефлексии.
  • —output-format=Compact
    • Создание C++ кода в формате, который требует меньше символов для имен типов и методов. Этот код трудно отлаживать, поскольку имена в коде IL не сохраняются, но часто компилируется быстрее, так как будет меньше кода для разбора компилятором C++.
  • —extra-types.file=»C:\Program Files\Unity\Editor\Data\il2cpp\il2cpp_default_extra_types.txt»
    • Использует значение по умолчанию (или пустой) дополнительный файл типов. Этот файл может быть добавлен в проект Unity, чтобы знать, какие il2cpp.exe типы будут созданы во время выполнения, но не присутствуют в коде IL.

Важно отметить, что эти аргументы могут быть и будут изменены в более поздних версиях. Ещё не то время, когда у нас есть стабильный и поддерживаемый набор аргументов для il2cpp.exe.

В итоге у нас есть два файла и одна директория:

  • «C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\Assembly-CSharp.dll»
  • «C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\UnityEngine.UI.dll»
  • «C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\il2cppOutput»

Утилита il2cpp.exe принимает список всех сборок IL, которые следует конвертировать. В нашем случае это сборка, содержащая мой простой скрипт MonoBehaviour, Assembly-CSharp.dll и UnityEngine.UI.dll. Обратите внимание, что здесь есть несколько явно недостающих сборок. Очевидно, что мой скрипт ссылается на UnityEngine.dll, и, по крайней мере необходима mscorlib.dll, и, возможно, другие сборки. Где они? На самом деле, il2cpp.exe определяет эти сборки внутри. Они могут быть упомянуты в командной строке, но это необязательно. Unity явно нужно указать только главные сборки (те, на которые не ссылаются другие сборки).

Последний аргумент в il2cpp.exe — каталог, где должны быть созданы файлы C++. Если вам интересно, посмотрите на сгенерированные файлы в этом каталоге, они будут предметом следующей статьи в этой серии. Прежде чем это сделать, вы, возможно, захотите выбрать опцию «Development Player» в настройках сборки WebGL. Это удалит аргумент –output-format=Compact и даст вам лучшие имена типов и методов в созданном C++ коде.

Попробуйте изменить различные параметры в Player Settings WebGL или iOS. Вы увидите различные аргументы, передаваемые il2cpp.exe включающие различные этапы генерации кода. Например, изменение опции «Enable Exceptions» в Player Settings WebGL на «Full» добавляет аргументы –emit-null-checks, –enable-stacktrace, и –enable-array-bounds-check к вызову il2cpp.exe.

Чего не делает IL2CPP?

Я хотел бы указать на одну из проблем, которые мы не учли в IL2CPP. Мы не пытались переписать стандартную библиотеку C# в IL2CPP. При создании проекта Unity, который использует IL2CPP, весь код стандартных библиотек C# mscorlib.dll, System.dll и т.д. является точно таким же кодом, какой используется для написания скриптов с Mono.

Мы полагаемся на код стандартных библиотек C#, который уже известен пользователям и хорошо проверен в проектах Unity. Поэтому, когда мы исследуем ошибки, связанные с IL2CPP, мы можем быть достаточно уверены, что это ошибка в компиляторе AOT или в исполняемой библиотеки, и нигде больше.

Как мы разрабатываем, тестируем и выпускаем IL2CPP

С момента первоначального публичного релиза IL2CPP в версии 4.6.1p5 в январе, мы выпустили 6 полных релизов и 7 патчей (в разных версиях Unity 4.6 и 5.0). Мы исправили более 100 ошибок, упомянутых в примечаниях к выпуску.

Для того чтобы сделать это процесс совершенствования непрерывным, мы разрабатываем только одну версию кода IL2CPP. Перед каждым выпуском мы портируем изменения IL2CPP для конкретной ветки версий, запускаем наши тесты и проверяем, все ли исправления корректно работают в этой версии. Наши команды QA и Sustained Engineering проделали невероятную работу, чтобы сделать возможным выпуск обновлений так быстро. Это означает, что наши пользователи будут ждать не более одной недели с момента последних исправлений для IL2CPP.

Наше сообщество пользователей, оказалось бесценным, представив множество полезных сообщений об ошибках. Мы ценим все отзывы от наших пользователей, помогающие непрерывно улучшать IL2CPP, и мы с нетерпением ждем больше.

Команда разработчиков работает над IL2CPP имея настрой на сильный тест. Мы часто используем методы Test Driven Design, и редко отправляем запросы на слияние без хороших тестов. Эта стратегия хорошо работает для технологий, таких как IL2CPP, где у нас есть четкие входы и выходы. Это означает, что подавляющее большинство ошибок, которые мы видим, не неожиданное поведение, а неожиданные случаи (например, можно использовать 64-битный IntPtr как 32-битный индекс массива, в результате чего вылет с ошибкой компилятора С++, и в реальном коде на самом деле так делают!). Это различие позволяет нам быстро исправлять ошибки.

С помощью нашего сообщества мы работаем над тем, чтобы IL2CPP работал стабильно и быстро, насколько возможно. Кстати, если это интересно вам, у нас есть вакансия (просто говорю).

Дальше — больше

Боюсь, что я провел слишком много времени здесь, говоря о будущих записях в блоге. Нам многое хочется рассказать, и все это просто не уместятся в одном посте. В следующий раз мы будем копаться в коде, созданном il2cpp.exe, чтобы узнать, как ваш проект на самом деле выглядит для компилятора C++.

How we develop, test, and ship IL2CPP

Исполняемая библиотека

Другая часть технологии IL2CPP — это исполняемая библиотека для поддержки виртуальной машины. Мы написали эту библиотеку почти полностью на C++ (он содержит немного платформенного кода, но пусть это останется между нами). Мы назвали ее libil2cpp, она поставляется в статической библиотеке связанной с исполняемым файлом плеера. Одно из ключевых преимуществ технологии IL2CPP — это простая и портативная исполняемая библиотека.

Вы можете найти некоторые подсказки о том, как код libil2cpp организован глядя на файлы заголовков для libil2cpp, которые поставляются с Unity (вы найдете их в директории Editor\Data\PlaybackEngines\webglsupport\BuildTools\Libraries\libil2cpp\include на Windows, или в Contents/Frameworks/il2cpp/libil2cpp на OSX). Например, интерфейс между генерацией C++ кода il2cpp.exe и libil2cpp находится в файле заголовка codegen/il2cpp-codegen.h.

Один из ключевых элементов — сборщик мусора. Мы поставляем Unity 5 с libgc, сборщиком мусора Boehm-Demers-Weiser. Тем не менее, libil2cpp была разработана, чтобы позволить нам использовать другие сборщики мусора. Например, мы исследуем интеграцию Microsoft GC, который стал с открытым кодом в рамках CoreCLR. Мы расскажем больше об этом позже в нашей статье об интеграции сборщика мусора.

Как выполняется il2cpp.exe?

Давайте рассмотрим на примере. Я буду использовать Unity 5.0.1 на Windows, и я начну с нового проекта. Так что у нас есть один пользовательский скрипт, я добавлю этот простой компонент MonoBehaviour к главной камере в сцене:

[csharp]using UnityEngine;

public class HelloWorld : MonoBehaviour {
void Start () {
Debug.Log(«Hello, IL2CPP!»);
}
}[/csharp]

Когда я соберу проект для WebGL, я могу использовать Process Explorer, чтобы увидеть команду Unity, используемую для запуска il2cpp.exe:

"C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\bin\mono.exe" "C:\Program Files\Unity\Editor\Data\il2cpp/il2cpp.exe" --copy-level=None --enable-generic-sharing --enable-unity-event-support --output-format=Compact --extra-types.file="C:\Program Files\Unity\Editor\Data\il2cpp\il2cpp_default_extra_types.txt" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\Assembly-CSharp.dll" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\UnityEngine.UI.dll" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\il2cppOutput"

Это строка довольно длинная и страшная, так что давайте разберем ее. Во-первых, Unity запускает этот исполняемый файл:

"C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\bin\mono.exe"

Следующий аргумент — сама утилита il2cpp.exe.

"C:\Program Files\Unity\Editor\Data\il2cpp/il2cpp.exe"

Остальные аргументы передаются il2cpp.exe, а не mono.exe. Давайте посмотрим на них. Во-первых, Unity передает пять флагов il2cpp.exe:

  • —copy-level=None
    • Указывает, что il2cpp.exe не следует выполнять специальные копии файлов генерируемого C++ кода.
  • —enable-generic-sharing
    • Функция уменьшения размера кода и бинарника. IL2CPP поделятся реализацией генерированных методов, когда это возможно.
  • —enable-unity-event-support
    • Специальная поддержка кода для событий Unity, доступ к которым осуществляется с помощью рефлексии.
  • —output-format=Compact
    • Создание C++ кода в формате, который требует меньше символов для имен типов и методов. Этот код трудно отлаживать, поскольку имена в коде IL не сохраняются, но часто компилируется быстрее, так как будет меньше кода для разбора компилятором C++.
  • —extra-types.file=»C:\Program Files\Unity\Editor\Data\il2cpp\il2cpp_default_extra_types.txt»
    • Использует значение по умолчанию (или пустой) дополнительный файл типов. Этот файл может быть добавлен в проект Unity, чтобы знать, какие il2cpp.exe типы будут созданы во время выполнения, но не присутствуют в коде IL.

Важно отметить, что эти аргументы могут быть и будут изменены в более поздних версиях. Ещё не то время, когда у нас есть стабильный и поддерживаемый набор аргументов для il2cpp.exe.

В итоге у нас есть два файла и одна директория:

  • «C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\Assembly-CSharp.dll»
  • «C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\UnityEngine.UI.dll»
  • «C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\il2cppOutput»

Утилита il2cpp.exe принимает список всех сборок IL, которые следует конвертировать. В нашем случае это сборка, содержащая мой простой скрипт MonoBehaviour, Assembly-CSharp.dll и UnityEngine.UI.dll. Обратите внимание, что здесь есть несколько явно недостающих сборок. Очевидно, что мой скрипт ссылается на UnityEngine.dll, и, по крайней мере необходима mscorlib.dll, и, возможно, другие сборки. Где они? На самом деле, il2cpp.exe определяет эти сборки внутри. Они могут быть упомянуты в командной строке, но это необязательно. Unity явно нужно указать только главные сборки (те, на которые не ссылаются другие сборки).

Последний аргумент в il2cpp.exe — каталог, где должны быть созданы файлы C++. Если вам интересно, посмотрите на сгенерированные файлы в этом каталоге, они будут предметом следующей статьи в этой серии. Прежде чем это сделать, вы, возможно, захотите выбрать опцию «Development Player» в настройках сборки WebGL. Это удалит аргумент –output-format=Compact и даст вам лучшие имена типов и методов в созданном C++ коде.

Попробуйте изменить различные параметры в Player Settings WebGL или iOS. Вы увидите различные аргументы, передаваемые il2cpp.exe включающие различные этапы генерации кода. Например, изменение опции «Enable Exceptions» в Player Settings WebGL на «Full» добавляет аргументы –emit-null-checks, –enable-stacktrace, и –enable-array-bounds-check к вызову il2cpp.exe.

Чего не делает IL2CPP?

Я хотел бы указать на одну из проблем, которые мы не учли в IL2CPP. Мы не пытались переписать стандартную библиотеку C# в IL2CPP. При создании проекта Unity, который использует IL2CPP, весь код стандартных библиотек C# mscorlib.dll, System.dll и т.д. является точно таким же кодом, какой используется для написания скриптов с Mono.

Мы полагаемся на код стандартных библиотек C#, который уже известен пользователям и хорошо проверен в проектах Unity. Поэтому, когда мы исследуем ошибки, связанные с IL2CPP, мы можем быть достаточно уверены, что это ошибка в компиляторе AOT или в исполняемой библиотеки, и нигде больше.

Как мы разрабатываем, тестируем и выпускаем IL2CPP

С момента первоначального публичного релиза IL2CPP в версии 4.6.1p5 в январе, мы выпустили 6 полных релизов и 7 патчей (в разных версиях Unity 4.6 и 5.0). Мы исправили более 100 ошибок, упомянутых в примечаниях к выпуску.

Для того чтобы сделать это процесс совершенствования непрерывным, мы разрабатываем только одну версию кода IL2CPP. Перед каждым выпуском мы портируем изменения IL2CPP для конкретной ветки версий, запускаем наши тесты и проверяем, все ли исправления корректно работают в этой версии. Наши команды QA и Sustained Engineering проделали невероятную работу, чтобы сделать возможным выпуск обновлений так быстро. Это означает, что наши пользователи будут ждать не более одной недели с момента последних исправлений для IL2CPP.

Наше сообщество пользователей, оказалось бесценным, представив множество полезных сообщений об ошибках. Мы ценим все отзывы от наших пользователей, помогающие непрерывно улучшать IL2CPP, и мы с нетерпением ждем больше.

Команда разработчиков работает над IL2CPP имея настрой на сильный тест. Мы часто используем методы Test Driven Design, и редко отправляем запросы на слияние без хороших тестов. Эта стратегия хорошо работает для технологий, таких как IL2CPP, где у нас есть четкие входы и выходы. Это означает, что подавляющее большинство ошибок, которые мы видим, не неожиданное поведение, а неожиданные случаи (например, можно использовать 64-битный IntPtr как 32-битный индекс массива, в результате чего вылет с ошибкой компилятора С++, и в реальном коде на самом деле так делают!). Это различие позволяет нам быстро исправлять ошибки.

С помощью нашего сообщества мы работаем над тем, чтобы IL2CPP работал стабильно и быстро, насколько возможно. Кстати, если это интересно вам, у нас есть вакансия (просто говорю).

Дальше — больше

Боюсь, что я провел слишком много времени здесь, говоря о будущих записях в блоге. Нам многое хочется рассказать, и все это просто не уместятся в одном посте. В следующий раз мы будем копаться в коде, созданном il2cpp.exe, чтобы узнать, как ваш проект на самом деле выглядит для компилятора C++.

More to come

Исполняемая библиотека

Другая часть технологии IL2CPP — это исполняемая библиотека для поддержки виртуальной машины. Мы написали эту библиотеку почти полностью на C++ (он содержит немного платформенного кода, но пусть это останется между нами). Мы назвали ее libil2cpp, она поставляется в статической библиотеке связанной с исполняемым файлом плеера. Одно из ключевых преимуществ технологии IL2CPP — это простая и портативная исполняемая библиотека.

Вы можете найти некоторые подсказки о том, как код libil2cpp организован глядя на файлы заголовков для libil2cpp, которые поставляются с Unity (вы найдете их в директории Editor\Data\PlaybackEngines\webglsupport\BuildTools\Libraries\libil2cpp\include на Windows, или в Contents/Frameworks/il2cpp/libil2cpp на OSX). Например, интерфейс между генерацией C++ кода il2cpp.exe и libil2cpp находится в файле заголовка codegen/il2cpp-codegen.h.

Один из ключевых элементов — сборщик мусора. Мы поставляем Unity 5 с libgc, сборщиком мусора Boehm-Demers-Weiser. Тем не менее, libil2cpp была разработана, чтобы позволить нам использовать другие сборщики мусора. Например, мы исследуем интеграцию Microsoft GC, который стал с открытым кодом в рамках CoreCLR. Мы расскажем больше об этом позже в нашей статье об интеграции сборщика мусора.

Как выполняется il2cpp.exe?

Давайте рассмотрим на примере. Я буду использовать Unity 5.0.1 на Windows, и я начну с нового проекта. Так что у нас есть один пользовательский скрипт, я добавлю этот простой компонент MonoBehaviour к главной камере в сцене:

[csharp]using UnityEngine;

public class HelloWorld : MonoBehaviour {
void Start () {
Debug.Log(«Hello, IL2CPP!»);
}
}[/csharp]

Когда я соберу проект для WebGL, я могу использовать Process Explorer, чтобы увидеть команду Unity, используемую для запуска il2cpp.exe:

"C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\bin\mono.exe" "C:\Program Files\Unity\Editor\Data\il2cpp/il2cpp.exe" --copy-level=None --enable-generic-sharing --enable-unity-event-support --output-format=Compact --extra-types.file="C:\Program Files\Unity\Editor\Data\il2cpp\il2cpp_default_extra_types.txt" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\Assembly-CSharp.dll" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\UnityEngine.UI.dll" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\il2cppOutput"

Это строка довольно длинная и страшная, так что давайте разберем ее. Во-первых, Unity запускает этот исполняемый файл:

"C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\bin\mono.exe"

Следующий аргумент — сама утилита il2cpp.exe.

"C:\Program Files\Unity\Editor\Data\il2cpp/il2cpp.exe"

Остальные аргументы передаются il2cpp.exe, а не mono.exe. Давайте посмотрим на них. Во-первых, Unity передает пять флагов il2cpp.exe:

  • —copy-level=None
    • Указывает, что il2cpp.exe не следует выполнять специальные копии файлов генерируемого C++ кода.
  • —enable-generic-sharing
    • Функция уменьшения размера кода и бинарника. IL2CPP поделятся реализацией генерированных методов, когда это возможно.
  • —enable-unity-event-support
    • Специальная поддержка кода для событий Unity, доступ к которым осуществляется с помощью рефлексии.
  • —output-format=Compact
    • Создание C++ кода в формате, который требует меньше символов для имен типов и методов. Этот код трудно отлаживать, поскольку имена в коде IL не сохраняются, но часто компилируется быстрее, так как будет меньше кода для разбора компилятором C++.
  • —extra-types.file=»C:\Program Files\Unity\Editor\Data\il2cpp\il2cpp_default_extra_types.txt»
    • Использует значение по умолчанию (или пустой) дополнительный файл типов. Этот файл может быть добавлен в проект Unity, чтобы знать, какие il2cpp.exe типы будут созданы во время выполнения, но не присутствуют в коде IL.

Важно отметить, что эти аргументы могут быть и будут изменены в более поздних версиях. Ещё не то время, когда у нас есть стабильный и поддерживаемый набор аргументов для il2cpp.exe.

В итоге у нас есть два файла и одна директория:

  • «C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\Assembly-CSharp.dll»
  • «C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\UnityEngine.UI.dll»
  • «C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\il2cppOutput»

Утилита il2cpp.exe принимает список всех сборок IL, которые следует конвертировать. В нашем случае это сборка, содержащая мой простой скрипт MonoBehaviour, Assembly-CSharp.dll и UnityEngine.UI.dll. Обратите внимание, что здесь есть несколько явно недостающих сборок. Очевидно, что мой скрипт ссылается на UnityEngine.dll, и, по крайней мере необходима mscorlib.dll, и, возможно, другие сборки. Где они? На самом деле, il2cpp.exe определяет эти сборки внутри. Они могут быть упомянуты в командной строке, но это необязательно. Unity явно нужно указать только главные сборки (те, на которые не ссылаются другие сборки).

Последний аргумент в il2cpp.exe — каталог, где должны быть созданы файлы C++. Если вам интересно, посмотрите на сгенерированные файлы в этом каталоге, они будут предметом следующей статьи в этой серии. Прежде чем это сделать, вы, возможно, захотите выбрать опцию «Development Player» в настройках сборки WebGL. Это удалит аргумент –output-format=Compact и даст вам лучшие имена типов и методов в созданном C++ коде.

Попробуйте изменить различные параметры в Player Settings WebGL или iOS. Вы увидите различные аргументы, передаваемые il2cpp.exe включающие различные этапы генерации кода. Например, изменение опции «Enable Exceptions» в Player Settings WebGL на «Full» добавляет аргументы –emit-null-checks, –enable-stacktrace, и –enable-array-bounds-check к вызову il2cpp.exe.

Чего не делает IL2CPP?

Я хотел бы указать на одну из проблем, которые мы не учли в IL2CPP. Мы не пытались переписать стандартную библиотеку C# в IL2CPP. При создании проекта Unity, который использует IL2CPP, весь код стандартных библиотек C# mscorlib.dll, System.dll и т.д. является точно таким же кодом, какой используется для написания скриптов с Mono.

Мы полагаемся на код стандартных библиотек C#, который уже известен пользователям и хорошо проверен в проектах Unity. Поэтому, когда мы исследуем ошибки, связанные с IL2CPP, мы можем быть достаточно уверены, что это ошибка в компиляторе AOT или в исполняемой библиотеки, и нигде больше.

Как мы разрабатываем, тестируем и выпускаем IL2CPP

С момента первоначального публичного релиза IL2CPP в версии 4.6.1p5 в январе, мы выпустили 6 полных релизов и 7 патчей (в разных версиях Unity 4.6 и 5.0). Мы исправили более 100 ошибок, упомянутых в примечаниях к выпуску.

Для того чтобы сделать это процесс совершенствования непрерывным, мы разрабатываем только одну версию кода IL2CPP. Перед каждым выпуском мы портируем изменения IL2CPP для конкретной ветки версий, запускаем наши тесты и проверяем, все ли исправления корректно работают в этой версии. Наши команды QA и Sustained Engineering проделали невероятную работу, чтобы сделать возможным выпуск обновлений так быстро. Это означает, что наши пользователи будут ждать не более одной недели с момента последних исправлений для IL2CPP.

Наше сообщество пользователей, оказалось бесценным, представив множество полезных сообщений об ошибках. Мы ценим все отзывы от наших пользователей, помогающие непрерывно улучшать IL2CPP, и мы с нетерпением ждем больше.

Команда разработчиков работает над IL2CPP имея настрой на сильный тест. Мы часто используем методы Test Driven Design, и редко отправляем запросы на слияние без хороших тестов. Эта стратегия хорошо работает для технологий, таких как IL2CPP, где у нас есть четкие входы и выходы. Это означает, что подавляющее большинство ошибок, которые мы видим, не неожиданное поведение, а неожиданные случаи (например, можно использовать 64-битный IntPtr как 32-битный индекс массива, в результате чего вылет с ошибкой компилятора С++, и в реальном коде на самом деле так делают!). Это различие позволяет нам быстро исправлять ошибки.

С помощью нашего сообщества мы работаем над тем, чтобы IL2CPP работал стабильно и быстро, насколько возможно. Кстати, если это интересно вам, у нас есть вакансия (просто говорю).

Дальше — больше

Боюсь, что я провел слишком много времени здесь, говоря о будущих записях в блоге. Нам многое хочется рассказать, и все это просто не уместятся в одном посте. В следующий раз мы будем копаться в коде, созданном il2cpp.exe, чтобы узнать, как ваш проект на самом деле выглядит для компилятора C++.

Unity Windows Build Support — это инструмент, который позволяет разработчикам создавать приложения и игры, которые работают на платформе Windows. С его помощью вы можете собирать и развертывать ваш проект Unity на компьютерах под управлением операционной системы Windows.

IL2CPP — это технология компиляции, используемая в Unity, которая преобразует код на C# в низкоуровневый код, который может быть исполнен непосредственно процессором. Это позволяет улучшить производительность вашего приложения и защитить его от взлома.

Для использования Unity Windows Build Support и IL2CPP вы должны установить соответствующие модули в Unity Editor. Затем вы сможете настроить различные параметры сборки, такие как аппаратное и программное обеспечение, требования к системе, внешние зависимости и др.

Использование Unity Windows Build Support и IL2CPP позволяет создавать мощные и производительные приложения для Windows. Это особенно полезно, если вы хотите создать игру или приложение для настольного компьютера или ноутбука. Необходимые модули можно скачать бесплатно из Unity Asset Store, поэтому не стесняйтесь использовать эти мощные инструменты для вашего проекта!

Содержание

  1. Unity Windows Build Support il2cpp
  2. Что это такое?
  3. Как использовать?
  4. Преимущества il2cpp
  5. Основные функции Unity windows build support il2cpp

Unity Windows Build Support il2cpp

Для использования Unity Windows Build Support il2cpp необходимо установить соответствующий модуль в Unity. Далее разработчик может настроить сборку игры для платформы Windows и выбрать компилятор il2cpp. После этого Unity будет производить компиляцию и сборку игры под Windows с использованием il2cpp.

Преимущества использования Unity Windows Build Support il2cpp:

  • Увеличение производительности игры за счет компиляции кода в нативный формат
  • Упрощение процесса портирования игры на другие платформы
  • Повышение безопасности игры, так как нативный код сложнее подвергнуть обратной разработке
  • Поддержка различных архитектур и платформ Windows

Однако стоит отметить, что использование Unity Windows Build Support il2cpp может увеличить время компиляции проекта и общий размер сборки игры. Также не все плагины и библиотеки могут быть совместимы с компиляцией через il2cpp.

В целом, Unity Windows Build Support il2cpp является полезным инструментом для разработчиков, которые хотят создавать оптимизированные сборки игр под операционную систему Windows и упрощать процесс портирования игры на другие платформы.

Что это такое?

IL2CPP (Intermediate Language To C++) — это технология компиляции, используемая Unity для преобразования кода C# в низкоуровневый код C++, который может быть выполнен без необходимости наличия среды .NET. Это позволяет улучшить производительность и снизить размер бинарных файлов игры, делая ее более оптимизированной для работы на различных устройствах.

Unity Windows Build Support IL2CPP предоставляет разработчикам инструменты и библиотеки, необходимые для сборки и компиляции проектов Unity под Windows с использованием IL2CPP. Это позволяет создавать экзешники (выполняемые файлы) для запуска игр на компьютерах под управлением операционной системы Windows без необходимости установки Unity или других зависимостей.

Как использовать?

Для использования Unity windows build support il2cpp вам понадобится подготовить свою среду разработки и настроить несколько параметров.

Во-первых, убедитесь, что у вас установлена последняя версия Unity. Вы можете загрузить ее с официального сайта Unity.

После установки Unity откройте ваш проект. Далее перейдите в окно «Настройки платформы» и выберите Windows. В разделе «Сборка по умолчанию» выберите il2cpp. Это позволит вам использовать il2cpp вместо Mono в качестве компилятора кода.

Затем вы должны настроить параметры сборки. В меню «Сборка» выберите «Параметры сборки». Во вкладке «Платформы» найдите настройки для Windows и установите флажок «Использовать il2cpp». Это позволит вам использовать il2cpp при сборке проекта.

После настройки параметров сборки вы можете провести тестовую сборку, чтобы убедиться, что il2cpp работает правильно. Просто нажмите кнопку «Сборка» и выберите «Собрать и запустить». Unity создаст сборку с использованием il2cpp и запустит ее в средстве разработки Windows.

Теперь вы можете использовать Unity windows build support il2cpp для создания настольных приложений под Windows. У вас есть возможность взаимодействовать с Windows API и создавать более эффективный код благодаря компиляции il2cpp.

Не забывайте проверять совместимость своего кода с il2cpp, так как некоторые функции или библиотеки могут потребовать модификаций или замены.

Преимущества il2cpp

  • Увеличение производительности: il2cpp превращает код C# или других языков программирования, поддерживаемых Unity, в оптимизированный код на C++, что позволяет приложению работать быстрее и эффективнее.
  • Уменьшение размера исполняемых файлов: благодаря компиляции в C++, размер исполняемых файлов может быть существенно уменьшен по сравнению с другими методами, что помогает сократить время загрузки и использование памяти.
  • Улучшенная безопасность: il2cpp использует статическую проверку типов на этапе компиляции, что помогает выявить множество ошибок до запуска приложения и обеспечивает более надежное и безопасное выполнение кода.
  • Поддержка платформы: il2cpp поддерживает множество платформ, включая Windows, macOS, Linux, Android, iOS, WebGL и многие другие, что позволяет создавать кросс-платформенные приложения на Unity.

Использование il2cpp может значительно улучшить производительность, снизить размер файлов и обеспечить более безопасное выполнение кода в ваших проектах на Unity.

Основные функции Unity windows build support il2cpp

Unity windows build support il2cpp представляет собой инструмент, который позволяет компилировать проекты Unity в исполняемые файлы для операционных систем Windows с использованием технологии il2cpp. Эта технология предназначена для повышения производительности и оптимизации кода.

Основные функции Unity windows build support il2cpp включают:

1. Компиляция в исполняемый файл Unity windows build support il2cpp позволяет преобразовывать код проекта Unity в машинный код, который может быть выполнен непосредственно операционной системой Windows. Это позволяет достичь более высокой производительности при запуске проекта.
2. Оптимизация кода Используя технологию il2cpp, Unity windows build support il2cpp проводит оптимизацию кода, удаляя неиспользуемые функции и улучшая общую производительность проекта.
3. Поддержка среды Windows Unity windows build support il2cpp полностью интегрирован с операционной системой Windows, обеспечивая совместимость с ее основными функциями и возможностью оптимальной работы на данной платформе.
4. Возможность использования .NET и C# Unity windows build support il2cpp поддерживает работу с языками программирования .NET и C#, что обеспечивает разработчикам гибкость и удобство в создании проектов.
5. Получение готового исполняемого файла После компиляции с использованием Unity windows build support il2cpp, разработчик может получить готовый исполняемый файл для операционной системы Windows, который можно легко установить и запустить на компьютере пользователя.

Unity windows build support il2cpp представляет собой мощный инструмент, который позволяет оптимизировать и компилировать проекты Unity для операционной системы Windows с использованием технологии il2cpp. Он обеспечивает высокую производительность, поддержку .NET и C#, а также легкость в создании готового исполняемого файла.

  • Unity hub скачать для windows
  • Unified remote server windows 10
  • Unity is about to delete all windows layouts
  • Unifi controller for windows скачать
  • Unity for windows 7 32 bit