一种虚幻引擎与外部程序的数据通信方法技术

技术编号:29789125 阅读:24 留言:0更新日期:2021-08-24 18:07
本发明专利技术提出一种虚幻引擎与外部程序的数据通信方法,虚幻引擎与外部程序之间采用高效的gRPC远程服务调用作为虚幻引擎和外部程序间数据传输的通信方式,采用protobuf作为数据传输格式,支持全类型数据传输,支持多种程序语言开发的外部程序与虚幻引擎通信,提供多种程序语言的通信接口;采用虚幻引擎的多线程机制无阻塞地监听外部程序所发送消息;采用虚幻引擎的自动删除型后台任务执行机制无阻塞地向外部程序发送消息。本发明专利技术可以保证虚幻引擎与外部程序的高效数据通信,提供虚幻引擎与多种程序语言开发的外部程序相互通信的能力。

【技术实现步骤摘要】
一种虚幻引擎与外部程序的数据通信方法
本专利技术属于数据传输
,具体涉及一种虚幻引擎与外部程序的数据通信方法。
技术介绍
虚幻引擎(UnrealEngine,简称UE或UE4)是EpicGame公司开发的一款游戏引擎。虚幻引擎以其强大的实时渲染能力、高真实感的画质效果、开发者友好的编辑工具、体系完备的功能模块成为最为顶尖的游戏引擎之一。虚幻引擎不仅在游戏制作领域占有绝大多数的市场,而且广泛应用在高精度仿真、工业设计、虚拟现实、电影制作等诸多行业和领域之中。虚幻引擎与外部程序的数据通信有着重要的应用价值。在虚幻引擎的应用中,虚幻引擎多与其它外部程序共同协作以实现特定应用的完整功能。例如,虚幻引擎作为仿真展示系统与其外部程序仿真物理引擎交互以实现具有高真实感画面的高精度仿真。虚幻引擎与外部程序的协作、交互均依于虚幻引擎与外部程序之间的通信。例如上例中,仿真物理引擎将模型数据通过某种通信方法发送给虚幻引擎用以渲染展示。因此,虚幻引擎与外部程序之间的通信对于广泛的商业、工业应用起到了基础性、关键性、决定性的作用。当前虚幻引擎与外部通信的方法主要包括文件读写型、服务器通信型、点对点通信型三种类型。文件读写型方法通过虚幻引擎和外部程序同时读写存储介质中的同一文件实现通信。该方法实现方式简单,但是其通信效率受限于存储介质的读写速度,且无法实现虚幻引擎与部署在远程主机上的外部程序进行通信。因此,文件读写型方法仅适用于单机部署且对通信速度要求不高的系统,其应用场景有限。服务器通信型方法建立通信服务器来连接虚幻引擎与外部程序。在该类方法中,虚幻引擎和外部程序之间的通信数据经由通信服务器进行数据转发。其典型实现方法有通过Socket.IO的实现方法和通过ROSIntegration的实现方法。Socket.IO的实现方法利用独立的服务器,点对点转发虚幻引擎和外部程序之间的通信数据。ROSIntegration的实现方法采用独立服务器进行“发布、订阅”模式的通信,使得虚幻引擎可向订阅了其数据消息的外部程序发送数据、可接受其订阅了数据消息的外部程序发送的数据。当前,服务器通信型方法是虚幻引擎与外部程序的通信方法中应用最多、复用性最好的通信方法,也可解决文件读写型方法无法远程通信的问题。然而,服务器通信型方法由于所有数据均需由独立服务器转发,其通信距离较长且服务器的处理能力会成为通信瓶颈。因此,该方法的通信效率无法满足大规模数据高效实时传输的需求。例如,在自动驾驶仿真中虚幻引擎利用服务器通信型方法向多个自动驾驶控制程序同时发送高清渲染的实时场景照片时,会因为服务器的处理能力有限而造成外部程序获取的场景照片严重滞后于虚幻引擎中仿真场景状态的情况,造成自动驾驶控制程序计算偏差。点对点通信方法直接建立虚幻引擎与外部程序的通信信道实现数据通信。典型的实现方法包括虚幻引擎提供的UDP通信方法和gRPC通信方法。虚幻引擎提供的UDP通信方法使用虚幻引擎消息传输桥连接虚幻引擎和外部程序。然而,该方法仅支持虚幻引擎与C++编程语言开发的外部程序进行通信。当前采用gRPC进行虚幻引擎与外部程序进行通信的解决方案为Infraworld。其可以保证数据的高效传输,并可支持虚幻引擎与多种语言开发的外部程序进行通信。然而Infraworld仅实现了从虚幻引擎向外部程序单向主动发送数据的功能,未实现虚幻引擎对外部程序所发送数据的监听和接收功能,故可使用Infraworld的应用场景有限。综上所述,现有的虚幻引擎与外部程序之间的通信技术无法在保证高效通信的同时提供虚幻引擎与多种程序语言开发的外部程序相互通信的支持。但是,虚幻引擎的广泛应用场景需要其与各种程序语言开发的外部程序进行高效的双向通信。除此之外,当前虚幻引擎与外部程序之间的通信技术大多针对特定的通信场景开发,例如虚幻引擎粒子系统与外部程序通信。这些针对特定场景开发的通信方法,对于虚幻引擎项目具有较高的定制型,难以直接迁移复用到其它的项目之中。然而,虚幻引擎与外部程序之间的通信是一项基础性的、普遍性的需求,亟需复用性高、通用性强的通信方法。
技术实现思路
(一)要解决的技术问题本专利技术提出一种虚幻引擎与外部程序的数据通信方法,以解决如何实现虚幻引擎与外部程序点对点高效通信的技术问题。(二)技术方案为了解决上述技术问题,本专利技术提出一种虚幻引擎与外部程序的数据通信方法,该虚幻引擎与外部程序之间采用gRPC远程服务调用作为数据传输的通信方式,采用protobuf作为数据传输格式;虚幻引擎与外部程序的数据通信分为虚幻引擎主动请求和虚幻引擎被动监听两种形式;其中,虚幻引擎主动请求是虚幻引擎将需要发送的消息封装为protobuf数据传输格式,采用gRPC提供的request功能,将数据发送给指定的外部程序,并收取该外部程序通过gRPC提供的reply功能对上述数据进行的回复;虚幻引擎被动监听是虚幻引擎开启gRPC监听端口,监听任意外部程序通过gRPC提供的request功能发送到该端口的protobuf传输格式定义的数据;在收到数据后,虚幻引擎采用gRPC提供的reply功能对上述数据进行回复。进一步地,虚幻引擎主动请求具体包括如下步骤:(1)建立protobuf数据格式文件建立protobuf数据格式文件,根据protobuf格式语法,定义数据传输格式,在该数据格式文件中定义gRPC远程服务调用的具体服务名称并指定该服务在request和reply功能中传递数据的传输格式;(2)编译protobuf数据格式文件使用protobuf工具protoc编译在步骤(1)中建立的protobuf数据格式文件,生成protobuf数据格式的C++头文件和源文件;将头文件和源文件拷贝至虚幻引擎项目中,供虚幻引擎使用步骤(1)中定义的protobuf数据格式和gRPC远程调用服务;(3)创建“主动请求”的C++基类在虚幻引擎项目中创建“主动请求”的C++基类,在此基类头文件中引用步骤(2)中生成的头文件,并在此基类中利用C++智能指针创建步骤(1)中定义的gRPC远程服务调用的通信凭证作为其类变量;(4)创建每种“主动请求”的gRPC具体服务的C++类在虚幻引擎项目中为每一种需要虚幻引擎“主动请求”的gRPC具体服务创建C++类,这些类继承步骤(3)中创建的“主动请求”的C++基类;在这些类中,定义消息发送的具体实现函数,使用基类中的通信凭证中包含的gRPC异步消息发送函数发送数据;其中,所发送数据具有由步骤(1)定义的protobuf数据格式;(5)创建“主动请求”通信接口的C++类在虚幻引擎项目中创建“主动请求”通信接口的C++类;在该类中,将步骤(4)中所有创建的虚幻引擎“主动请求”的gRPC具体服务的C++类实例化为通信接口类的类变量,同时设置一个字符串类型的类变量用以保存所需通信的外部程序的监听地址;在该类中提供通信接口的构造函数以及每项gRPC具体服务通信的接口函数;其本文档来自技高网
...

