Windows build support il2cpp что это

Обновлено: 05.07.2024

IL2CPP - это сценарий , разработанный Unity, который вы можете использовать в качестве альтернативы Mono при создании проектов для некоторых платформ. Примечание - IL2CPP доступен только при сборке для следующих платформ:

  • Android AppleTV, iOS *, Nintendo 3DS, Nintendo Switch, Playstation 4, Playstation Vita, WebGL *, Windows Store, Xbox One

У меня есть проект (Unity 5.2), который переключился на развертывание Android. Я попытался переключить свои сценарии Mono2x обратно на IL2CPP и это показывает мне, что

IL2CPP на Andriod является экспериментальным и не поддерживается

Итак, мой простой вопрос: если он все еще не поддерживается, то почему этот параметр включен, в чем принципиальная разница между IL2CPP и Mono2x. Почему я перешел на серверный сценарий IL2CPP ? каковы его плюсы и минусы ?

Я также проверил в версии 5.5.2, что при развертывании платформы Windows опция IL2CPP отсутствует.

Информация основана на версии Unity 2018.2:

IL2CPP ( Intermediate Language To C ++ ) - это сценарий, разработанный Unity, который вы можете использовать в качестве альтернативы Mono при создании проектов для различных платформ. IL2CPP ( опережающий компилятор (AOT)) поддерживает отладку управляемого кода так же, как сценарий Mono.

При создании проекта с использованием IL2CPP Unity преобразует код IL из сценариев и сборок в C ++ перед созданием собственного двоичного файла (например, .exe, apk, .xap) для выбранной вами платформы. Некоторые из применений IL2CPP включают повышение производительности, безопасности и совместимости платформ ваших проектов Unity.

Важные моменты:

  • Целевая архитектура по умолчанию в настройках проигрывателя Android - armv7 и x86 с IL2CPP и Mono Scripting Backend.

Mono не поддерживается в UWP или iOS 11 и выше. Архитектура по умолчанию в настройках проигрывателя iOS - armv7 и arm64 со сценарием IL2CPP.

Я думаю, что ваш ответ не хватает ссылок. Я вижу, что список IL2CPP / Mono - это тот же текст , что и страница учебника Unity по IL2CPP & Mono , а первые два абзаца имеют тот же текст, что и страница руководства Unity по IL2CPP в другом порядке. Пожалуйста, отредактируйте свой ответ, чтобы включить ссылки, см. Справочный центр для получения дополнительной информации.

IL2CPP - это сценарий, разработанный Unity, который вы можете использовать в качестве альтернативы Mono при создании проектов для некоторых платформ. Когда вы решаете построить проект с использованием IL2CPP, Unity преобразует код IL (иногда называемый CIL - Intermediate Language или Common Intermediate Language) из сценариев и сборок в код C ++, прежде чем создавать собственный двоичный файл (.exe, apk, .xap, для пример) для выбранной вами платформы. Некоторые из применений IL2CPP включают повышение производительности, безопасности и совместимости платформ ваших проектов Unity.

Источник

IL2CPP - предположительно эквивалентная * платформа для выполнения, которая быстрее моно. В этом контексте «экспериментальный» делает сильный акцент на слове «предположительно» в предыдущем предложении.

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

* IL2CPP не работает для кода, который используется исключительно посредством отражения, что произойдет при использовании отражения, сериализации или обобщений в классах, которые никогда не вызываются напрямую и, следовательно, удаляются из сборки. То же самое ограничение в настоящее время применяется к Mono на платформах, которые используют ограничения компиляции Ahead of Time.



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

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

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

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

Что такое IL2CPP?

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

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

AOT компилятор

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

Вы можете думать об инструментах 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 к главной камере в сцене:

