[译]Godot 引擎 GDNative 架构初探

 

PLUGINSCRIPT

PluginScript也是一个扩大,它吃Godot加入了包脚本语言实现之性状。对Godot而言,它是均等栽运行良好且全集成的脚本语言,但有逻辑都是于一个库中落实之。

NativeScript
把仓库都当作脚本用,而PluginScript是因此库来定义脚本。也就算是要在您的Godot项目面临上加有文本,就得补加相同种植新的脚本语言支持。

目前为止,这种“野生”的重点采用还单生一个 godot-python项目。

和ARVR扩展类似,PluginScript的API也是可怜小巧,仅发生一个急需调用的函数
godot_pluginscript_register_language。该函数接受一个struct作为参数,struct里带有函数指针及脚本语言的旁信息。

Godot编辑器重开后,就可知见效了。

2、邮件通知

计划

咱正计划创建更多的扩展,如可插拔式音视频解码器。

对GDNative当前底架构,我们就相当满意了,下一样步要是周文档和改良语言绑定。

经过前几乎首文章,jmeter+ant+jenkins自动化持续构建的测试平台基本成型。既然要自动化平台,最基本的肯定使实现不通过人工干预,平台会在特定的规则下自行运行测试脚本,并当剧本运行了晚,发送邮件通知用户测试的结果。本文主要介绍如何实现上述两宗功能。

NATIVESCRIPT

GDNative的初开发生涯里,它独自于计划用于脚本化编程,后来受发掘出又多利索和有效性的地方,脚本化编程能力现在一味是中间一个恢弘。

NativeScript 实现了平等效仿“脚本语言” –
在Godot中得如此让,但实际上是故GDNative库而未是如GDScript那样的文本及文件的款型来保存有关逻辑。

NativeScript会调用库中的一个函数 nativescript_init
告知Godot哪来类似以及方是可用之。在苟因此到那些看似与道的时节,NativeScript就能大简单的去调用这个库房来落实相应功能。

坐 NativeScript
仅针对仓开展操作,它并无关心这些库是因此啊语言构建的,如果开发者要为此好喜好的编程语言进行库底开,就使
NativeScript 成为 Godot
里的一样种极品选项,尽管以斯基础及还要交多拼命。

那想只要重灵敏且还如脚本的发吧,就相应考虑就此一下 PluginScript 了。

要就以上同等篇笔记中的“test_token”项目也例:

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的构建系统会变一个静态库,来包裹有的同名函数指针为静态函数。

(2)Extended E-mail Notification配置

jenkins首页->系统管理->系统布局页面

依照好其实用的邮箱进行布局,设置时,点击“高级”展开,使用SMTP认证(Use
SMTP Authentication):

冲邮箱服务提供商确定SMTP服务器,如:126之SMTP是smtp.126.com、163底SMTP是smtp.163.com

根据邮箱服务提供商确定是否采取SMTP认证、是否采取SSL协议以及SMTP端口

因邮箱服务提供商确定“Password”是邮箱的记名密码要专用于第三正值工具发邮件的验证码,如:QQ和163为验证码,126为记名密码

葡京国际平台 1

OK,邮箱服务的主干配备都就。

连片下的配置相当于是邮件通知的全局配置,对具体job来说,还会进行实际的布,如果在job中重新配置了此间相同的种类,就会见蒙这里的大局配置。

葡京国际平台 2

1)Default Content
Type:“text/plain”指邮件正文为纯文本格式,“text/html”指邮件内容可以蕴涵html标签都会给邮箱客户端对分析、显示。我此选择“text/html”。

2)Default
Subject:邮件标题,可以使系统中之大局邮件变量来安。我这边设置的题格式为:项目名称-BUILD#构建次数-构建状态。

3)勾选“Enable Debug Mode”,以开启Extended E-mail
Notification的调试功能,这样可以以构建日志中益又多和Extended E-mail
Notification相关的日记。

扩展

