跳到正文
GameFromScratch · 游戏开发技术· 来源· Mike·· 3 小时前精选AI 评分78

Grit:Godot 实验性工具链可将 GDScript 编译为 C++

Grit – GDScript to C++ Compiler

推荐理由

Grit 提供将 GDScript 编译为 C++ 的机制,性能提升显著且兼容现有项目。

正文 · AI 翻译

GameFromScratch.com

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 GitHub 仓库

来自视频的 Spritebench 基准测试

关于 Grit 创建的作者讨论帖

您可以在下方的 视频 中了解更多关于 Grit 的信息并观看其实际演示。这是一个高度实验性的项目,显然不应在生产环境中使用。

来源:GameFromScratch · 游戏开发技术 · gamefromscratch.com