Unity продолжает совершенствовать технологию IL2CPP, и мы публикуем перевод статьи о том, как она работает.
Около года назад мы писали о будущем сценариев в Unity. Новая технология сценариев IL2CPP должна была предоставить движку высокопроизводительную портативную виртуальную машину.
В январе мы выпустили нашу первую платформу на 64-битная iOS , используя IL2CPP. С выходом Unity 5 появилась еще одна платформа — ВебГЛ .
При поддержке огромного сообщества пользователей мы выпустили множество патчей и обновления для IL2CPP, постепенно оптимизируя компилятор и повышая производительность среды.
А пока, пока мы продолжаем совершенствовать технологию IL2CPP, было бы неплохо поговорить о том, как она работает. Мы планируем написать серию статей, посвященных следующим темам: 1. Основы — панель инструментов и аргументы командной строки (эта статья).
2. Экскурсия по сгенерированному коду.
3. Советы по отладке сгенерированного кода.
4. Вызовы методов: обычные методы, виртуальные методы и другие.
5. Осуществление общего обмена.
6. Обертки P/Invoke для типов и методов.
7. Интеграция сборщика мусора.
8. Тестирование и применение фреймворков.
В этих статьях мы обсудим некоторые особенности реализации IL2CPP. Я надеюсь вы найдете эту информацию полезной.
Что такое IL2CPP? Технология IL2CPP состоит из двух частей: • Предварительный компилятор (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, сборщиком мусора Бёма-Демерса-Вайзера.
Однако 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 передает il2cpp.exe 5 флагов: • -copy-level=Нет Указывает, что il2cpp.exe не должен создавать специальные копии созданных файлов кода C++.
• -enable-generic-sharing Уменьшает размер кода и двоичных файлов.
Со временем мы опубликуем процесс выполнения обобщенных методов в IL2CPP. • -enable-unity-event-support Обеспечивает правильную генерацию кода для событий Unity, возникающих с помощью отражения.
• -output-format=Компактный Создает код 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\Temp\StagingArea\Data\Managed\Assembly-CSharp.dll» • «C:\Users\Josh Peterson\Documents\Пример блога IL2CPP\Temp\StagingArea\Data\Managed\UnityEngine.UI.dll» • «C:\Users\Josh Peterson\Documents\Пример блога IL2CPP\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++.
Попробуйте поиграть с настройками проигрывателя WebGL или iOS. Вы увидите различные параметры командной строки, передаваемые в il2cpp.exe, которые отвечают за различные этапы генерации кода.
Например, установка параметра «Включить исключения в настройках проигрывателя WebGL» на «Полный» приведет к добавлению аргументов -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), исправивших более сотни ошибок.
Для обеспечения постоянной оптимизации мы разрабатываем обновления на основе одной версии кода.
Перед каждым релизом мы переносим все изменения в конкретную ветку релиза, проводим тестирование и проверяем, что все ошибки успешно исправлены.
Наши команды по обеспечению качества и устойчивому проектированию прилагают все усилия, чтобы разработка продолжалась в таком же темпе: ошибки исправляются каждую неделю.
Наше сообщество оказало нам неоценимую помощь, предоставив нам множество полезных отчетов об ошибках.
Мы очень благодарны всем пользователям за отзывы, которые помогают нам постоянно улучшать IL2CPP. Для разработчиков IL2CPP тестирование стоит на первом месте.
Мы часто применяем подход к разработке через тестирование и редко выдаем запросы на включение, если код не был полностью протестирован.
Эта стратегия хорошо работает для таких технологий, как IL2CPP, где есть четкие входные и выходные данные.
Это означает, что подавляющее большинство ошибок, с которыми мы сталкиваемся, являются частными случаями, а не неожиданным поведением системы ( Например , при использовании 64-битного IntPtr в качестве индекса 32-битного массива может возникнуть ошибка компилятора C++).
Таким образом, мы можем быстро выявить и исправить любые ошибки.
При поддержке нашего сообщества мы постоянно делаем IL2CPP более стабильным и продуктивным.
Продолжение следует Боюсь, я слишком часто упоминаю следующие статьи.
Я просто хочу вам многое рассказать, и это не уместиться в один пост. В следующий раз мы углубимся в код, сгенерированный il2cpp.exe, и поговорим о том, как работает компилятор C++.
Теги: #unity #il2cpp #.
NET #C++ #C++ #Технологии #новости #перевод #программирование #.
NET #C++ #unity
-
Самые Лучшие Стратегии В Социальных Сетях
19 Oct, 24 -
Обзор Алгоритмов Кластеризации Данных
19 Oct, 24 -
Ждём Летних Вебинаров От Алексея Кибкало
19 Oct, 24