[译]Godot 引擎 GDNative 架构初探

图片 1

GDNative的架构从最早叫“DLScript”的时候到近期截至已经发出了十分大的转变。随着Godot
3.0本子接近最后公告以及API越来越稳定,是时候对GDNative近来的样子作多少个概述了。

GDNATIVELIBRARY

GDNativeLibrary是一种能源类型。它是对每一个平台所需的骨子里二进制文件的一种浮泛:包涵部分本性、“入口”库加载路径清单及“入口”库所依靠库的清单。

那一个清单是一套功用特色标记的粗略映射方式 –
一般是三个文件路径;要是有依靠关系的话,正是一组路径。

特色标记

Godot有一套性子标记系统。本性标记表示全体相应的一定的性质或效益,例如Windows,
X11, 32, 64,
mobile等等。在导出行戏时,你也足以自行定义标记,从而恐怕改变游戏的运行方式。

更多关于特性标记的新闻,能够去http://docs.godotengine.org/en/latest/learning/workflow/export/feature\_tags.html查看。

GDNativeLibrary财富中的列表由键值对方式结合,键中依据供给能够涵盖八本天性标记,以英文句点“.”分隔。

比如七个支撑六十一个人Linux机器的库,它的键名即“X11.64”,借使对应的是Windows的机械,则键名为“Windows.64”。

Godot编辑器提供了GUI来更人性化的进展那种财富的概念和编写制定。

图片 2

它会从上而下的对拥有入口实行检查和测试,并跳过那些不设有的脾性标记。在有着可用的号子中,第八个会被看做入口,所以排序很重点。

SINGLETON 库

GDNativeLibrary中有多个性情是用于定义其是还是不是支持单例情势利用的。单例库会在Godot运行时期尽量早地载入,且会调用库中的gdnative_singleton函数。那种库常用于需求提供与Godot紧凑结合的机能。

GDNATIVE

GDNative对象表示所载入的库,至于实际要加载哪个库就要从GDNativeLibrary能源文件中十二分了,Godot环境下的C++代码能够去调用该库中的函数。由于那种方法去调用函数太过灵敏、底层且不安全,所以是不建议从GDScript那么些脚本语言中去调的。

若是真想从脚本语言环境一向调用相应功效,能够用GDNative.call_native方法来满意供给。对于那种函数指针调用的底部细节,抽象出了一种所谓的“调用类型”来开始展览描述。近年来仅有一种预订义调用项目:standard_varcall

  • 必要被调用的函数签名为
    godot_variant function_name(godot_array *)。单例库能够按需注册新的调用类型。

GDNATIVE/GODOT API

借使有些库想调用Godot的片段效益,它就须要去调用Godot的代码。而各类C++编写翻译器之间的移植性非凡有标题,所以大家选用用C语言API的样式来封装对C++的调用。那开启了多样语言访问API的恐怕性,但也拉动了有的冗余性。

API 结构

贰个库为了访问那么些用C封装的函数,它首先要明了那多少个函数的岗位。最直接的想法是留空,然后让操作系统的库加载机制来拍卖。

噩运的是,那种艺术无法在拥有平台平常运转(此处Windows只怕要窘迫的咳两声),所以为了保险在全体平台安装GDNative库用平等的代码和手续,大家决定使用另一种途径:在加载函数时,以函数指针结构(struct)的款式传递。

该组织存在于Godot中,并涵盖版本音信、以往的API改动字段及扩张API列表。

struct godot_gdnative_api_struct {
    unsigned int type;
    godot_gdnative_api_version version;
    const godot_gdnative_api_struct *next;
};

struct godot_gdnative_core_api_struct {
    unsigned int type;
    godot_gdnative_api_version version;
    const godot_gdnative_api_struct *next;
    unsigned int num_extensions;
const godot_gdnative_api_struct **extensions;
    // ...
};

库能够从那种struct中访问所需的函数,也就代表不再是编写
godot_some_function();这种样式了,而是api->godot_some_function();

稍加人欢乐简单的经过函数名而不是struct来走访函数,所以在有需求时,Godot的创设系统会生成三个静态库,来包裹全体的同名函数指针为静态函数。

扩展

GDNative 扩大是一种给库提供GDNative/Godot API
之外作用的章程。它们得以差异情势采纳,下边会列出三种当前辅助的形式的扩大。

推而广之日常带有C语言API,或许还陪同着有自定义数据类型。Godot里常见有用于包裹那四个和别的效用密切结合的C函数的C++类/方法。

各种扩展都有它和谐的子API结构,当中包含了版本消息及今后API修改音信的字段。

ARVR

行使GDNative来完成一种V奔驰G级驱动的全部API能够参见文书档案: file。

那套API的起源是 godot_arvr_register_interface
函数,它须求从贰个单例库进行调用。那个要被Godot调用的函数则集体成一个构造以参数的花样传递过去。

目前有 null-driver 的实现、 OpenVR 的实现 和 WIP OpenHMD 的实现。

NATIVESCRIPT

GDNative的早先时期开产生涯里,它仅被铺排用于脚本化编制程序,后来被发掘出更Dolly索和实用的地点,脚本化编程能力未来唯有是在这之中三个恢宏。

NativeScript 实现了一套“脚本语言” –
在Godot中得以那样叫,但实则是用GDNative库而不是像GDScript那样的文本和文件的样式来保存有关逻辑。

NativeScript会调用库中的一个函数 nativescript_init
告知Godot哪些类和格局是可用的。在要用到那一个类和格局的时候,NativeScript就能很不难的去调用这一个库来促成相应作用。

因为 NativeScript
仅对库实行操作,它并不关注这么些库是用什么语言创设的,倘若开发者要用本人喜好的编制程序语言进行库的付出,就使得
NativeScript 成为 Godot
里的一种一级选拔,固然在那么些基础上还要付出良多奋力。

那想要更灵活且更像脚本的痛感的话,就应有考虑用一下 PluginScript 了。

PLUGINSCRIPT

PluginScript也是一个扩大,它给Godot参与了封装脚本语言达成的特点。对Godot而言,它是一种运维优异且完全集成的脚本语言,但具备逻辑都以在多少个库中落到实处的。

NativeScript
把库都当作脚本用,而PluginScript是用库来定义脚本。也便是一旦在你的Godot项目中添加一些文本,就足以添加一种新的脚本语言帮助。

近来截至,那种“野生”的根本运用还唯有叁个 godot-python项目。

与A途观V奥德赛扩大类似,PluginScript的API也是丰富小巧,仅有二个索要调用的函数
godot_pluginscript_register_language。该函数接受四个struct作为参数,struct里富含函数指针及脚本语言的任何音信。

Godot编辑注重启后,就能卓有成效了。

计划

我们正在安插创建更加多的扩张,如可插拔式音录制解码器。

对于GDNative当前的架构,我们已经万分令人知足了,下一步关键是健全文书档案和改正语言绑定。