一个库,允许在本机代码中编写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,这意味着只要给出归因,就可以使用它。