public class HelloWorld : MonoBehaviour void Start () Debug.Log("Hello, IL2CPP!");
>
>[/csharp]

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

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

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

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

  • --copy-level=None
    • Указывает, что il2cpp.exe не следует выполнять специальные копии файлов генерируемого C++ кода.
    • Функция уменьшения размера кода и бинарника. IL2CPP поделятся реализацией генерированных методов, когда это возможно.
    • Специальная поддержка кода для событий Unity, доступ к которым осуществляется с помощью рефлексии.
    • Создание C++ кода в формате, который требует меньше символов для имен типов и методов. Этот код трудно отлаживать, поскольку имена в коде IL не сохраняются, но часто компилируется быстрее, так как будет меньше кода для разбора компилятором C++.
    • Использует значение по умолчанию (или пустой) дополнительный файл типов. Этот файл может быть добавлен в проект 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

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

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

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

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

    Вы можете столкнуться с ошибкой извлечения из-за поврежденного кэша приложения или поврежденного раздела кэша вашего телефона. Кроме того, неправильная установка приложения также может привести к возникновению проблемы.


    Прежде чем переходить к решениям, убедитесь, что на вашем устройстве достаточно свободного места. Более того, во многих случаях, простая перезагрузка телефона может решить проблему.

    Решение 1. Принудительно остановите проблемное приложение и очистите кэш

    Почти каждое приложение использует кеш для повышения производительности и улучшения работы пользователей. Вы можете столкнуться с обсуждаемой ошибкой, если кэш приложения поврежден из-за неправильной установки или из-за неправильной конфигурации. В этом контексте очистка кэша приложения может решить проблему. Для иллюстрации обсудим процесс для Pokemon Go.

    1. Откройте настройки вашего телефона.
    2. Затем нажмите «Приложения / Диспетчер приложений».Откройте приложения в настройках вашего телефона
    3. Теперь нажмите на проблемное приложение, например, Покемон Go.Откройте Pokemon в настройках приложений
    4. Теперь нажмите на Force Stop, а затем подтвердите принудительную остановку приложения.Force Stop Pokemon Go
    5. Теперь нажмите на хранилище, а затем нажмите на очистить кэш.Очистить кэш Pokemon Go
    6. Теперь перезагрузите телефон и проверьте, нормально ли работает приложение.

    Решение 2. Протрите кэш-память вашего телефона

    Помимо кеша приложения, ОС Android использует кеш-раздел для хранения временных системных файлов. Вы можете столкнуться с ошибкой под рукой, если данные в разделе кэша повреждены или неправильно настроены. В этом случае очистка раздела кэша вашего телефона может решить проблему.

    1. Протрите раздел кеша вашего телефона.
    2. Затем убедитесь, что приложение не содержит ошибок.

    Решение 3. Сделайте внутреннее хранилище по умолчанию и переместите приложение во внутреннее хранилище

    Многие приложения могут отображать различные типы ошибок, когда приложения установлены на внешнем хранилище (SD-карта) или если для хранилища по умолчанию установлено внешнее хранилище. То же самое может быть причиной обсуждаемой ошибки. В этом контексте установка хранилища по умолчанию на Внутреннее и перемещение приложения во внутреннее хранилище может решить проблему. Для пояснения мы обсудим процесс для приложения Pokemon Go.

    1. Откройте настройки вашего телефона, а затем нажмите на опцию хранения.
    2. Теперь нажмите на «Предпочтительное место установки» и выберите «Внутреннее хранилище устройства». Обычно лучше использовать опцию «Пусть система решит», но в этом случае вы должны попробовать Внутреннее хранилище устройства.Изменить хранилище по умолчанию на внутреннее
    3. Снова откройте настройки телефона и нажмите «Приложения / Диспетчер приложений».
    4. Теперь найдите и нажмите на проблемное приложение, например, Pokemon Go.
    5. Затем нажмите на вариант хранения.
    6. Затем измените местоположение на Внутреннее хранилище.Переместить приложение на SD-карту
    7. После настройки хранилища по умолчанию и изменения местоположения хранилища приложения убедитесь, что приложение не содержит приложения.

    Решение 4. Переустановите проблемное приложение

    Если вам пока что ничего не помогло, то проблема, с которой вы столкнулись, вызвана поврежденной установкой приложения. В этом контексте удаление и повторная установка приложения могут решить проблему. Для иллюстрации обсудим процесс для Pokemon Go.


    1. Принудительно остановите приложение и очистите его кэш (как описано в решении 1).
    2. Откройте настройки вашего телефона. Теперь нажмите на приложения / Диспетчер приложений.
    3. Затем найдите и нажмите на Pokemon Go (или проблемное приложение).
    4. Теперь нажмите на кнопку «Удалить», а затем подтвердите удаление приложения.Удалить Pokemon Go
    5. Затем протрите раздел кэша (как обсуждено в решении 2).
    6. Теперь переустановите приложение и проверьте, нет ли ошибок.

    Если у вас все еще есть проблемы, возможно, вам придется сбросить настройки телефона к заводским настройкам. Но имейте в виду, что раздел кэша некоторых новейших устройств Android, таких как Huawei P9 Lite, не очищается автоматически даже после заводской перезагрузки телефона, и вам, возможно, придется вручную очистить раздел кэша.

    Сериал будет разделен на следующие части:
    1. Обзор (эта статья)
    2. Анализ кода C ++
    3. Отладка кода C ++.
    4. Вызов метода (общий метод, виртуальный метод и т. Д.)
    5. Общий доступ
    6. P / invoke инкапсуляция типов и методов
    7. Сборка мусора
    8. Структура тестирования и использование

    Что такое IL2CPP

    IL2CPP - это новый бэкэнд-метод сценариев, предложенный Unity начиная с версии 4.6.1p5. Он обеспечивает Unity более эффективной и портативной виртуальной машиной. IL2CPP разделен на две независимые части:

    • Компилятор AOT (статическая компиляция)
    • Библиотека времени исполнения

    Компилятор AOT

    Цепочка инструментов IL2CPP показана ниже:


    Библиотека времени исполнения

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

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

    Еще одна ключевая функция библиотеки времени выполнения - обеспечить сборку мусора, которая будет подробно обсуждаться в следующих статьях.

    Как работает компилятор AOT

    Давайте посмотрим на пример (этот пример работает в версии Unity 5.0.1 в системе Windows)
    Запустите новый проект и добавьте в основную камеру следующий скрипт:

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

    "C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\bin\mono.exe" --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 запускает mono.exe

    Остальная часть командной строки передается в il2cpp.exe вместо параметров, передаваемых в mono.exe. Сначала в il2cpp.exe передаются 5 идентификаторов:

    Скажите il2cpp.exe не копировать сгенерированный код C ++.

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

    Поддерживайте события Unity, полученные посредством отражения, чтобы гарантировать правильную генерацию кода.

    В сгенерированном коде C ++ используйте меньшее количество символов для именования классов и методов, что затруднит отладку кода, потому что название кода IL изменится (примечание автора: оно должно быть похоже на путаницу кода), но Он может быть скомпилирован компилятором быстрее, потому что количество символов, которые компилятор должен проанализировать, уменьшается.

    Используйте файл дополнительного типа по умолчанию. Этот файл будет добавлен в ваш проект Unity и сообщит il2cpp.exe, какие универсальные типы или типы массивов не отображаются в коде IL, но будут созданы во время выполнения.

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

    Читайте также: