В чем отличия IL2CPP от Mono
Что проверяют
Понимаете ли вы, как Unity превращает C# в исполняемый код и почему от выбора scripting backend зависят платформы, время сборки и поведение рефлексии. Следом обычно спрашивают, что ломается при переходе с Mono на IL2CPP.
Как отвечать
Оба варианта это scripting backend в Player Settings, разница в способе компиляции:
- Mono: сборки остаются в виде IL в DLL, код компилируется JIT во время работы. Билд собирается быстро, поэтому Mono удобен для итераций, и сам редактор Unity работает на нём;
- IL2CPP: AOT. IL из ваших сборок переводится в C++, затем компилятор платформы собирает нативный бинарник. Сборка заметно дольше, зато C++ компилятор оптимизирует код, и вычислительно тяжёлые места обычно работают быстрее.
По платформам: на iOS, консолях и WebGL доступен только IL2CPP. На Android Mono собирает лишь 32-битный ARMv7, а Google Play требует ARM64, поэтому для публикации фактически нужен IL2CPP. Mono остаётся вариантом для десктопа и быстрой отладки.
Практические последствия AOT:
- нет генерации кода в рантайме:
System.Reflection.Emitне работает, поэтому часть сериализаторов и DI-контейнеров требует AOT-режима или кодогенерации на этапе сборки; - стриппинг: у IL2CPP его нельзя отключить полностью, а на уровнях выше минимального пропадает код, к которому обращаются только через рефлексию. Спасают
link.xmlи атрибут[Preserve]; - дженерики: в старых версиях Unity комбинации с value-типами, которых компилятор не увидел при сборке, падали в рантайме. В свежих это в основном решено, но проверять билд на устройстве всё равно нужно.
Где спотыкаются
Говорят, что IL2CPP быстрее из-за другого сборщика мусора. В Unity оба бэкенда используют один и тот же Boehm GC, выигрыш даёт компиляция, а не GC.
Называют IL2CPP защитой от декомпиляции. Разобрать его сложнее, чем DLL из Mono, но метаданные остаются в билде, и есть инструменты, которые восстанавливают по ним классы и сигнатуры методов.
Тестируют только в редакторе. Редактор всегда работает на Mono, поэтому ошибки стриппинга и AOT всплывают лишь в билде на устройстве.