GameFromScratch · 游戏开发技术· 来源· Mike·· 3 小时前精选AI 评分78
Grit:Godot 实验性工具链可将 GDScript 编译为 C++
Grit – GDScript to C++ Compiler
推荐理由
Grit 提供将 GDScript 编译为 C++ 的机制,性能提升显著且兼容现有项目。
正文 · AI 翻译
GDScript 的一个缺点是性能较差,尤其是与 C# 和 C++ 相比。Grit 是一个新的实验性工具链,有望解决 GDScript 的性能问题。如何实现?它将游戏的 GDScript 代码编译为 C++,然后再将 C++ 编译为本机代码。结果——性能提升幅度从 1.1 倍到 50 倍不等,具体取决于转换的代码。Grit 无需对项目或 GDScript 进行任何更改,它完全在游戏可执行文件构建时发生。Grit 本质上与 Unity 的 IL2CPP 相同,但它不是将中间语言输出转换为 C++,而是将 GDScript 转换为 C++。
Grit 的功能:
- 广泛的 GDScript 覆盖范围:Godot 自身的 GDScript 测试套件中的所有 1540 个函数都能编译为原生代码,并且在以原生模式运行时,所有 499 个测试断言均通过。
- 非装箱值:类型化的
int、float和bool,以及像Vector2、Color、String或Transform3D这样的值类型直接存储在普通的 C++ 变量中,而不是存放在Variant里。 - 直接引擎调用:虚拟机在编译时验证的操作会直接调用 Godot 的指针 API。当 Grit 能够证明它们正是引擎所使用的实现时,引擎运算符、成员访问器和构造函数会被内联。
- 直接脚本调用:同一脚本文件中的函数之间的调用会跳过引擎的分发机制,直接跳转到原生函数,并保留与虚拟机相同的重写检查、对象锁和递归检查。
- 引擎属性:读取和写入诸如
position或node.rotation之类的属性时,会直接使用未装箱值调用引擎的 getter 或 setter。诸如sprite.texture之类的对象属性在读取以及写入时(当已知赋值值的类型匹配时)也会跳过通用查找。每个访问点都会按类缓存已解析的访问器,而使用_get、_set或同名成员拦截属性的脚本所对应的对象,会保持虚拟机行为。 - 脚本成员:读取和写入其他脚本实例的成员变量(例如
enemy.health),只要不涉及 getter、setter 或类型转换,就会直接访问该实例的成员存储。 - 脚本剥离:可选择地从导出的脚本中移除原生编译函数的代码。
- 内置脚本:嵌入在场景和资源中的脚本也会被编译,而不仅仅是
.gd文件。 - 容器:为
Array、紧凑数组和Dictionary提供快速的元素访问,并具有与虚拟机相同的边界检查和类型检查。 - 完整的语言支持:包括带捕获和
self的 lambda 表达式、await和协程、信号、内部类、静态函数和变量、默认参数以及可变参数。 - 相同的行为:运行时错误、其消息以及整数溢出或除以零等边缘情况的行为与虚拟机中一致。
- 调试:原生函数会出现在脚本回溯中,
print_stack()和get_stack()显示正确的行号。 - 安全回退:不支持的函数、编辑过的脚本或签名不匹配的情况会静默使用虚拟机,按函数级别处理。
关键链接
您可以在下方的 视频 中了解更多关于 Grit 的信息并观看其实际演示。这是一个高度实验性的项目,显然不应在生产环境中使用。
来源:GameFromScratch · 游戏开发技术 · gamefromscratch.com