【技术保护点】
1.一种虚幻引擎与外部程序的数据通信方法,其特征在于,所述虚幻引擎与外部程序之间采用gRPC远程服务调用作为数据传输的通信方式,采用protobuf作为数据传输格式;虚幻引擎与外部程序的数据通信分为虚幻引擎主动请求和虚幻引擎被动监听两种形式;其中,/n所述虚幻引擎主动请求是虚幻引擎将需要发送的消息封装为protobuf数据传输格式,采用gRPC提供的request功能,将数据发送给指定的外部程序,并收取该外部程序通过gRPC提供的reply功能对上述数据进行的回复;/n所述虚幻引擎被动监听是虚幻引擎开启gRPC监听端口,监听任意外部程序通过gRPC提供的request功能发送到该端口的protobuf传输格式定义的数据;在收到数据后,虚幻引擎采用gRPC提供的reply功能对上述数据进行回复。/n

【技术特征摘要】
1.一种虚幻引擎与外部程序的数据通信方法,其特征在于,所述虚幻引擎与外部程序之间采用gRPC远程服务调用作为数据传输的通信方式,采用protobuf作为数据传输格式;虚幻引擎与外部程序的数据通信分为虚幻引擎主动请求和虚幻引擎被动监听两种形式;其中,
所述虚幻引擎主动请求是虚幻引擎将需要发送的消息封装为protobuf数据传输格式,采用gRPC提供的request功能,将数据发送给指定的外部程序,并收取该外部程序通过gRPC提供的reply功能对上述数据进行的回复;
所述虚幻引擎被动监听是虚幻引擎开启gRPC监听端口,监听任意外部程序通过gRPC提供的request功能发送到该端口的protobuf传输格式定义的数据;在收到数据后,虚幻引擎采用gRPC提供的reply功能对上述数据进行回复。


