Unity il2cpp что это
IL2CPP
The IL2CPP scripting backend converts IL code from scripts and assemblies in a Unity project to C++ code which is then compiled using platform native compilers. For the most part, the scripting backend should not matter. However, IL2CPP does provide a few useful options which can be controlled.
Compiler Options
When using the IL2CPP scripting backend, it is possible to control how il2cpp.exe generates C++ code. Specifically, C# attributes can be used to enable or disable the following runtime checks:
Option | Описание | Default |
---|---|---|
Null checks | If this option is enabled, C++ code generated by IL2CPP will contain null checks and throw managed NullReferenceException exceptions as necessary. If this option is disabled, the null checks will not be emitted into the generated C++ code. For some projects, disabling this option may improve runtime performance. However, any access to null values in the generated code will not be protected, and may lead to incorrect behavior. Usually the game will crash soon after the null value is dereferenced, but we cannot guarantee this. Disable this option with caution. | Enabled |
Array bounds checks | If this option is enabled, C++ code generated by IL2CPP will contain array bounds checks and throw managed IndexOutOfRangeException exceptions as necessary. If this option is disabled, the array bounds checks will not be emitted into the generated C++ code. For some projects, disabling this option may improve runtime performance. However, any access to an array with invalid indices in the generated code will not be protected, and may lead to incorrect behavior, including reading from or writing to arbitrary memory locations. In most cases, these memory accesses will occur without any immediate side effects, and may silently corrupt the state of the game. Disable this option with extreme caution. | Enabled |
Divide by zero checks | If this option is enabled, C++ code generated by IL2CPP will contain divide by zero checks for integer division and throw managed DivideByZeroException exceptions as necessary. If this option is disabled, the divide by zero checks on integer division will not be emitted into the generated C++ code. For most projects this option should be disabled. Enable it only if divide by zero checks are required, as these checks have a runtime cost. | Disable |
The runtime checks can be enabled or disabled in C# code using the Il2CppSetOptions attribute. To use this attribute, find the Il2CppSetOptionsAttribute.cs source file in the IL2CPP directory in the Unity Editor installation (Data\il2cpp on Windows, Contents/Frameworks/il2cpp on OS X). Copy this source file into the Assets folder in your project. Then the attribute can be used like this:
The Il2CppSetOptions attribute can be applied to types, methods, and properties. The attribute from the most local scope will be used.
Incremental Builds
The C++ code generated by the IL2CPP scripting backend can be updated incrementally, allowing incremental C++ build systems to compile only the changes source files. This can signifigantly lower iteration times with the IL2CPP scripting backend. Incremental builds with IL2CPP are supported on the iOS platform only now.
To use incremental builds, choose the “Append” option after selecting “Build” from the “Build Settings” dialog. The “Replace” option will perform a clean build.
IL2CPP Overview
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).
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 Adding modules to the Unity Editor.
You can change the scripting backend Unity uses to build your application in one of two ways:
Through the Player Settings Settings 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:
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
How IL2CPP works
When you start a build using IL2CPP, Unity automatically performs the following steps:
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 Apple’s mobile operating system. More info
See in Glossary 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.
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:
The below example describes how to use the Il2CppSetOption attribute:
You can apply Il2CppSetOption attribute to types, methods, and properties. Unity uses the attribute from the most local scope.
Русские Блоги
Подробное объяснение-обзор IL2CPP
Введение
Сериал будет разделен на следующие части:
1. Обзор (эта статья)
2. Анализ кода C ++
3. Отладка кода C ++.
4. Вызов метода (общий метод, виртуальный метод и т. Д.)
5. Общий доступ
6. P / invoke инкапсуляция типов и методов
7. Сборка мусора
8. Структура тестирования и использование
Что такое IL2CPP
Компилятор AOT
Цепочка инструментов IL2CPP показана ниже:
Библиотека времени исполнения
Как работает компилятор AOT
Давайте посмотрим на пример (этот пример работает в версии Unity 5.0.1 в системе Windows)
Запустите новый проект и добавьте в основную камеру следующий скрипт:
В настоящее время мы публикуем программу на платформе WebGL и используем ее.Process ExplorerИнструмент, чтобы узнать, какая командная строка использовалась Unity для вызова il2cpp.exe:
Эта командная строка выглядит сложной и пугающей, не волнуйтесь, давайте разберем ее шаг за шагом,
Сначала Unity запускает mono.exe
Затем запустите il2cpp.exe
Остальная часть командной строки передается в il2cpp.exe вместо параметров, передаваемых в mono.exe. Сначала в il2cpp.exe передаются 5 идентификаторов:
Скажите il2cpp.exe не копировать сгенерированный код C ++.
IL2CPP будет совместно использовать дженерики, чтобы уменьшить окончательный размер пакета.
Поддерживайте события Unity, полученные посредством отражения, чтобы гарантировать правильную генерацию кода.
В сгенерированном коде C ++ используйте меньшее количество символов для именования классов и методов, что затруднит отладку кода, потому что название кода IL изменится (примечание автора: оно должно быть похоже на путаницу кода), но Он может быть скомпилирован компилятором быстрее, потому что количество символов, которые компилятор должен проанализировать, уменьшается.
Используйте файл дополнительного типа по умолчанию. Этот файл будет добавлен в ваш проект Unity и сообщит il2cpp.exe, какие универсальные типы или типы массивов не отображаются в коде IL, но будут созданы во время выполнения.
Стоит отметить, что эти командные строки могут измениться в последующих версиях Unity. Наконец, давайте посмотрим на оставшиеся три командные строки.
Будущее скриптов в Unity 3D
Но перед погружением в будущее стоит поговорить о настоящем.
Скрипты в Unity сегодня
Мы используем Mono (и WinRT для приложений Windows Store и Windows Phone) чтобы привнести в Unity простоту использования C#, доступ к сторонним библиотекам и практически двоичное быстродействие. Но есть несколько сложностей:
Последние несколько лет мы постоянно думали о том, как справиться со всем этим. Одновременно шли исследования в области поддержки скриптов для WebGL. По мере продвижения в обоих направлениях они слились в один подход.
Осознав масштаб проблемы, мы начали экспериментировать с разными путями ее решения. Некоторые из них были многообещающими, некоторые нет. Но в итоге мы нашли новаторский путь решения наших проблем.
IL2CPP: быстрое и короткое введение
Ее основное отличие от текущей реализации в том, что IL2CPP компилятор преобразует сборки в исходный код C++. Затем он использует стандартный компилятор C++ для данной платформы, чтобы создать родные двоичные файлы.
Код выполняется одновременно с дополнительными службами (вроде сборщика мусора, метаданных, специфичных для платформы ресурсов), которые обеспечивает IL2CCP VM.
Преимущества IL2CPP
Давайте рассмотрим каждую из вышеупомянутых сложностей и то, как как с ней справляется IL2CPP.
Производительность
В IL2CPP мы стремимся совместить простоту использования и скорость написания кода со производительностью C++.
С ним мы можем сохранить скорость текущего процесса написания скриптов и дополнить ее моментальным повышением производительности. Мы видели 2-3-кратное увеличение скорости выполнения некоторых наших тестов со сложными скриптами. Такой прирост производительности возникает по нескольким причинам:
— Компиляторы и компоновщики C++ дают нам большое количество ранее недоступных методов оптимизации.
— Ваш код подвергается статическому анализу и на скорость и на размер
— Unity-ориентированные оптимизации среды выполнения скриптов
И хотя работа над IL2CPP еще далека от завершения, этот ранний прирост производительности однозначно указывает на большое будущее нашего проекта.
Переносимость и поддержка
Хотя это может показаться внутренними проблемами Unity, они так же касаются и вас. Виртуальная машина Mono содержит огромное количество кода, специфичного для конкретной платформы и архитектуры. При переносе Unity на новую платформу мы тратим очень много сил на перенос и поддержку Mono VM для этой платформы. Некоторые особенности (и ошибки) могут существовать только на отдельных платформах. Это затрагивает те ценности, которые пытается обеспечить для вас Unity — простоту переноса контента между платформами.
IL2CPP решает эту проблему несколькими путями:
— Код конвертируется в C++, а не специфичный для данной архитектуры машинный код. Стоимость переноса и поддержки генерации кода для каждой конкретной архитектуры заметно снижается
— Разработка новых возможностей и исправление ошибок заметно ускоряются. Для нас дни ковыряния в архитектурно-специфичном коде заменяются минутами правки C++. Новые возможности и исправления ошибок сразу доступны для всех платформ. Нынешний вариант IL2CPP очень быстро переносится на новые платформы.
В дополнение к этому, специфичные для платформы или архитектуры компиляторы обычно оптимизируются гораздо лучше, чем один-единственный генератор кода. Это позволит нам повторно использовать все те усилия, которые пошли на разработку C++ компиляторов, не переизобретая их заново внутри компании.
Сборка мусора
IL2CPP не привязан к какому-то конкретному сборщику мусора, вместо этого он подключает их через специальный API. Нынешний вариант IL2CPP использует усовершенствованную версию libgc, хотя мы рассматриваем разные варианты. Одновременно с этим мы исследуем возможности сокращения давления со стороны GC с помощью анализа, выполняемого в компиляторе IL2CPP.
Хотя на данный момент нам нечего больше рассказать, исследования продолжаются. Мы знаем, что это важно для вас, так что продолжим работу и будем информировать вас о ней в будущих записях. В контексте сборки мусора стоит заметить, что независимо от IL2CPP, в Unity 5 вы увидите намного больше свободных от выделения API (allocation free API).
Чем не является IL2CPP
Когда я смогу попробовать IL2CPP?
Мы надеемся, что к данному моменту возможность попробовать IL2CPP волнует вас так же сильно как и нас, и вы задаетесь вопросом — когда вы сможете опробовать его лично? Ранняя версия IL2CPP будет частью поддержки WebGL в Unity 5.
После WebGL мы продолжим разработку IL2CPP для других платформ. На самом деле у нас уже есть реализации для целого ряда поддерживаемых нами платформ. Мы рассчитываем выпустить как минимум еще одну платформу в этом году. На данный момент мы планируем сделать iOS следующей платформой с поддержкой IL2CPP.
Запланированное обновление среды Mono произойдет после того, как IL2CPP будет поддерживаться на большем количестве платформ и немного повзрослеет.
Единственная платформа, которая никогда не будет поддерживать IL2CPP — это WebPlayer, из-за ограничений, связанных с безопасностью. Как и было отмечено ранее, редактор продолжит работать на Mono.
Вы можете увидеть среду выполнения IL2CPP в действии прямо сейчас. Две демонстрации WebGL, которые мы размещали ранее, работают именно на нем.
Что дальше?
Мы продолжаем усердно работать над IL2CPP: добавляем новые возможности, оптимизируем генерацию кода, исправляем ошибки и добавляем поддержку новых платформ. Мы будем публиковать более подробные статьи по мере продвижения нашей работы и продолжим обсуждать ее с вами на форумах.
Команда скриптов Unity.
Небольшое дополнение из ответов разработчиков на вопросы в англоязычных комментариях и специальной теме на форуме Unity:
Термин «виртуальная машина» может быть немного обманчивым. На самом деле не будет никакой настоящей виртуальной машины, все будет в двоичном коде, но будет ряд функций, доступных во время выполнения и реализующих функциональность, необходимую управляемому коду, вроде системных служб или сборки мусора, которые мы и называем в данном случае виртуальной машиной.
Написание скриптов на C++ не является официальной целью IL2CPP и в ближайшее время ничего подобного не появится, хотя это и может произойти когда-нибудь в будущем как побочное следствие принятых решений.
Исходные коды пока не будут открываться, мы долго обсуждали подобную возможность и пока не приняли подобного решения. В открытии исходников есть как преимущества для нас, так и недостатки, так что для принятия столь серьезного решения должны быть веские причины.
Ограничения на динамическую генерацию кода полностью аналогичны ограничениям в Mono AoT, совместимый с ним код будет работать с IL2CPP. Reflection будет работать. Вещи вроде System.Reflection.Emit нет. Никакой динамической генерации кода во время выполнения.
iOS будет первой платформой с поддержкой IL2CPP потому, что там уже используется AoT, так что переход будет более плавным. Потом будет поддержка остальных платформ включая PC, Mac и Linux.
Из-за AoT и ограничений LGPL мы не можем использовать Mono на iOS, что не дает нам обновить версию Mono для редактора и других платформ
Я не юрист. Точно не юрист. Но по поводу юридических ограничений связанных с Mono и LGPL могу сказать следующее. Проблема не в компоновке, можно сделать компоновку обеспечив пользователей дополнительными данными (object files). Проблема в том, что ограничения коснутся всех наших клиентов, делающих игры и приложения на Unity. Они тоже попадут под ограничения LGPL будут вынужденны предоставлять обьектные файлы всем своим клиентам. Еще раз отмечу что я не юрист, это не является официальной позицией Unity и всего лишь отражает мое понимание ситуации как программиста и все в таком духе.
С Mono нам приходилось держать команду специалистов для каждой новой платформы. Если Mono не поддерживал эту платформу, нам приходилось выполнять просто огромный объем работы, так как по сути дела нам приходилось с нуля писать свои собственные средства JIT для каждой платформы. Для некоторых платформ мы тратили на перенос Mono в три раза больше сил, чем на всю остальную работу. С IL2CPP вместо написания средств JIT мы сможем просто использовать существующий компилятор C++, это намного проще.
Мы понимаем, что вовсе не скрипты обычно являются узким местом в плане производительности, обычно проблемы возникают в случае неправильных или плохих скриптов. Нам еще никто не жаловался не слишком медленное выполнение методов C#. Сборка мусора отдельный разговор, оставим его на потом. Но люди любят обсуждать производительность. Как мне кажется IL2CPP во многих случаях сделает осмысленным использование скриптов для тех вещей, которые раньше считались слишком тяжелыми и выполнялись в C++. ИИ, физика и все в таком духе ускорится сильнее всего и появятся новые, интересные возможности.
Лично я могу сходу вспомнить следующие оптимизации
— отказ от проверки границ массивов
— устранение поддержки исключений (нагрузка от них различается в зависимости от платформы)
— устранение статической инициализации, сейчас при каждом создании экземпляра или обращении к статическому методу/свойству требуется требуется проверить, что для всех типов со статическим конструктором он был выполнен
— поддержка SIMD
— оптимизация взаимодействия между двоичным и управляемым кодом. Мы постараемся выполнить ее по максимуму и скорее всего дадим вам возможность усиливать ее, добровольно согласившись на дополнительные ограничения
Все это случайный список того, что вспомнилось мне прямо сейчас. Позже мы опубликуем более подробную информацию.
На Mac/Linux/Windows и в редакторе мы будем поддерживать Mono как один из вариантов еще очень и очень долго и через какое-то время обновим его на новую версию. Так что если вы делаете игру с поддержкой модов для этих платформ, то сможете и дальше использовать Mono. Никаких проблем. Перекрестная публикация для Mac / Linux / Win так же продолжит работать без изменений.
На других платформах вроде iOS и приставок Unity уже использует Mono AoT, таким образом загрузка dll и так невозможна и никогда не станет возможной из-за ограничений самих платформ. Здесь вы ничего не потеряете.
Unity il2cpp что это
Мы не планируем прекращать поддержку и развитие IL2CPP, но мы подумали, что было бы неплохо сделать шаг в сторону и рассказать немного о том, как работает IL2CPP. В течение следующих нескольких месяцев мы планируем написать о следующих темах (возможно. и о других) в серии постов об IL2CPP:
Мы собираемся обсудить некоторые детали о реализации IL2CPP, что, несомненно, изменится в будущем. Надеюсь, мы все еще можем предоставить некоторую полезную и интересную информацию.
Что такое IL2CPP?
Технология, которую мы называем IL2CPP, состоит из двух отдельных частей:
AOT компилятор
Утилита Il2cpp.exe принимает управляемые сборки, собранные с компилятором Mono, который поставляется с Unity, и генерирует C++ код, который мы передаем в C++ компилятор конкретной платформы.
Вы можете думать об инструментах 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.
Как выполняется il2cpp.exe?
Давайте рассмотрим на примере. Я буду использовать Unity 5.0.1 на Windows, и я начну с нового проекта. Так что у нас есть один пользовательский скрипт, я добавлю этот простой компонент MonoBehaviour к главной камере в сцене:
public class HelloWorld : MonoBehaviour <
void Start () <
Debug.Log(«Hello, IL2CPP!»);
>
>[/csharp]
Когда я соберу проект для WebGL, я могу использовать Process Explorer, чтобы увидеть команду Unity, используемую для запуска il2cpp.exe:
Это строка довольно длинная и страшная, так что давайте разберем ее. Во-первых, Unity запускает этот исполняемый файл:
Остальные аргументы передаются il2cpp.exe, а не mono.exe. Давайте посмотрим на них. Во-первых, Unity передает пять флагов il2cpp.exe:
Важно отметить, что эти аргументы могут быть и будут изменены в более поздних версиях. Ещё не то время, когда у нас есть стабильный и поддерживаемый набор аргументов для il2cpp.exe.
В итоге у нас есть два файла и одна директория:
Утилита il2cpp.exe принимает список всех сборок IL, которые следует конвертировать. В нашем случае это сборка, содержащая мой простой скрипт MonoBehaviour, Assembly-CSharp.dll и UnityEngine.UI.dll. Обратите внимание, что здесь есть несколько явно недостающих сборок. Очевидно, что мой скрипт ссылается на UnityEngine.dll, и, по крайней мере необходима mscorlib.dll, и, возможно, другие сборки. Где они? На самом деле, il2cpp.exe определяет эти сборки внутри. Они могут быть упомянуты в командной строке, но это необязательно. Unity явно нужно указать только главные сборки (те, на которые не ссылаются другие сборки).
Попробуйте изменить различные параметры в 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 работал стабильно и быстро, насколько возможно. Кстати, если это интересно вам, у нас есть вакансия (просто говорю).