首页> 中国专利> 用于生成C/C++库与解释语言之间的绑定的方法,并且执行所述方法以转换三维(3D)模型

用于生成C/C++库与解释语言之间的绑定的方法,并且执行所述方法以转换三维(3D)模型

摘要

本发明涉及用于在C/C++库(A)与一种或更多种解释高级语言之间生成绑定以便将所述C/C++库的功能暴露给这种或这些高级语言的方法,所述方法涉及以下步骤:以高级语言的形式编写绑定的定义(C)的步骤,处理该定义以产生绑定元素的步骤,围绕高级语言中的每一种对绑定元素进行分组以便产生C++绑定代码(D)的步骤,以及编译所述C++代码(D)并且将其链接至C/C++库(A)的步骤。这特别地可以用于实现用于陆地、空中或海上移动设备的人机接口。

著录项

  • 公开/公告号CN113168312A

    专利类型发明专利

  • 公开/公告日2021-07-23

    原文格式PDF

  • 申请/专利权人 摩维达产品公司;

    申请/专利号CN201980078783.6

  • 申请日2019-10-04

  • 分类号G06F8/54(20180101);G06F9/445(20180101);G06F9/448(20180101);

  • 代理机构11227 北京集佳知识产权代理有限公司;

  • 代理人高岩;卫三娟

  • 地址 法国奥尔良

  • 入库时间 2023-06-19 11:55:48

说明书

技术领域

本发明涉及用于在C/C++库与解释语言之间生成绑定的方法。

本发明还涉及执行用于生成绑定的所述方法,以便转换三维(3D) 模型,特别地能够被嵌入到移动装置的人机接口中。

本发明的领域是人机接口的领域,并且更具体地是嵌入陆地、空中或海上移动系统中的人机接口的领域。

背景技术