2.如权利要求1所述的的数据通信方法,其特征在于,所述虚幻引擎主动请求具体包括如下步骤:
(1)建立protobuf数据格式文件
建立protobuf数据格式文件,根据protobuf格式语法,定义数据传输格式,在该数据格式文件中定义gRPC远程服务调用的具体服务名称并指定该服务在request和reply功能中传递数据的传输格式;
(2)编译protobuf数据格式文件
使用protobuf工具protoc编译在步骤(1)中建立的protobuf数据格式文件,生成protobuf数据格式的C++头文件和源文件;将头文件和源文件拷贝至虚幻引擎项目中,供虚幻引擎使用步骤(1)中定义的protobuf数据格式和gRPC远程调用服务;
(3)创建“主动请求”的C++基类
在虚幻引擎项目中创建“主动请求”的C++基类,在此基类头文件中引用步骤(2)中生成的头文件,并在此基类中利用C++智能指针创建步骤(1)中定义的gRPC远程服务调用的通信凭证作为其类变量;
(4)创建每种“主动请求”的gRPC具体服务的C++类
在虚幻引擎项目中为每一种需要虚幻引擎“主动请求”的gRPC具体服务创建C++类,这些类继承步骤(3)中创建的“主动请求”的C++基类;在这些类中,定义消息发送的具体实现函数,使用基类中的通信凭证中包含的gRPC异步消息发送函数发送数据;其中,所发送数据具有由步骤(1)定义的protobuf数据格式;
(5)创建“主动请求”通信接口的C++类
在虚幻引擎项目中创建“主动请求”通信接口的C++类;在该类中,将步骤(4)中所有创建的虚幻引擎“主动请求”的gRPC具体服务的C++类实例化为通信接口类的类变量,同时设置一个字符串类型的类变量用以保存所需通信的外部程序的监听地址;在该类中提供通信接口的构造函数以及每项gRPC具体服务通信的接口函数;其中,通信接口构造函数参数为所需通信的外部程序的监听地址、gRPC通信配置;外部程序的监听地址传入步骤(3)基类中的通信凭证变量之中;gRPC通信配置为gRPC远程服务调用所需求的通用配置参数;每项gRPC具体服务通信的接口函数的参数为该通信所需发送的具体数据变量,该函数通过调用对应的通信接口类变量中的消息发送的具体实现函数发送数据,并返回外部程序对该gRPC请求的响应数据;
(6)创建每种“主动请求”的gRPC具体服务的异步任务类
在虚幻引擎项目中,为每一项“主动请求”的gRPC具体服务创建异步任务类,该类通过继承自虚幻引擎提供的异步任务基类实现任务异步执行的能力。在该类中,除了虚幻引擎中使用异步任务基类必须设置的默认变量和函数外,额外设置三个类变量:第一个额外的类变量为步骤(5)中创建的“主动请求”通信接口的C++类的类实例指针;第二个额外的类变量为所需发送的数据变量;第三个额外的变量为所接收的响应数据变量;上述额外设置的三个类变量的值,通过异步任务类的构造函数传入,在该异步任务类的任务执行函数中使用,使用方法为:将所需发送的数据变量以参数形式传入通信接口的C++类的类实例指针包含的对应本异步任务的gRPC具体服务的接口函数中,将接口的返回值保存至响应数据变量中;
(7)封装每种“主动请求”的gRPC具体服务的数据发送函数
在虚幻引擎项目中,为每一项“主动请求”的gRPC具体服务封装数据发送函数,并在该函数的声明前加上虚幻引擎提供的宏,将该函数设置为蓝图可调用;该数据发送函数利用异步任务类或自动删除的异步任务类在异步线程上执行步骤(6)创建的异步任务类;
(8)在C++或蓝图中调用数据发送函数
在虚幻引擎项目中需要利用“主动请求”进行通信时,通过C++或蓝图调用在步骤(7)封装的数据发送函数,实现引擎“主动请求”形式的通信。


3.如权利要求1所述的的数据通信方法,其特征在于,所述虚幻引擎被动监听具体包括如下步骤:
(1)建立protobuf数据格式文件
建立protobuf数据格式文件,根据protobuf格式语法,定义数据传输格式,在该数据格式文件中定义gRPC远程服务调用的具体服务名称并指定该服务在request和reply功能中传递数据的传输格式;
(2)编译p...

【专利技术属性】
技术研发人员:徐新海朱成璋刘逊韵李豪叶帅杨伟龙
申请(专利权)人:中国人民解放军军事科学院战争研究院
类型:发明
国别省市:北京;11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1