Введение в создание скриптовых серверов
Базовый конец скриптов — это термин Unity для технологии времени выполнения, которая компилирует и выполняет ваши C# скрипты. Она определяет, как ваш код превращается в исполняемые инструкции, и какое время выполнения управляет им на целевых платформах.
Выбор бэк-энда для скриптов может повлиять на различные аспекты вашего проекта, включая:
- Время сборки и скорость итерации.
- Производительность и память во время выполнения.
- Поддержка платформы и требования.
- Поддержка некоторых функций .NET, таких как отражение и генерация динамического кода.
- Опыт отладки и профилирования.
Unity поддерживает следующие скриптовые бэкэнды:
- Mono: реализация .NET Framework с открытым исходным кодом, основанная на стандартах ECMA для C# и Common Language Infrastructure (CLI). Mono использует компиляцию непосредственно перед выполнением (JIT), чтобы во время выполнения преобразовывать код C# в машинный код.
- IL2CPP: разработанный Unity скриптовый бэкенд, который преобразует код и сборки C# в код C++. Затем этот код компилируется нативным для платформы компилятором C++ в двоичный файл для целевой платформы. IL2CPP использует опережающую (AOT) компиляцию, чтобы преобразовать код до начала его выполнения.
Поддержка платформы
Mono поддерживается на следующих платформах:
- Windows x86/x64/Arm64
- OSX x64/Arm64
- Linux x64
- Android Armv7
IL2CPP поддерживается на всех платформах.
Любая платформа, не упомянутая в предыдущем списке Mono-поддержка платформ является IL2CPP-только. На платформах, поддерживающих оба бэк-энда, Mono по умолчанию.
Примечание: Поддержка скриптирования может меняться между выпусками. Для получения последней информации, обратитесь к настройкам Player для конкретной платформы для вашей целевой платформы и версии Unity.
Изменение сервера скриптов
Вы можете изменить скриптовый бэкэнд, используемый Unity для создания вашего приложения, одним из двух способов:
-
Через меню Настройки Игрока в Редакторе. Выполните следующие действия, чтобы изменить скриптовый сервер через меню Настройки Игрока:
- Перейдите в Изменить > Project Настройки.
- Нажмите на кнопку Настройки Игрока, чтобы открыть Игрок settings для текущей платформы в Inspector.
- Перейдите в раздел Конфигурация в подменю Другие настройки.
- Нажмите на раскрывающееся меню Scripting Backend, затем выберите Mono или IL2CPP.
Вы также можете открыть меню Настройки Игрока из окна Создание профилей; перейдите в Файл > Создание профилей и нажмите на вкладку Настройки Игрока.
С помощью редактора скриптов API. Используйте свойства
PlayerSettings.SetScriptingBackendдля изменения бэк-энда скриптов, используемого Unity.
Сравнение скриптовых серверов
Доступная поверхность API C#/.NET у Mono и IL2CPP практически одинакова. Оба бэкенда скриптинга используют одну и ту же базовую библиотеку классов и поддерживают доступные API уровни совместимости. Однако, некоторые ограничения, специфические для IL2CPP и некоторых платформ AOT применяются. Для получения дополнительной информации, см. Ограничения IL2CPP.
В следующей таблице приведено сравнение ключевых функций Mono и IL2CPP бэк-эндов скриптов:
| Особенности | Mono | IL2CPP |
|---|---|---|
| Модель исполнения | Система " точно в срок " (JIT). | Заблаговременно (AOT): C# до IL до C++ в основной код |
| Платформы | Настольный компьютер и Android. | Широкая поддержка и требуется для iOS и большинства консолей. |
| Кросс-компиляция | Минимальный; JIT компилирует управляемые сборки по мере необходимости. | Требуется C++ toolchain (Clang/MSVC), платформа SDKs; более длительные сроки сборки/подключения. Для более подробной информации см. Linux IL2CPP кросс-компилятор. |
| Время сборки | Более быстрая итерация, меньшие шаги связывания. | Медленнее (C++ codegen, компиляция и связывание), более крупные генерируемые кодовые базы. |
| Время запуска | Обычно медленнее с JIT (warmup, JIT стоимость). | Как правило, быстрее (полностью нативный, без JIT разогрева). |
| Использование памяти | Меньше размер код с JIT | Большие нативные двоичные файлы; дополнительно генерируется C++ и метаданные |
| Обработка исключений | Управление исключениями через Mono runtime. | Управляемая семантика, отображаемая в нативном режиме с помощью поддержки runtime IL2CPP. |
| Отражение | Полное отражение работает, динамический кодген поддерживается. | Отражение работает для существующих метаданных, но динамическое кодгенирование имеет ограничения. Методы System.Reflection.Emit и dynamic не поддерживаются. |
| Генерические лекарства | Полная поддержка, JIT может специализироваться во время выполнения. | AOT использует предварительную общую доступность, а IL2CPP могут понадобиться дополнительные подсказки AOT, чтобы избежать недостающих методов или ошибок типа во время выполнения. Дополнительные сведения см. в Общие типы и методы. |
| Снятие кодов/связка | Управляемый линкер, легче держать символы из-за JIT. | Более агрессивное удаление, требует аннотации или настройки для сохранения отраженных или динамически загруженных членов. Используйте файл link.xml или атрибут [Preserve] для сохранения типов и методов. Дополнительные сведения см. в Управляемое удаление кода. |
Интероп (P/Invoke) |
По умолчанию P/Invoke, время выполнения разрешается при загрузке. |
Стандартный P/Invoke, имена должны совпадать, так как AOT/нативная двоичная связь более строга. Дополнительную информацию см. в Вызов управляемых методов из нативного кода. |
| Отладка (C#) | Быстрая перезагрузка домена, редактирование и продолжение на платформах, поддерживающих JIT, информативные управляемые стеки по умолчанию. | Поддерживается управляемая отладка, трассировки стека могут быть дополнительно расширены. Дополнительные сведения см. в IL2CPP управляемые трассировки стека. |
На платформах, где вы можете выбрать между IL2CPP и Mono, предпочтите IL2CPP, если сборки Player требуют более быстрого запуска, более строгого соответствия платформе и более предсказуемой производительности. Mono обеспечивает более быструю итерацию в редакторе и разработке рабочего стола, более короткие сроки сборки и является единственным вариантом, если вам нужно использовать APIs , не поддерживаемые IL2CPP.
Совет: Независимо от того, какой скриптовый бэк-энд вы выберете, вы можете дополнить его компилятором Burst для компиляции отдельных частей вашего кода в высокооптимизированный нативный код. Для более подробной информации, см. Burst компиляция.