GDNative 扩展是同等种于库提供GDNative/Godot API
之外功能的法门。它们可不同方式采用,下面会列有几种时支持的花样的扩张。

恢宏通常含C语言API,可能还陪同着有由定义数据类型。Godot里一般有用于包裹那些和其它力量密切结合的C函数的C++类/方法。

每个扩展都来其和谐的子API结构,其中蕴含了版本信息及未来API修改信息的字段。

3、测试配置是否成功

构建触发器的日程表填一个顿时临近的光阴,等待任务自动执行并发送邮件。

邮件结果吧:

葡京国际平台 3

 

本章已经把定时任务以及邮件通知功能实现了,下一样回将会见指向拖欠平台开展些优化。

 

GDNATIVE

GDNative对象表示所载入的库,至于具体要加载哪个库就设起GDNativeLibrary资源文件中相当了,Godot环境下的C++代码可以去调动用该库中之函数。由于这种方式去调用函数太过灵活、底层且无安全,所以是勿建议从GDScript这些脚本语言中去调的。

假定真的想打脚本语言环境一直调用相应功能,可以为此GDNative.call_native方法来满足需求。对于这种函数指针调用的最底层细节,抽象出了千篇一律栽所谓的“调用类型”来进行描述。目前一味发生相同种预定义调用色:standard_varcall

  • 务求让调用的函数签名吗
    godot_variant function_name(godot_array *)。单例库可以按需要报新的调用类型。

(4)触发器配置

 决定什么状态下发送邮件。我安排为Always总是触发,接着send
to选择RecipientList,意思是每次构建无论成功吗还发送邮件及地方点名的收件人列表邮箱。葡京国际平台 4

特征标记

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来重新人性化的进行这种资源的概念跟编制。

葡京国际平台 5

它们会打上而下的指向有入口进行检测,并跨越了那些无在的表征标记。在拥有可用的号子中,第一个会为看成入口,所以排序很关键。

(1)Jenkins Location配置

jenkins首页->系统管理->系统布局页面

内Jenkins URL有默认值,最好修改,因为默认地址不安全。

系统管理员邮件地址一定要是写,因为是地点是邮件通知之发信人邮箱,填写方式发出少栽:

a)直接填邮箱地址

b)可以加前缀来标识该邮件基本信息,例如:自动化测试邮件<邮箱地址>

葡京国际平台 6

SINGLETON 库

GDNativeLibrary中生一个性是用以定义其是否支持单例形式利用的。单例库会于Godot启动期间尽量早地载入,且会调用库中之gdnative_singleton函数。这种库常用于需要提供以及Godot紧密结合的效益。

(3)Job中的邮件配置

jenkins首页->job”test_token”->配置->构建后操作

每当job中安排页面,选择增加构建后操作,选中Editable Email
Notification即可。

葡京国际平台 7

需要填的各个部署起参数说明:

1)Project Recipient List:这是一个以逗号(或者空格)分隔的收件人邮件的邮箱地址列表。

2)Default
Content:邮件内容,可以动用构建中之环境变量,使得邮件中形你想如果的消息。

完全内容如下:

葡京国际平台 8葡京国际平台 9

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset="UTF-8">
 5 <title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
 6 </head>
 7 
 8 <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
 9 offset="0">
