一個庫,允許在本機代碼中編寫Unity腳本:C,C ++,彙編。
該項目旨在為您提供C#的可行替代方案。 C ++的腳本不適合每個項目的所有部分,但現在是一個選擇。
更改C#代碼的一行需要您製作遊戲的新構建。典型的Android構建時間往往至少10分鐘,因為IL2CPP必須運行,然後必須編譯大量的C ++。
通過使用C ++,我們可以在大約1秒鐘內將游戲編譯為C ++插件,將插件交換到APK中,然後立即安裝並運行遊戲。這是一個巨大的生產力提升!
C ++比C#更快地編譯。當只有一個文件更改時,增量構建(最常見的構建)可能比C#快15倍。隨著時間的推移,更快的彙編將生產率提高。更快的迭代時間使得保持在編程的“流程”中變得更加容易。
Unity的垃圾收集器是強制性的,並且有很多問題。它很慢,在主線程上運行,一次收集所有垃圾,碎片堆,從不收縮堆。因此,您的遊戲將體驗“框架掛鉤”,最終您將用光記憶和崩潰。
圍繞GC工作需要大量的努力,並且由此產生的代碼很難維護和減速。這包括諸如對像池之類的技術,這些技術本質上是記憶管理手冊。您還必須避免使用拳擊值類型,例如int到託管類型,例如object ,而不是在某些情況下使用foreach循環,以及其他各種陷阱。
C ++沒有必需的垃圾收集器,並且通過“智能指針”類型的類型具有可選的自動內存管理。它為Unity的原始垃圾收集器提供了絕佳的選擇。
雖然使用一些.NET API仍將涉及垃圾的創建,但僅包含這些API,而不是作為所有代碼的普遍問題。
通過直接使用C ++,您可以完全控制CPU將執行的代碼。使用C ++編譯器生成最佳代碼要比使用C#編譯器,IL2CPP,最後是C ++編譯器要容易得多。剪掉中間人,您可以利用編譯器內在或組裝來使用強大的CPU功能(例如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消息 void MyScript::Start()
{
String message("MyScript has started");
Debug::Log(message);
}
#if TARGET_OS_ANDROID )該項目的核心是代碼生成器。它生成稱為“綁定”的C#和C ++代碼,使C ++遊戲代碼可用。它支持廣泛的語言特徵:
classstructenumAction )decimalobj.x一樣get並set )obj[x]一樣get並set )add和remove代表)int鑄造給object ,反之亦然)out和ref參數請注意,代碼生成器尚未支持:
Array , string和object方法(例如GetHashCode )params參數(又稱“ var args”)傳遞要配置代碼生成器,請打開Unity/Assets/NativeScriptTypes.json並註意現有示例。添加到此文件中,以將更多的C#API從Unity,.NET或自定義DLLS暴露為C ++代碼。
要運行代碼生成器,請選擇NativeScript > Generate Bindings 。
幾乎所有項目都將通過減少垃圾收集,消除IL2CPP開銷以及訪問編譯器內在和組裝的範圍來贏得淨績效。 C ++的呼叫僅造成較小的績效罰款。在極少數情況下,幾乎所有代碼都是呼叫.NET API,那麼您可能會遇到淨性能損失。
測試和基准文章
優化文章
當在C ++中腳本時,C#僅用作“綁定”層,因此Unity可以調用C ++功能,並且C ++功能可以調用Unity API。代碼生成器用於根據項目的需求生成大多數綁定。
您的所有代碼以及一些綁定都將存在於單個“本機” C ++插件中。當您更改C ++代碼時,您將構建此插件,然後在編輯器或部署的構建中玩遊戲(例如,到Android設備)。除非您運行不經常的代碼生成器,否則不會有任何C#代碼來編譯。
標準C#工作流如下所示:
使用C ++,工作流程看起來像這樣:
Unity/Assets目錄中的所有內容複製到Unity Project的Assets目錄NativeScriptTypes.json並指定您希望從C ++訪問的Unity,.NET和自定義DLL API的哪些部分。Unity/Assets/CppSource/Game/Game.cpp和Unity/Assets/CppSource/Game/Game.h創建您的遊戲。提供了一些示例代碼,但請隨時刪除它。您可以在遊戲增長時在此處添加更多C ++源( .cpp )和標頭( .h )文件。/Applications/Utilities中打開終端應用程序cd /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並查看底部的列表。共同的選擇包括從命令行或“ XCode”構建的“ Unix Makefiles”來使用Apple的IDE。Unix Makefiles作為生成器或打開NativeScript.xcodeproj ,則執行“執行make ,然後單擊Product > Build如果選擇Xcode,則可以單擊“構建”。 /Applications/Utilities中打開終端應用程序cd /path/to/your/build/directorycmake -G "MyGenerator" -DEDITOR=TRUE /path/to/your/project/CppSource 。用您選擇的生成器替換MyGenerator 。要查看選項,請執行cmake --help並查看底部的列表。共同的選擇包括從命令行或“ XCode”構建的“ Unix Makefiles”來使用Apple的IDE。刪除-DEDITOR=TRUE獨立構建。Unix Makefiles作為生成器或打開NativeScript.xcodeproj ,則執行“執行make ,然後單擊Product > Build如果選擇Xcode,則可以單擊“構建”。 cd /path/to/your/build/directorycmake -G "Visual Studio VERSION YEAR Win64" -DEDITOR=TRUE /path/to/your/project/CppSource 。用您要使用的Visual Studio版本替換VERSION和YEAR 。要查看選項,請執行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獨立構建。Unix Makefiles作為生成器,則執行make 。 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 part。Unix Makefiles作為生成器,則執行make 。要更新此項目的新版本,請使用該項目的Unity/Assets Assets/NativeScript目錄覆蓋Unity/Assets/NativeScript目錄並重新運行代碼生成器。
作者的文章描述了該項目的發展。
傑克遜·鄧斯坦
請隨意到叉子並發送拉動請求,或者簡單地提交問題或錯誤修復的問題。
所有代碼均為許可的麻省理工學院,這意味著通常可以輕鬆地用於商業和非商業應用程序。
所有寫作都是由4.0授權的CC,這意味著只要給出歸因,就可以使用它。