Библиотека, позволяющая писать сценарии единства в собственном коде: C, C ++, сборка.
Этот проект направлен на то, чтобы дать вам жизнеспособную альтернативу C#. Сценарий в C ++ не подходит для всех частей каждого проекта, но теперь это вариант.
Изменение одной строки кода C# требует, чтобы вы создали новую сборку игры. Типичное время сборки Android, как правило, составляет не менее 10 минут, потому что IL2CPP должен работать, а затем необходимо составить огромное количество C ++.
Используя C ++, мы можем скомпилировать игру как плагин C ++ примерно на 1 секунду, заменить плагин в APK, а затем немедленно установить и запустить игру. Это огромный повышение производительности!
C ++ компилирует гораздо быстрее, чем C#. ИНКРЕМЕНТАЛЬНАЯ СОЗДАНИЯ, когда меняется только один файл- наиболее распространенные сборки- могут быть в 15 раз быстрее, чем с C#. Более быстрое компиляция со временем увеличивает повышение производительности. Более быстрое время итерации облегчает оставаться в «потоке» программирования.
Коллекционер мусора Unity является обязательным и имеет много проблем. Он медленно, работает по главной нити, собирает весь мусор одновременно, фрагментирует кучу и никогда не сжимает кучу. Таким образом, ваша игра будет испытывать «зацепки рамки», и в конечном итоге у вас закончится память и сбой.
Для обхода GC требуется значительное количество усилий, и полученный код трудно поддерживать и медленную. Это включает в себя методы, такие как пулы объектов, которые по сути делают руководство по управлению памятью. Вы также должны избегать типов ценностей бокса, таких как int , к управляемым типам, таким как object , не использовать петли foreach в некоторых ситуациях и различные другие GotChas.
C ++ не имеет необходимого коллекционера мусора и функционирует необязательное автоматическое управление памятью с помощью типов «Smart Pointer», таких как shared_ptr. Он предлагает отличные альтернативы примитивному сборщику мусора Unity.
Хотя использование некоторых API .NET все еще будет включать в себя создание мусора, проблема содержится только для тех API, а не является распространенной проблемой для всего вашего кода.
Используя C ++ напрямую, вы получаете полный контроль над кодом, который будет выполнять процессор. Гораздо проще генерировать оптимальный код с компилятором C ++, чем с компилятором C#, IL2CPP и, наконец, компилятором C ++. Вырежьте среднего человека, и вы можете воспользоваться преимуществами внутренней или сборки компилятора, чтобы напрямую написать машинный код, используя мощные функции ЦП, такие как SIMD и аппаратное шифрование AES для массового повышения производительности.
C ++ - это гораздо больший язык, чем C#, и некоторые разработчики предпочтут иметь в своем распоряжении больше инструментов. Вот несколько различий:
В то время как IL2CPP преобразует C# в C ++, он уже генерирует много накладных расходов. Есть много сюрпризов, если вы прочитаете сгенерированный C ++. Например, есть накладные расходы для любой функции, используя статическую переменную, и в начале каждого класса хранятся дополнительные два указателя. То же самое касается всех видов функций, таких как sizeof() , обязательные нулевые проверки и так далее. Вместо этого вы можете писать C ++ напрямую и не нуждаетесь в обходе вокруг IL2CPP.
C ++ - это стандартный язык для видеоигр, а также для многих других областей. Программированием в C ++ вы можете легче перенести свои навыки и код в проекты, не являющиеся отделением. Например, вы можете избежать блокировки, используя тот же язык (C ++), который вы бы использовали в нереальных или лесорубарных двигателях.
GameObject go;
Transform transform = go.GetTransform();
Vector3 position(1.0f, 2.0f, 3.0f);
transform.SetPosition(position);
MonoBehaviour в C ++ void MyScript::Start()
{
String message("MyScript has started");
Debug::Log(message);
}
#if TARGET_OS_ANDROID )Ядром этого проекта является генератор кода. Он генерирует код C# и C ++, называемый «привязки», которые предоставляют API C# API доступны для кода игры C ++. Он поддерживает широкий спектр языковых функций:
classstructenumAction )decimalget и set как obj.x )get и set как obj[x] )add и remove делегатов)int для object и визы)ref outОбратите внимание, что генератор кода еще не поддерживает:
Array , string и object (например, GetHashCode )params (он же "var args") прохождение Чтобы настроить генератор кода, откройте Unity/Assets/NativeScriptTypes.json и обратите внимание на существующие примеры. Добавьте в этот файл, чтобы выявить больше API C# из Unity, .net или пользовательских DLL в код C ++.
Чтобы запустить генератор кода, выберите NativeScript > Generate Bindings из редактора Unity.
Почти все проекты увидят чистую победу в производительности за счет сокращения коллекции мусора, ликвидации накладных расходов IL2CPP и доступа к внутренней и сборке компилятора. Вызовы из C ++ в C# несут лишь незначительный штраф за производительность. В редком случае, когда почти весь ваш код вызовы к API .NET, вы можете испытать чистую потерю производительности.
Статья тестирования и тестов
Оптимизация статья
При сценарии в C ++ C# используется только в качестве слоя «привязки», чтобы Unity может вызовать функции C ++, а функции C ++ могут вызвать API Unity. Генератор кода используется для генерации большинства этих привязков в соответствии с потребностями вашего проекта.
Весь ваш код, плюс несколько привязков, будет существовать в одном «нативном» плагине C ++. Когда вы измените свой код C ++, вы создадите этот плагин, а затем сыграете в игру в редакторе или в развернутой сборке (например, на устройстве Android). Там не будет никакого кода C# для Unity для компиляции, если вы не запустите генератор кода, что нечасто.
Стандартный рабочий процесс C# выглядит так:
С C ++ рабочий процесс выглядит так:
Unity/Assets в каталог Assets вашего проекта UnityNativeScriptTypes.json и укажите, какие части Unity, .net и пользовательские API DLL вы хотите получить доступ от C ++.Unity/Assets/CppSource/Game/Game.cpp и Unity/Assets/CppSource/Game/Game.h чтобы создать вашу игру. Приведен пример кода, но не стесняйтесь удалить его. Вы можете добавить больше файлов C ++ Source ( .cpp ) и заголовка ( .h ) здесь по мере роста вашей игры./Applications/Utilitiescd /path/to/your/build/directorycmake -G MyGenerator -DCMAKE_TOOLCHAIN_FILE=/path/to/your/project/CppSource/iOS.cmake /path/to/your/project/CppSource . Замените MyGenerator генератором по вашему выбору. Чтобы увидеть параметры, выполните cmake --help и посмотрите список внизу. Общий выбор включает в себя «Unix Makefiles» для создания из командной строки или «XCODE» для использования Apple IDE.make , если вы выбрали Unix Makefiles в качестве генератора или откройте NativeScript.xcodeproj и нажмите Product > Build если вы выбрали xcode. /Applications/Utilitiescd /path/to/your/build/directorycmake -G "MyGenerator" -DEDITOR=TRUE /path/to/your/project/CppSource . Замените MyGenerator генератором по вашему выбору. Чтобы увидеть параметры, выполните cmake --help и посмотрите список внизу. Общий выбор включает в себя «Unix Makefiles» для создания из командной строки или «XCODE» для использования Apple IDE. Удалить -DEDITOR=TRUE для автономных сборок.make , если вы выбрали Unix Makefiles в качестве генератора или откройте NativeScript.xcodeproj и нажмите Product > Build если вы выбрали xcode. cd /path/to/your/build/directorycmake -G "Visual Studio VERSION YEAR Win64" -DEDITOR=TRUE /path/to/your/project/CppSource . Замените VERSION и YEAR на версию Visual Studio, которую вы хотите использовать. Чтобы увидеть параметры, выполните cmake --help и посмотрите список внизу. Например, используйте "Visual Studio 15 2017 Win64" для Visual Studio 2017. Любая версия, включая сообщество, работает просто отлично. Удалить -DEDITOR=TRUE для автономных сборок. Если вы используете Visual Studio 2019, выполните cmake -G "Visual Studio 16" -A "x64" -DEDITOR=TRUE /path/to/your/project/CppSource .NativeScript.sln и нажмите Build > Build Solution . cd /path/to/your/build/directorycmake -G "MyGenerator" -DEDITOR=TRUE /path/to/your/project/CppSource . Замените MyGenerator генератором по вашему выбору. Чтобы увидеть параметры, выполните cmake --help и посмотрите список внизу. Наиболее распространенным выбором является «Unix Makefiles», чтобы построить из командной строки, но есть также параметры IDE. Удалить -DEDITOR=TRUE для автономных сборок.make если вы выбрали Unix Makefiles в качестве генератора. cd /path/to/your/build/directorycmake -G MyGenerator -DANDROID_NDK=/path/to/android/ndk /path/to/your/project/CppSource . Замените MyGenerator генератором по вашему выбору. Чтобы увидеть параметры, выполните cmake --help и посмотрите список внизу. Чтобы сделать сборку для любой платформы, отличной от Android, опустите часть -DANDROID_NDK=/path/to/android/ndk .make если вы выбрали Unix Makefiles в качестве генератора. Чтобы обновиться до новой версии этого проекта, перезаписывайте Assets/NativeScript Project Project Project с помощью каталога Unity/Assets/NativeScript и повторного управления генератором кода.
Статьи автора, описывающие разработку этого проекта.
Джексон Данстан
Пожалуйста, не стесняйтесь распаковать и отправлять запросы на привлечение или просто отправьте проблему для исправлений или исправлений ошибок.
Весь код является лицензированным MIT, что означает, что его обычно можно легко использовать в коммерческих и некоммерческих приложениях.
Все письма лицензировано CC по 4.0, что означает, что его можно использовать, если приведена атрибуция.