10 <table width="95%" cellpadding="0" cellspacing="0"
11     style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
12     <tr>
13         <td>(本邮件是程序自动下发的,请勿回复!)</td>
14     </tr>
15     <tr>
16         <td><h2>
17                 <font color="#0000FF">构建结果 - ${BUILD_STATUS}</font>
18             </h2></td>
19     </tr>
20     <tr>
21         <td><br />
22         <b><font color="#0B610B">构建信息</font></b>
23         <hr size="2" width="100%" align="center" /></td>
24     </tr>
25     <tr>
26         <td>
27             <ul>
28                 <li>项目名称 : ${PROJECT_NAME}</li>
29                 <li>构建编号 : 第${BUILD_NUMBER}次构建</li>
30                 <li>触发原因 : ${CAUSE}</li>
31                 <li>构建日志 : 请查看附件</li>
32         <li>测试报告 : 请查看附件</li>
33                 <li>项目  Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
34             </ul>
35         </td>
36     </tr>
37     <tr>
38         <td><b><font color="#0B610B">Changes Since Last
39                     Successful Build:</font></b>
40         <hr size="2" width="100%" align="center" /></td>
41     </tr>
42     <tr>
43         <td>
44             <ul>
45                 <li>历史变更记录 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
46             </ul> ${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:<br />%c<br />",showPaths=true,changesFormat="<pre>[%a]<br />%m</pre>",pathFormat="    %p"}
47         </td>
48     </tr>
49 
50 </table>
51 </body>
52 
53 </html>

View Code

 3)Attachments:邮件的附件,我拿实行测试脚论生成的html测试报告文本,作为附件随邮件发出去。

专注:这里的写法可以运用通配符来确定文件之不二法门名称等,但是文件一定要是在workspace目录里面。

由自身前的job把测试报告放置在/usr/jmeter/apache-jmeter-3.3/TestReport/testToken/html路径下,所以现在一经修改一下测试报告输出的门道:

首先肯定workspace目录的路子:/var/lib/jenkins/workspace;

随后在workspace目录下创造存放测试报告的新文件夹:

/var/lib/jenkins/workspace/test_token/html

/var/lib/jenkins/workspace/test_token/jtl

最终修改/usr/jmeter/apache-jmeter-3.3/TestScrip目录中之test_token_build.xml文件,把内部测试报告的出口路径修改也新的门道即可。

拖欠参数文本框填写内容为html/*.html,意为以拖欠job的workspace路径下搜索html文件夹着所有以.html为后缀的文书,并将这些文件上加到邮件附件中。

ARVR

行使GDNative来兑现同种VR驱动的富有API可以参考文档: file。

当时套API的起点是 godot_arvr_register_interface
函数,它需要打一个单例库进行调用。那些要于Godot调用的函数则集体成一个组织为参数的款型传递过去。

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

1、构建触发器

葡京国际平台 10

构建触发器可以依据自己之需求选择,由图张有四种植档次:

(1)可运脚本触发远程构建;

(2)其他job构建完成后点时job执行构建;

(3)定时周期性构建;

(4)hookplugin检测及源码的push操作就接触构建;

(5)定时检查代码分支是否发转移,如果有转移则执行同一不好构建。

自之目的是做接口测试自动化,每天定时跑任务并监控API功能是否正规,所以选择Build
periodically(定期构建)。日程表一共五独参数:

从左到右分别代表:分 时 天 月 星期

首先单参数代表的是分钟minute,取值0~59;

其次独参数代表的是时hour,取值0~23;

老三单参数代表的是天day,取值1~31;

季独参数代表的凡月month,取值1~12;

第五单参数代表的凡星期week,取值0~7,0同7且代表星期天。

0 7 * * 1,3,5 代表每周一、周三、周五的7点00区划执行同一不良,*表示有。

葡京国际平台 11

GDNATIVELIBRARY

GDNativeLibrary是平等种植资源类型。它是对准每种平台所要的实在二进制文件的平栽浮泛:包含有性、“入口”库加载路径清单和“入口”库所依库底清单。

这些清单是同仿功能特色标记的大概映射形式 –
一般是一个文件路径;如果出负关系的口舌,就是一律组路径。

GDNative的架起极度早为“DLScript”的时节到目前为止已经产生了挺死的别。随着Godot
3.0本子接近最后揭晓暨API越来越稳定,是时候针对GDNative目前之样作一个概述了。

GDNATIVE/GODOT API

若是某库想调用Godot的片段效益,它便待去调动用Godot的代码。而各种C++编译器之间的移植性非常有题目,所以我们选取用C语言API的款式来封装对C++的调用。这被了多种语言访问API的可能,但也带动了有冗余性。