[译]Godot 引擎 GDNative 架构初探

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来又人性化的展开这种资源的定义跟编制。

她会打上而下的对准持有入口进行检测,并跳了那些未在的性状标记。在具备可用之符中,第一个会被当入口,所以排序很重点。

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编辑器重开后,就会奏效了。

计划

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

对此GDNative当前底架构,我们曾经相当令人满意了,下同样步要是无微不至文档和改进语言绑定。