[译]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资源被的列表由键值对形式组成,键中根据需要好分包多独特色标记,以英文句点“.”分隔。

比如一个支撑64个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来落实同种VR驱动之有着API可以参考文档: file。

眼看套API的起点是 godot_arvr_register_interface
函数,它需打一个单例库进行调用。那些要让Godot调用的函数则集体成一个布局为参数的形式传递过去。

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

NATIVESCRIPT

GDNative的初期开发生涯里,它不过让计划用于脚本化编程,后来给发掘出又多活和有效性的地方,脚本化编程能力现在就是里一个恢弘。

NativeScript 实现了同等学“脚本语言” –
在Godot中得这么让,但其实是因此GDNative库而未是如GDScript那样的文书和文件的样式来保存有关逻辑。

NativeScript会调用库中之一个函数 nativescript_init
告知Godot哪头类似及章程是可用之。在如因此到那些看似和法的上,NativeScript就能挺简单的去调用这个库房来促成相应功能。

坐 NativeScript
仅针对仓进行操作,它并无体贴这些库是因此什么语言构建的,如果开发者要为此好喜好的编程语言进行库底开发,就令
NativeScript 成为 Godot
里的同等种极品选项,尽管以是基础及还要交多拼命。

那想如果重灵敏且还像脚本的发吧,就该考虑用一下 PluginScript 了。

PLUGINSCRIPT

PluginScript也是一个扩张,它于Godot加入了打包脚本语言实现的表征。对Godot而言,它是一律种运行良好且完全集成的脚本语言,但拥有逻辑都是当一个仓房中实现之。

NativeScript
把库房都当作脚本用,而PluginScript是用库来定义脚本。也便是只要在你的Godot项目受到上加有文书,就可补充加相同栽新的脚本语言支持。

目前为止,这种“野生”的要行使还仅出一个 godot-python项目。

以及ARVR扩展类似,PluginScript的API也是格外精细,仅发生一个欲调用的函数
godot_pluginscript_register_language。该函数接受一个struct作为参数,struct里富含函数指针及脚本语言的任何信息。

Godot编辑器重开后,就能奏效了。

计划

咱们在计划创建更多之壮大,如只是插拔式音视频解码器。

对GDNative当前的架,我们已经相当令人满意了,下一样步要是完善文档和改良语言绑定。