Mono Скриптирование
Скриптовый бэкенд Mono — это ответвление Unity от проекта Mono с открытым исходным кодом. Mono — зрелая кроссплатформенная среда выполнения .NET, на которой работают Editor и Players Unity на совместимых платформах. Она обеспечивает быстрые итерации и удобные инструменты, но её производительность во время выполнения ниже, чем у IL2CPP, и она не соответствует новейшим возможностям .NET.
Mono использует компиляцию непосредственно перед выполнением (JIT), чтобы во время выполнения преобразовывать код C# в машинный код. Mono управляет жизненным циклом управляемых объектов, обрабатывает перезагрузку кода и автоматически удаляет объекты, вышедшие из области видимости, с помощью сборщика мусора Boehm-Demers-Weiser. Поведение сборщика мусора можно в некоторой степени настраивать. Дополнительные сведения см. в разделе Режимы сборки мусора.
Mono поддерживает отладку управляемого кода. Дополнительные сведения см. в Отладка кода C# в Unity.
Создание проекта с Mono
Чтобы начать процесс сборки, откройте окно Создание профилей (Меню: Файл > Создание профилей) и выберите Строительство.
Вы можете изменить скриптовый бэкэнд, используемый Unity для создания вашего приложения, одним из двух способов:
-
Через меню Настройки Игрока в Редакторе. Выполните следующие действия, чтобы изменить скриптовый сервер через меню Настройки Игрока:
- Перейдите в Изменить > Project Настройки.
- Нажмите на кнопку Настройки Игрока, чтобы открыть Игрок settings для текущей платформы в Inspector.
- Перейдите в раздел Конфигурация в подменю Другие настройки.
- Нажмите на раскрывающееся меню Scripting Backend, затем выберите Mono.
Вы также можете открыть меню Настройки Игрока из окна Создание профилей; перейдите в Файл > Создание профилей и нажмите на вкладку Настройки Игрока.
С помощью редактора скриптов API. Используйте свойства
PlayerSettings.SetScriptingBackendдля изменения бэк-энда скриптов, используемого Unity.
Как Mono, так и IL2CPP требуют новой сборки для каждой платформы, на которую вы хотите ориентироваться. Например, для поддержки платформ Android и iOS вам необходимо компилировать приложение дважды и создать два бинарных файла, один для Android и один для iOS.
Перезагрузка домена
Unity Editor встраивает Mono, так что ваш код C# управляется Mono и подчиняется ограничениям Mono при запуске в режиме воспроизведения редактора. Ключевым аспектом этого является то, что вход и выход из режима воспроизведения или перекомпиляция скриптов вызывают AppDomain перезагрузки, при которых сбрасывается статическое состояние. Вы можете настроить, как Unity входит в режим воспроизведения и отключить перезагрузку домена, чтобы ускорить итерации, — но тогда ваш код должен сам сбрасывать статическое состояние. Подробнее см. Перейти в режим воспроизведения с отключенной перезагрузкой домена.
Оптимизация сборок Mono
Mono и IL2CPP используют одну и ту же базовую библиотеку классов .NET, поэтому многие проблемы производительности и рекомендации применимы к обоим. Однако в контексте Mono учитывайте следующее:
- Компиляция JIT Mono означает, что она может иметь более низкую производительность во время выполнения и более длинное время запуска в больших кодах по сравнению с компиляцией AOT IL2CPP. Always profile с Unity Profiler для обнаружения горячих точек GC и JIT. Инструмент Project Ревизор также может помочь вам идентифицировать и устранить общие проблемы производительности. Дополнительные сведения см. в Оптимизация.
- Некоторые методы кодирования, например те, которые вызывают большое количество выделений во время выполнения, могут увеличить накладные расходы сборщика мусора и ухудшить производительность. Руководство по написанию эффективного управляемого кода в Unity см. в разделе Оптимизация кода для управляемой памяти. Сведения о отслеживании и сокращении накладных расходов сборщика мусора см. в разделе Управляемая память.
- Unity APIs обычно не являются потоковыми, что означает, что они должны вызываться из главного потока Unity. Не используйте .NET
Taskс Unity APIs.- При работе с по сути асинхронными и долговременными операциями, Unity обеспечивает
Awaitableкласс как более эффективную альтернативуTask. Для получения дополнительной информации см. Асинхронное программирование с помощью класса Awaitable. - Для более короткой, но более вычислительно интенсивной параллельной работы, Unity обеспечивает система работы, которые могут быть Burst Составлено. Для получения дополнительной информации см. Написать многопоточное программное обеспечение с помощью системы заданий.
- При работе с по сути асинхронными и долговременными операциями, Unity обеспечивает
- Реализации ,
DateTime,, ,TimeZoneInfo,и ,CultureInfo, в Mono могут отличаться от поведения Windows, .NET. Обязательно проверяйте глобализованный, культурно-специфический код на целевых платформах.
Оптимизация производительности во время выполнения с Burst
В соответствующих проектах вы можете улучшить производительность проекта во время выполнения, используя компилятор Burst вместе с Mono для компиляции совместимых разделов вашего кода в высокооптимизированный машинный код. Дополнительную информацию см. в Burst компиляция.