GDNative 是什么?

前言

GDNative 是 Godot 专有的技术,可以让引擎在运行时与原生共享库 <https://zh.wikipedia.org/zh-cn/%E5%87%BD%E5%BC%8F%E5%BA%AB#%E5%85%B1%E4%BA%AB%E5%BA%93>交互。你可以用它来运行原生代码,无需和引擎一同编译。

备注

GDNative 不是脚本语言,与 GDScript 无关。

GDNative 与 C++ 模块的区别

GDNative 和 C++ 模块都可以用于在 Godot 项目中执行 C 或 C++ 代码。

它们都可以用来将第三方库集成进 Godot。选用哪一个取决于你的需求。

GDNative 的优势

与模块不同,GDNative 不需要编译引擎的源码,可以使你的作品更易于分发。它可以让你访问 GDScript、C# 使用的大多数 API,让你在编写游戏逻辑时能够完全控制性能。这是你在素材库中以插件形式分发高性能代码的理想选择。

并且:

  • GDNative 并不仅限于 C 和 C++。得益于第三方绑定,你也可以在很多其他语言中使用。

  • 你可以在编辑器和导出项目中使用相同的编译后的 GDNative 库。而对于 C++ 模块,如果你想在运行时使用相关功能,就必须重新编译所有想要使用的导出模板。

  • GDNative 只需编译你自己的库,而不是整个引擎。C++ 模块则与此不同,是会静态编译进引擎的。每修改一次模块,你就需要重新编译一次引擎。即使使用增量构建,这一过程也比 GDNative 要慢。

C++ 模块的优势

如果 GDNative 无法满足要求,我们推荐使用 C++ 模块

  • C++ 模块与引擎的集成更加紧密。GDNative 仅限于访问脚本所暴露的 API。

  • 使用 C++ 模块为项目提供额外功能,就可以免去携带原生库文件的麻烦。同样也适用于导出的项目。

  • 所有平台都支持 C++ 模块。而 HTML5 和通用 Windows 平台(UWP)则尚不支持 GDNative。

  • C++ 模块比 GDNative 要快,尤其是在代码需要通过脚本 API 做大量通信的情况下。

支持的语言

Godot 开发者官方支持以下 GDNative 语言绑定:

备注

没有官方支持更多 GDNative 语言的计划。不过社区提供了不少其他语言的绑定(见下文)。

以下绑定是由社区开发并维护的:

备注

这里列出的绑定并不都能用于生产。请在新项目中使用前先做足调查。同时,请确定该绑定与你所使用的 Godot 版本兼容。

版本兼容性

与 Godot 本身不同,GDNative 对版本兼容性的要求更严格,因为它依赖于底层的 ptrcall 来调用函数。

为特定版本 Godot 编译的 GDNative 插件只保证能够在相同次要版本上可用。例如,为 Godot 3.4 版本编译的 GDNative 插件只能用于 Godot 3.4、3.4.1、3.4.2……无法用于 Godot 3.3 或 3.5。