绑定生成器是可以有效地实现C/C++库与解释语言之间的绑定的工具。绑定的问题在于赋予从高级语言(Python、Java、C#、Haskell等)对低级语言(C++)的功能/性能对的访问。

一般地,高级语言的性能低于低级语言。高级语言速度较慢并且/或者占用更多内存。相比之下,高级语言使开发者免于执行许多任务,包括内存管理,特别地创建对象和销毁对象。

高级语言的可访问性要高得多。它们可以更快地实现功能结果,这向它们赋予了在快速原型阶段的理想地位。然而,性能问题将它们排除在工业化阶段之外。因此,需要同时具备C++的性能和高级语言的可访问性。

这个问题是在项目管理中特别地在人机接口的设计过程中遇到的,这需要使用低级语言的硬件工程师和使用高级语言的业务专家的共同贡献。困难在于组织一种方法,这种方法是随着技能冲突而变化的技能的综合。

特别地,在具有3D内容的交互式应用的产生中,主要问题之一是将源自CAO应用的3D模型“翻译”(转换)成开发该应用的3D引擎的专有格式。这项复杂的任务在上述技能的交集处发现。业务专家具有要实现的功能和美学目标的知识,但他们的技术参数不允许他们在工业化方面采取行动。另一方面,低级工程师具有在工业平台上处理和显示3D数据的技术技能,但是不具有符合业务专家的目标的3D数据的转换/翻译所需的知识。因此,这些技能之间存在差距,其阻碍了符合功能和美学目标以及工业硬件强加的技术规范的人机接口的实现。

转换/翻译总是带来信息的丢失,并且3D CAO模型不包含3D渲染 (rendering)所需的“材料”属性。

用于克服上述差距的权宜之计在于一旦执行了翻译就进行调整。这是解决方案(例如Unreal引擎和Unity 3D)选择的方法,其包括特别地在接近项目结束时积累人类手段和劳动力。即使承认这种做法在娱乐行业有作用,但是该做法不适合工业行业。

因此,应当注意,不存在用于实现高级语言与低级语言之间的绑定的解决方案,并且因此,不存在用于可以综合工业HMI项目内的多学科组的解决方案。

此外,目前特别地由机动车辆制造商表达的对人机工程学、高效和高度动态的人机接口(HMI)的需求很高。

在现有技术中,SWIG是可以生成这种“绑定”的程序。它是开源的,免费访问的,并且可以将用C/C++编写的程序链接至各种“高级”编程语言。目标语言包括常规的脚本语言,例如Javascript、Perl、PHP、Python、 Tel和Ruby。SWIG承受着太大的技术债务,以及对所支持的目标语言的不平等对待。因此,情况通常是,仅在一些目标语言中支持期望的功能,而有时不支持所述功能,这对于在用于对3D模型进行成型的自动化处理中集成专家脚本构成了显著的障碍。

此外,如果建议整体自动化绑定的生成,则在实践中发现使用SWIG 的项目需要开发者的明确干预,以便纠正自动生成的非功能代码。因此,当为纠正不正确的生成代码而编写的代码量远远大于达到绑定的预期功能级别所合理预期的代码量时,得到了矛盾情况(paradox)。

此外,在由多学科团队执行的项目的背景下,业务专家对清晰和综合的文档的访问是用于实现目标的绝对条件。自从2.0版出现后,SWIG就不再提供这个功能了。如果所生成的绑定提供了从高级语言对低级功能的访问,那么业务专家和用于产生高级代码的能力对于所呈现的API不具有文档和参考支持。

文献US5083262A描述了一种用于图形功能的语言绑定方法,其目的是允许在不同的处理环境中使用一个应用程序。

在用特定编程语言编写的高级图形应用程序之间建立到语言的特定绑定可以在不同图形处理系统之间传输图形应用程序并在不同图形处理系统中使用图形应用程序。仅一个可移植的图形应用程序可以与应用语言绑定已经建立的任何图形处理器一起使用,以在输出外设上产生图形。

文献CN101814024A公开了一种用于多平台3D接口的设计工具,该设计工具主要用于开发大屏幕交互式3D人机接口。该工具包括能够以多平台方式调用系统功能的系统内核,其中,该内核对当前公共平台的主要功能进行处理,并且可以执行自我测试以识别不同开发系统的系统功能之间的差异。

SWIG技术传统与其对C++功能的零散支持的结合使得确保其开发和维护极其复杂和昂贵。SWIG的少数软件替代通常只关注一种单独的目标语言,而在支持的C++功能方面比SWIG要受限得多。

此外,随着新的C++标准(C++11)的出现,新的语言构造没有被SWIG 特别地支持或不被SWIG支持,并且新的C++功能的多种使用配置没有被 SWIG正确地支持。

在没有解决方案的情况下,在大量的人机接口设计和开发中心中,由 CAD工具生成的3D模型的代码被重写,以便能够将其嵌入到移动平台。使用从CAD环境继承的特定格式来存储适用于嵌入的限制的3D数据,这带来了克服嵌入式环境的限制的通用性和灵活性的问题。

D.M.Beazley在综述Future Generations Computer Systems 19(2003) 第599-609页中的文献“Automated scientific software scripting with SWIW”公开了一种用于在C/C++库与一种或更多种解释高级语言之间生成绑定以将所述C/C++库的功能呈现给所述解释语言的方法,该方法包括以高级语言的形式编写所述绑定的定义的步骤、处理所述定义以产生绑定元素的步骤以及编译C++代码并将其链接至C/C++库的步骤。

P.Fernique等人的文献“AutoWIG:Automatic Generation of Python Bindingsfor C++Libraries”XP080950591公开了一种用于C++库的自动绑定生成方法。

本发明的目的是提出一种绑定生成方法,该方法可以结合3D C++库的性能和嵌入材料上的高级语言的灵活性。

发明内容

这个目的是通过一种用于在C/C++库(A)与一种或更多种高级解释语言的软件环境之间生成绑定以将所述C/C++库的功能呈现给所述解释语言的方法来实现的,所述方法包括由计算机实现的以下步骤:

-处理所述绑定的定义(C)以产生绑定元素的步骤,所述定义先前已经用高级语言编写并且包括函数列表,

-生成暴露给所述高级语言的绑定元素列表以产生暴露给所述高级语言的C++函数组的步骤,

-编译所述C++代码(D)并链接至所述C/C++库(A)的步骤,其特征在于,生成绑定的步骤还被配置成使得C/C++库能够调用用高级语言编写的函数(回调),以扩展C/C++库的功能。

绑定的定义还可以包括函数列表、用于所述函数的预期参数和返回值。

在本发明的特定变体中,定义处理的步骤包括在以下之间分配处理:

-所述高级语言[B]中的每一种高级语言的功能,

-C++语言的功能,绑定以透明的方式支持这些功能,并且能够用高级语言对这些功能进行访问。

根据本发明的绑定方法还可以有利地包括将附加至C/C++库(A)的文档作为目标高级语言(B2)进行处理并生成XML文件的步骤。

所述方法还可以包括:在编译步骤之后,获得对C/C++库(A)和源自编译步骤的从C++代码(A)编译的接口层进行集成的动态库(E),以及被提供用于将高级解释语言直接嵌入到源自编译步骤的C++代码中的静态库(E)。

根据本发明的另一方面,提出了一种计算模块,所述计算模块实现根据前述权利要求中任一项所述的绑定方法,利用C/C++库(A)和一种或更多种高级解释语言进行操作,以将所述C/C++库的功能呈现给所述解释语言,所述模块包括:

-用于处理所述绑定的定义以产生绑定元素的装置,所述定义优选地用高级语言编写并且包括函数列表,

-用于将所述绑定元素朝向所述高级语言中的每一种汇编以产生C++绑定代码(D)的装置,

-用于生成暴露给所述高级语言的绑定元素列表以产生暴露给所述高级语言的C++函数组的装置,

-用于编译所述C++代码(D)并链接至所述C/C++库(A)的装置。

根据本发明,用于生成绑定的装置还被配置成使得所述C/C++库能够调用用高级语言编写的函数(回调),以扩展所述C/C++库的功能。

根据本发明的又一方面,提出了根据本发明的绑定方法在如下方法中的实现,所述方法用于转换源自C/C++库(A)的3D模块以能够被嵌入用高级语言(B)编写“业务”应用的设备的项目中,导入动态库(E),并且经由所述动态库(E)访问所述C/C++库(A)的功能。

根据本发明的绑定方法的所述实现特别地可以涉及将源自C/C++库 (A)的3D模型转换成能够嵌入移动系统内的设备中的3D模型。

在根据本发明的绑定方法中,基于每个项目的要求来实现翻译规则,以便一旦3D模型在3D引擎中切换,翻译就应当自动给出最佳结果。为了让本领域技术人员(“图形设计者/集成者”)能够访问这些规则,必须用C++实现这些规则是不可想象的。

根据本发明的绑定方法可以特别考虑语言Lua,其是3D模型的设计者所熟知的自由脚本语言,这使得可以用Lua编写翻译规则。

利用根据本发明的绑定生成器,以容易地将Lua语言集成到用于转换 3个模型的系统的所有工具中。

因此,根据本发明的绑定方法为开发者提供了以简单的方式描述他所需要的“高级”接口的可能性,并且负责C++绑定代码的自动产生以及资源管理机制。

根据本发明的生成器方法为负责绑定的开发者提供了逐语言地实现目标语言的功能的可能性。开发者因此指定了显式呈现的内容,不像SWIG 那样试图隐式呈现一切但失败了。

仅用一种描述,根据本发明的绑定生成器自动产生到支持的语言的所有绑定。因此,增加语言的支持对所有已经链接的项目都是有益的。

业务应用从一种目标语言到另一种目标语言的翻译是准直接和自动的,由绑定生成器生成的API(“应用编程接口”)是严格相同的。

文档被视为完整的目标语言。

根据本发明的绑定生成器处理C++类型(STD和STL)的转换,并且提供对最新C++的功能的访问。这个生成器可以在目标语言的调试器中呈现特定于库的对象的类型。

在高级语言中,所有数据都用相关联的元数据封装。为了随机存取存储器的占用效率,这些语言提供了将数据直接存储在元数据中的可能性。根据本发明的绑定生成器使得可以访问该机制。由此获得的直接好处是性能、内存空间和复杂性的提高(例如:整数、浮点数、向量等)。

希望能够从Python或Lua调用C++函数,但也希望能够从C++调用 Python或Lua函数。根据本发明的生成器在所有支持的语言中一致地实现该机制。它为本领域技术人员提供了扩展C++功能而不必知道其实现细节的可能性。

通过举例的方式,可以引用对图像的光学影响的实现,其需要直接插入在图像渲染流水线的中心处的能力,具有终结器模块的回调和来自实时物理引擎的回调。生成的绑定可以经由动态库(DLL)或静态库(集成的或二进制)使用。

例如,这种灵活性可以将Lua语言集成到用于显示和操纵3D模型的库中,而对内存性能或占用没有任何影响,并且导致能够将Lua导入Lua 的明显矛盾情况,这有助于向非C++开发者提供多核能力。同样,所有 Python开发者都可以访问Lua。

附图说明

本发明的其他优点和特征将通过阅读决非限制性的实现方式和实施方式的详细描述以及附图而显现出来:

-图1是根据本发明的绑定生成器的实施方式的概要图;

-图2示意性地示出了执行根据本发明的绑定方法的终结器处理;

-图3示意性地示出了执行根据本发明的绑定方法的业务应用;

-图4是执行根据本发明的绑定方法的整体转换处理的概要图;

-图5示意性地示出了实现根据本发明的绑定方法的嵌入式图形引擎;以及

-图6示出了在多用户配置中根据本发明的绑定方法的特定实施方式。

具体实施方式

由于这些实施方式决非限制性的,因此可以特别地设想本发明的变型,所述变型仅包括以与描述或示出的其他特征隔离的方式对下文中描述或示出的特征的选择(即使该选择是在包括所述其他特征的阶段内隔离的),如果所述特征的选择足以提供技术优势或者足以将本发明与现有技术区分开来的话。该选择包括至少一个特征,所述特征优选地是功能性的而不具有结构细节,和/或具有一些结构细节,如果该部分本身足以提供技术优势或者足以将本发明与现有技术区分开来的话。

现在将参照图1描述根据本发明的用于生成绑定的方法的实施方式。

步骤1:根据本发明的绑定生成器的用户拥有第三C或C++库[A],用户希望将其功能呈现给例如Python、Lua或C#的语言[B]。

用户使用绑定生成器的API(本身是用Python编写的)以Python程序[C]的形式编写绑定的定义,该API通过函数列表以及它们的预期参数和返回值将库[A]的API描述为它必须呈现给高级语言的开发者。

步骤2:由绑定生成器处理不依赖于高级语言的任何特定性的绑定定义[C],这在以下之间分配处理:

-每种高级语言[B]的功能(数据管理、其生命周期、C++与高级语言之间的数据传递、特定范例);

-C++的功能,绑定以透明的方式支持这些功能,并且可以用高级语言 (STL/STD类型)对这些功能进行访问。

并行地,将文档作为目标高级语言[B2]进行处理并生成XML文件。

步骤3:绑定生成器的最后一步是将绑定元素朝向每种高级语言汇编,以产生C++绑定代码[D]。步骤4:在生成器的输出端处产生的C++代码[D] 被设计成被编译并链接至第三库,该第三库的功能被呈现。

并行地,绑定符号的列表可以通过步骤1中编制的文档来增加,因此产生比Doxygen文档更易于访问的可理解的参考,Doxygen文档是自动生成的C++文档的现有技术。

步骤5:[D]的编译结果可选地是:

-动态库[E]。库[E]集成了库[A]以及从[D]编译的接口层。

-用于直接将Python/Lua等嵌入最终的C++程序中的静态库。

最后一步是使用所述绑定。用户用语言[B]编写“业务”应用,导入动态库[E],并且经由所述动态库访问库[A]的功能。

根据本发明的绑定生成器为负责绑定的开发者提供了逐语言地实现目标语言的功能的可能性。开发者指定显式呈现的内容,不像SWIG那样试图隐式呈现一切但失败了。

仅用一种描述,根据本发明的绑定生成器自动产生到支持的语言的所有绑定。因此,增加语言的支持对所有已经链接的项目都是有益的。

业务应用从一种目标语言到另一种目标语言的翻译实际上是直接的和自动的,由绑定生成器生成的API是严格相同的,这进一步增加了用 C++开发的项目的可移植性,在项目开始时选择的目标语言不再是阻碍的方面。

此外,根据本发明的绑定生成器处理C++类型(STD和STL)的转换,并且提供对最新C++的功能的访问。该生成器可以在目标语言的调试器中呈现特定于库的对象的类型。

生成的绑定可以经由动态库(DLL)或静态库(集成的或二进制)使用。例如,这种灵活性可以将Lua集成到3D模型的库中,而不会对性能或占用的内存产生任何影响。

现在将参照图2描述在涉及“终结器”模块的模型转换处理中执行绑定操作的方式。

1.源自C/C++库的3D模型的翻译自动调用终结器模块。借助于回调系统,与翻译并行运行的解释器调用由本领域技术人员逐个项目地实现的函数组,并且该解释器详细说明要进行的转换,以便由嵌入式设备发送的 3D模型符合设计者的期望。

2.如果终结器模块已经接收到干预3D模型的转换的指令,则它有可能修改3D模型的形态、其密度、其方向等。所有这些转换都必须旨在使 3D模型兼容并针对嵌入式设备进行优化。这种修改是经由导致一系列指令要由解释器执行的回调进行的。

3.如果终结器收到了干预材料的转换的指令,它有可能完全重新定义它们,分解它们,为它们分配转换图像流的处理、光和材料算法(或着色器),目的是使数据兼容并针对嵌入式设备进行优化。这种修改是经由导致一系列指令要由解释器执行的回调进行的。

4.终结器模块被调用的次数与由3D开发工具以高级语言处理3D模型或材料的次数相同。

5.在存储3D模型时,终结器模块可以选择最适合于嵌入式设备的格式(二进制、XML、Json等)。

现在将参照图3描述根据本发明的绑定方法在将源自开发工具的3D 模型转换成嵌入在设置有人机接口的设备中的模型的转换处理中实现的方式。

1.考虑由设计者设计并由3D开发工具处理以使得其可以被嵌入的人机接口,

2.业务应用向嵌入式设备的用户提供业务功能,

3.解释语言的解释器使业务应用运行并利用C++库的功能,

4.C++库经由API呈现3D、视频和音频功能,

5.3D图形驱动器经由API(OpenGL)呈现图形处理单元(GPU)的能力,并且将给出的指令转换成GPU图元(primitive),

6.3D图形处理单元GPU对图元进行处理并将它们转换成视频信号, 7.嵌入式设备的屏幕显示由GPU传输的视频信号,并且因此显示HMI (1)。

现在将参照图4描述根据本发明的用于生成绑定的方法在设计、生产和操作的不同阶段中所发挥的作用。

在计算机或嵌入式设备上执行的设计阶段中,直接源自CAD(或 CAO)工具的3D模型(A)被操纵。

在也是在计算机或嵌入式设备上执行的生产阶段中,3D模型在FXB 转换器的输入端处提交,该FXB转换器包括用C++编写的程序,并且集成了终结器模块、Lua绑定模块和Lua虚拟机。终结器模块执行转换规则。 FXB转换器的结果是3D生产数据,包括模型、“着色器”类型的算法、图像和视频。这些结果可以经由用户脚本和插件模块来访问。它们在可视化3D开发工具的输入应用,该3D开发工具包括用C++编写的程序,并且包括Lua绑定模块和Lua虚拟机(VM)。C++的这个程序由Lua绑定程序控制。在这个C++程序的输出处,可以获得优化的3D数据,这些数据适用于优化的嵌入式3D平台。

现在将参照图5描述执行根据本发明的绑定方法的嵌入式引擎的结构的示例。所述嵌入式引擎在输入端处接收业务应用。所述嵌入式引擎包括Lua虚拟机,所述Lua虚拟机的可交付结果嵌入在虚拟机VM中,虚拟机VM的输出连接在Lua绑定模块的输入处,Lua绑定模块为专用的C++ 核提供输入。所述C++核生成3D渲染系统、物理系统和脚本系统。

所述嵌入式模块还包含虚拟机组VM1-4,所述虚拟机组VM1-4中的一些与用户任务相关联。这些虚拟机也连接至Lua绑定模块。

参照图6,根据本发明的绑定方法可以在多平台和多用途环境中执行:

根据本发明的绑定方法可以嵌入在车辆或智能手机中。在这种使用的情况下,使用API C+,以及业务应用用C++实现。然而,由于绑定,3D 开发工具仍然集成了Lua虚拟机,所述Lua虚拟机可以执行通常用于导致视觉元素移动的微脚本(或者实际上更复杂的脚本)。

a.智能手机

以密集方式使用3D实时或与其他元素混合的应用,例如以增强现实查看3D对象。

b.机动车辆

以密集方式使用3D实时以替换设备的全部或一些物理项目(信息娱乐、集群等)的应用。

提供了到Python的直接通道(gateway)的根据本发明的绑定方法允许快速开发复杂的3D应用,而不需要低级实时3D API方面的专业知识。

如果所有的业务应用都是用Python编写的,则并行使用Lua是可能的/推荐的,这取决于任务的性质和预期的性能。

a.台式机

用Python编写的应用可以有利地转移在所有参考平台(Windows、 OS X、Linux)上。这是用于开发直接在常规工作站上执行的业务应用的理想格式。

b.服务器

3D C++引擎/Python业务应用对的模块化和可移植性质提供了使其在“无渲染”模式下(即通过停用图像生成器)运行的可能性。获得了计算实时3D图像但不显示它们的实时3D图像引擎的矛盾情况。这是在“在线大规模(online massive)”中非常常见的功能,其中,多个客户端软件实例连接在同一服务器上,并且必须在该服务器上找到相同的模拟。此处,Python也完全适合开发“服务器端”应用。在Unreal引擎下单独用C++ 以及在Unity3D下单独用C#均可获得此功能。执行根据本发明的绑定方法的软件环境向C++/Python/Lua/C#开放该功能。

根据本发明的绑定方法特别地适用于办公计算机或智能手机/嵌入式设备上的高性能且紧凑的应用,同时经由绑定和Lua向开发者提供最大的可访问性。

a.办公计算机

对互操作性的需求适中的快速、紧凑的业务应用。

b.智能手机

非常需要实时3D图像的快速、紧凑的业务应用。

这涉及针对“客户端”网络应用(由导航器或浏览器执行)的最新开发。100%用C++开发业务应用为WebAssembly/WebGL目标打开了第一扇门。极其紧凑(12000行C)的虚拟机Lua提供了第二通道。

在WebAssembly中编译C++是非常新的技术。这是用于虚拟目标CPU 的汇编语言。关于主要网络导航器(火狐、苹果、谷歌、微软)通用的平台的规范的共识刚刚在2017年3月得到验证。

由于其C++源代码的紧凑性和可移植性,根据本发明的绑定方法及其用于转换模型的实现是用于在WebAssembly中运行的理想技术。主要问题是二进制文件的大小。迄今为止,与根据本发明的绑定方法一起使用的 C/C++库的WASM二进制文件表示5兆八位字节(MegaOctets)。通过示例的方式,Unreal引擎的WASM二进制文件表示35兆八位字节。在WebAssembly中,Unity3D必须限于C#中存在的功能的子组件。

当然,本发明不限于上述实施方式,并且在不脱离本发明的范围的情况下,可以对所述实施方式进行许多改进。当然,根据各种组合,本发明的各种特征、类型、变体和实施方式可以彼此关联,只要它们并非相互不兼容或排斥。特别地,上述所有变型和实施方式可以彼此结合。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号