CN113296979B - 一种虚幻引擎与外部程序的数据通信方法 - Google Patents

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

Info

Publication number
CN113296979B
CN113296979B CN202110523205.8A CN202110523205A CN113296979B CN 113296979 B CN113296979 B CN 113296979B CN 202110523205 A CN202110523205 A CN 202110523205A CN 113296979 B CN113296979 B CN 113296979B
Authority
CN
China
Prior art keywords
class
service
function
data
engine
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202110523205.8A
Other languages
English (en)
Other versions
CN113296979A (zh
Inventor
徐新海
朱成璋
刘逊韵
李豪
叶帅
杨伟龙
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Research Institute of War of PLA Academy of Military Science
Original Assignee
Research Institute of War of PLA Academy of Military Science
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Research Institute of War of PLA Academy of Military Science filed Critical Research Institute of War of PLA Academy of Military Science
Priority to CN202110523205.8A priority Critical patent/CN113296979B/zh
Publication of CN113296979A publication Critical patent/CN113296979A/zh
Application granted granted Critical
Publication of CN113296979B publication Critical patent/CN113296979B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/546Message passing systems or structures, e.g. queues
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/547Remote procedure calls [RPC]; Web services

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Computer And Data Communications (AREA)

Abstract

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

Description

一种虚幻引擎与外部程序的数据通信方法
技术领域
本发明属于数据传输技术领域,具体涉及一种虚幻引擎与外部程序的数据通信方法。
背景技术
虚幻引擎(Unreal Engine,简称UE或UE4)是Epic Game公司开发的一款游戏引擎。虚幻引擎以其强大的实时渲染能力、高真实感的画质效果、开发者友好的编辑工具、体系完备的功能模块成为最为顶尖的游戏引擎之一。虚幻引擎不仅在游戏制作领域占有绝大多数的市场,而且广泛应用在高精度仿真、工业设计、虚拟现实、电影制作等诸多行业和领域之中。
虚幻引擎与外部程序的数据通信有着重要的应用价值。在虚幻引擎的应用中,虚幻引擎多与其它外部程序共同协作以实现特定应用的完整功能。例如,虚幻引擎作为仿真展示系统与其外部程序仿真物理引擎交互以实现具有高真实感画面的高精度仿真。虚幻引擎与外部程序的协作、交互均依于虚幻引擎与外部程序之间的通信。例如上例中,仿真物理引擎将模型数据通过某种通信方法发送给虚幻引擎用以渲染展示。因此,虚幻引擎与外部程序之间的通信对于广泛的商业、工业应用起到了基础性、关键性、决定性的作用。
当前虚幻引擎与外部通信的方法主要包括文件读写型、服务器通信型、点对点通信型三种类型。
文件读写型方法通过虚幻引擎和外部程序同时读写存储介质中的同一文件实现通信。该方法实现方式简单,但是其通信效率受限于存储介质的读写速度,且无法实现虚幻引擎与部署在远程主机上的外部程序进行通信。因此,文件读写型方法仅适用于单机部署且对通信速度要求不高的系统,其应用场景有限。
服务器通信型方法建立通信服务器来连接虚幻引擎与外部程序。在该类方法中,虚幻引擎和外部程序之间的通信数据经由通信服务器进行数据转发。其典型实现方法有通过Socket.IO的实现方法和通过ROS Integration的实现方法。Socket.IO的实现方法利用独立的服务器,点对点转发虚幻引擎和外部程序之间的通信数据。ROS Integration的实现方法采用独立服务器进行“发布、订阅”模式的通信,使得虚幻引擎可向订阅了其数据消息的外部程序发送数据、可接受其订阅了数据消息的外部程序发送的数据。当前,服务器通信型方法是虚幻引擎与外部程序的通信方法中应用最多、复用性最好的通信方法,也可解决文件读写型方法无法远程通信的问题。然而,服务器通信型方法由于所有数据均需由独立服务器转发,其通信距离较长且服务器的处理能力会成为通信瓶颈。因此,该方法的通信效率无法满足大规模数据高效实时传输的需求。例如,在自动驾驶仿真中虚幻引擎利用服务器通信型方法向多个自动驾驶控制程序同时发送高清渲染的实时场景照片时,会因为服务器的处理能力有限而造成外部程序获取的场景照片严重滞后于虚幻引擎中仿真场景状态的情况,造成自动驾驶控制程序计算偏差。
点对点通信方法直接建立虚幻引擎与外部程序的通信信道实现数据通信。典型的实现方法包括虚幻引擎提供的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具体服务通信的接口函数;其中,通信接口构造函数参数为所需通信的外部程序的监听地址、gRPC通信配置;外部程序的监听地址传入步骤(3)基类中的通信凭证变量之中;gRPC通信配置为gRPC远程服务调用所需求的通用配置参数;每项gRPC具体服务通信的接口函数的参数为该通信所需发送的具体数据变量,该函数通过调用对应的通信接口类变量中的消息发送的具体实现函数发送数据,并返回外部程序对该gRPC请求的响应数据;
(6)创建每种“主动请求”的gRPC具体服务的异步任务类
在虚幻引擎项目中,为每一项“主动请求”的gRPC具体服务创建异步任务类,该类通过继承自虚幻引擎提供的异步任务基类实现任务异步执行的能力。在该类中,除了虚幻引擎中使用异步任务基类必须设置的默认变量和函数外,额外设置三个类变量:第一个额外的类变量为步骤(5)中创建的“主动请求”通信接口的C++类的类实例指针;第二个额外的类变量为所需发送的数据变量;第三个额外的变量为所接收的响应数据变量;上述额外设置的三个类变量的值,通过异步任务类的构造函数传入,在该异步任务类的任务执行函数中使用,使用方法为:将所需发送的数据变量以参数形式传入通信接口的C++类的类实例指针包含的对应本异步任务的gRPC具体服务的接口函数中,将接口的返回值保存至响应数据变量中;
(7)封装每种“主动请求”的gRPC具体服务的数据发送函数
在虚幻引擎项目中,为每一项“主动请求”的gRPC具体服务封装数据发送函数,并在该函数的声明前加上虚幻引擎提供的宏,将该函数设置为蓝图可调用;该数据发送函数利用异步任务类或自动删除的异步任务类在异步线程上执行步骤(6)创建的异步任务类;
(8)在C++或蓝图中调用数据发送函数
在虚幻引擎项目中需要利用“主动请求”进行通信时,通过C++或蓝图调用在步骤(7)封装的数据发送函数,实现引擎“主动请求”形式的通信。
进一步地,虚幻引擎被动监听具体包括如下步骤:
(1)建立protobuf数据格式文件
建立protobuf数据格式文件,根据protobuf格式语法,定义数据传输格式,在该数据格式文件中定义gRPC远程服务调用的具体服务名称并指定该服务在request和reply功能中传递数据的传输格式;
(2)编译protobuf数据格式文件
使用protobuf工具protoc编译在步骤(1)中建立的protobuf数据格式文件,生成protobuf数据格式的C++头文件和源文件;将头文件和源文件拷贝至虚幻引擎项目中,供虚幻引擎使用步骤(1)中定义的protobuf数据格式和gRPC远程调用服务;
(3)创建“被动监听”的C++基类
在虚幻引擎项目中创建“被动监听”的C++基类,在此基类头文件中引用步骤(2)中生成的头文件;此基类创建为模板类,其参数模板的参数列表中包含三个虚拟类型参数名,分别用以传入监听处理函数的返回值类型、gRPC远程调用服务的请求类型、gRPC远程调用服务的回复类型;在此基类中,创建gRPC中异步服务类的实例指针、服务完成队列类的实例指针、服务异步响应类的实例、请求类实例以及回复类实例作为类变量;在此基类中以纯虚函数的形式定义监听处理函数的接口;
(4)创建每种“被动监听”的gRPC具体服务的C++类
在虚幻引擎项目中为每一种需要虚幻引擎“被动监听”的gRPC具体服务创建C++类,这些类继承步骤(3)中创建的“被动监听”的C++基类,并将该服务所涉及的具体的监听处理函数的返回值类型、gRPC远程调用服务的请求类型、gRPC远程调用服务的回复类型传入步骤(3)中模板的参数列表中;在这些类中,针对不同的需要监听的gRPC服务,给出监听处理函数的具体实现;在监听处理函数的具体实现中,使用基类中创建的类变量异步接收外部程序发送来的具有由步骤(1)定义的protobuf数据格式的数据,并将数据存放至服务完成队列中等待处理;对于服务完成队列中的数据的处理,包含两个步骤:第一,将接收到的外部程序发送数据,提取并转化为监听处理函数的返回值类型返回至函数调用对象;第二,依据所设计的gRPC具体服务需求,将虚幻引擎中的需回复的数据以回复类形式回复外部程序;
(5)创建“被动监听”的监听服务C++类
在虚幻引擎项目中创建“被动监听”的监听服务C++类。在该类中,利用C++智能指针创建gRPC监听服务类的实例指针,并为步骤(4)中创建的gRPC具体服务的C++类创建服务完成队列的实例指针,将上述实例指针作为该类的类变量;提供监听服务的开始运行和结束运行函数,开始运行函数指定监听端口号,打开gRPC服务监听端口,并绑定各服务完成队列,结束运行函数关闭gRPC服务监听端口,并关闭各服务完成队列;
(6)创建“被动监听”异步线程的C++基类
在虚幻引擎项目中,创建“被动监听”异步线程的C++基类;该基类通过继承自虚幻引擎提供的异步线程基类实现创建异步线程执行并在异步线程上执行任务的能力;在该基类中,除了虚幻引擎中使用异步线程基类必须设置的默认变量和函数外,额外设置两个类变量:第一个额外的类变量为步骤(5)中创建的“被动监听”的监听服务C++类的类实例指针,该类实例指针通过虚幻引擎提供的共享指针模板类创建;第二个额外的类变量为布尔类型,用以作为监听服务是否已完成的标志位;
(7)创建每项“被动监听”的gRPC具体服务的异步线程类
在虚幻引擎项目中,为每一项“被动监听”的gRPC具体服务创建异步线程类;该类继承自步骤(6)创建的“被动监听”异步线程基类;在该类中,除继承基类的类变量外,额外设置一个类变量,该类变量为虚幻引擎提供的队列模板类的实例,其队列中数据类型该类对应的gRPC具体服务C++类中监听处理函数的返回值类型;该类覆写基类中的异步线程执行函数,在该执行函数中,通过C++的while循环,循环使用步骤(6)中创建的第一个额外变量调用步骤(4)中创建的监听处理函数以处理该类对应的在步骤(5)中创建的服务完成队列中的数据,每次循环中,处理得到的数据被写入该类的队列模板类实例变量中,供其它线程读取;该循环的执行条件,由步骤(6)中创建的第二个额外变量决定:当该变量值为false时执行循环,当该变量值为true时结束循环;
(8)封装“监听服务开启函数”和“监听服务关闭函数”
在虚幻引擎项目中封装“监听服务开启函数”和“监听服务关闭函数”;在监听服务开启函数中,调用步骤(5)中创建的“被动监听”的监听服务C++类中的开始运行函数,开启监听服务;在监听服务开启函数中使用虚幻引擎提供的异步线程构建函数构建异步线程并执行步骤(7)中创建的gRPC具体服务异步线程类,用以在异步线程上处理监听到的gRPC具体服务中包含的数据;在监听服务关闭函数中,将所有步骤(7)中创建的gRPC具体服务异步线程类中的循环执行标志位设置位true,执行步骤(5)中创建的“被动监听”的监听服务C++类中的结束运行函数关闭监听服务,并删除在监听服务开启函数中构造执行的所有异步线程;
(9)在C++或蓝图中调用“监听服务开启函数”和“监听服务关闭函数”
在虚幻引擎项目中需要利用“被动监听”进行通信时,通过C++或蓝图调用在步骤(8)封装的监听服务开启函数,实现引擎被动监听外部程序发送的数据,并将有关数据回复给外部程序;当无需继续进行“被动监听”通信时,通过C++或蓝图调用在步骤(8)封装的监听服务关闭函数,关闭被动监听通信。
(三)有益效果
本发明提出一种虚幻引擎与外部程序的数据通信方法,虚幻引擎与外部程序之间采用高效的gRPC远程服务调用作为虚幻引擎和外部程序间数据传输的通信方式,采用protobuf作为数据传输格式,支持全类型数据传输,支持多种程序语言开发的外部程序与虚幻引擎通信,提供多种程序语言的通信接口;采用虚幻引擎的多线程机制无阻塞地监听外部程序所发送消息;采用虚幻引擎的自动删除型后台任务执行机制无阻塞地向外部程序发送消息。
本发明的技术效果具体包括:
1.可以保证虚幻引擎与外部程序的高效数据通信。高效数据通信的能力来源于采用点对点的通信方法并使用gRPC远程服务调用作为虚幻引擎和外部程序间消息传输的通信方式。
2.提供了虚幻引擎与多种程序语言开发的外部程序相互通信的能力。该能力来自于采用gRPC远程服务调用作为虚幻引擎和外部程序间消息传输的通信方式以及protobuf传输格式定义传输的数据格式。各主流程序语言均有成熟的解决方案收发基于protobuf传输格式的gRPC远程服务调用传输的数据。
附图说明
图1为本发明实施例中虚幻引擎主动请求流程图;
图2为本发明实施例中虚幻引擎被动监听流程图。
具体实施方式
为使本发明的目的、内容和优点更加清楚,下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。
本实施例提出一种虚幻引擎与外部程序的数据通信方法,虚幻引擎与外部程序之间采用gRPC远程服务调用作为数据传输的通信方式,采用protobuf作为数据传输格式。虚幻引擎与外部程序的数据通信分为虚幻引擎主动请求和虚幻引擎被动监听两种形式。
虚幻引擎主动请求是虚幻引擎将需要发送的消息封装为protobuf数据传输格式,采用gRPC提供的request功能,将数据发送给指定的外部程序,并收取该外部程序通过gRPC提供的reply功能对上述数据进行的回复。具体实现流程如图1所示,包括:
(1)建立protobuf数据格式文件
建立protobuf数据格式文件(‘*.proto’),根据protobuf格式语法,定义所需数据的传输格式,然后在该数据格式文件中定义gRPC远程服务调用的具体服务名称并指定该服务在request和reply功能中传递数据的传输格式。
(2)编译protobuf数据格式文件
使用protobuf工具protoc编译在步骤(1)中建立的protobuf数据格式文件,生成protobuf数据格式的C++头文件和源文件。将该头文件和源文件拷贝至虚幻引擎项目中,供虚幻引擎使用步骤(1)中定义的protobuf数据格式和gRPC远程调用服务。
(3)创建“主动请求”的C++基类
在虚幻引擎项目中创建“主动请求”的C++基类,在此基类头文件中引用步骤(2)中生成的头文件,并在此基类中利用C++智能指针(std::unique_ptr)创建步骤(1)中定义的gRPC远程服务调用的通信凭证(stub)作为其类变量。
(4)创建每种“主动请求”的gRPC具体服务的C++类
在虚幻引擎项目中为每一种需要虚幻引擎“主动请求”的gRPC具体服务创建C++类,这些类继承步骤(3)中创建的“主动请求”的C++基类。在这些类中,定义消息发送的具体实现函数,使用基类中的通信凭证(stub)中包含的gRPC异步消息发送函数(其中包含gRPC提供的request功能)来发送数据。其中,所发送数据应具有由步骤(1)定义的protobuf数据格式。
(5)创建“主动请求”通信接口的C++类
在虚幻引擎项目中创建“主动请求”通信接口的C++类。在该类中,将步骤(4)中所有创建的虚幻引擎“主动请求”的gRPC具体服务的C++类实例化为通信接口类的类变量,同时设置一个字符串类型的类变量用以保存所需通信的外部程序的监听地址。同时,在该类中提供通信接口的构造函数以及每项gRPC具体服务通信的接口函数。其中,通信接口构造函数参数为所需通信的外部程序的监听地址、gRPC通信配置;外部程序的监听地址传入步骤(3)基类中的通信凭证(stub)变量之中;gRPC通信配置为gRPC远程服务调用所需求的通用配置参数(grpc::ChannelArguments)。每项gRPC具体服务通信的接口函数的参数为该通信所需发送的具体数据变量,该函数通过调用对应的通信接口类变量中的消息发送的具体实现函数(具体实现函数由步骤(3)定义)来发送数据,并返回外部程序对该gRPC请求的响应数据。
(6)创建每种“主动请求”的gRPC具体服务的异步任务类
在虚幻引擎项目中,为每一项“主动请求”的gRPC具体服务创建异步任务类,该类通过继承自虚幻引擎提供的异步任务基类(FNonAbandonableTask类)实现任务异步执行的能力。在该类中,除了虚幻引擎中使用FNonAbandonableTask基类必须设置的默认变量和函数外,本方法额外设置三个类变量。第一个额外的类变量为步骤(5)中创建的“主动请求”通信接口的C++类的类实例指针;第二个额外的类变量为所需发送的数据变量;第三个额外的变量为所接收的响应数据变量。这三个变量的值,通过该异步任务类的构造函数传入,在该异步任务类的任务执行函数(DoWork()函数)中使用。其使用方法为:将所需发送的数据变量(第二个额外的类变量)以参数形式传入通信接口的C++类的类实例指针(第一个额外的类变量)包含的对应本异步任务的gRPC具体服务的接口函数中(gRPC具体服务的接口函数由步骤(5)提供),将接口的返回值保存至响应数据变量中(第三个额外的类变量)。
(7)封装每种“主动请求”的gRPC具体服务的数据发送函数
在虚幻引擎项目中,为每一项“主动请求”的gRPC具体服务封装数据发送函数,并在该函数的声明前加上虚幻引擎提供的宏(UFUNCTION(BlueprintCallable)),将该函数设置为蓝图可调用。该数据发送函数利用异步任务类(FAsyncTask)或自动删除的异步任务类(FAutoDeleteAsyncTask)在异步线程上执行步骤(6)创建的异步任务类。
(8)在C++或蓝图中调用数据发送函数
在虚幻引擎项目中需要利用“主动请求”进行通信时,通过C++或蓝图调用在步骤(7)封装的数据发送函数即可实现引擎“主动请求”形式的通信。
虚幻引擎被动监听是虚幻引擎开启gRPC监听端口,监听任意外部程序通过gRPC提供的request功能发送到该端口的protobuf传输格式定义的数据;在收到数据后,虚幻引擎采用gRPC提供的reply功能对上述数据进行回复。具体实现流程如图2所示,包括:
(1)建立protobuf数据格式文件
建立protobuf数据格式文件(‘*.proto’),根据protobuf格式语法,定义所需数据的传输格式。而后,在该数据格式文件中定义gRPC远程服务调用的具体服务名称并指定该服务在request和reply功能中传递数据的传输格式。
(2)编译protobuf数据格式文件
使用protobuf工具protoc编译在步骤(1)中建立的protobuf数据格式文件,生成protobuf数据格式的C++头文件和源文件。将该头文件和源文件拷贝至虚幻引擎项目中,供虚幻引擎使用步骤(1)中定义的protobuf数据格式和gRPC远程调用服务。
(3)创建“被动监听”的C++基类
在虚幻引擎项目中创建“被动监听”的C++基类,在此基类头文件中引用步骤(2)中生成的头文件。此基类创建为模板类,其参数模板的参数列表中包含三个虚拟类型参数名(ReturnType,RequestType,ReplyType)分别用以传入监听处理函数的返回值类型、gRPC远程调用服务的请求(request)类型、gRPC远程调用服务的回复(reply)类型。在此基类中,创建gRPC中异步服务类(AsyncService)的实例指针、服务完成队列类(ServerCompletionQueue)的实例指针、服务异步响应类(ServerAsyncResponseWriter<ReplyType>)的实例、RequestType类型的请求类实例以及ReplyType类型的回复类实例作为类变量。同时,在此基类中以纯虚函数的形式定义监听处理函数的接口。
(4)创建每种“被动监听”的gRPC具体服务的C++类
在虚幻引擎项目中为每一种需要虚幻引擎“被动监听”的gRPC具体服务创建C++类,这些类继承步骤(3)中创建的“被动监听”的C++基类,并将该服务所涉及的具体的监听处理函数的返回值类型、gRPC远程调用服务的请求(request)类型、gRPC远程调用服务的回复(reply)类型传入步骤(3)中模板的参数列表中。在这些类中,针对不同的需要监听的gRPC服务,给出监听处理函数的具体实现。在监听处理函数的具体实现中,使用基类中创建的类变量来异步接收外部程序发送来的具有由步骤(1)定义的protobuf数据格式的数据,并将数据存放至服务完成队列中等待处理。对于服务完成队列中的数据的处理,包含两个步骤。第一,将接收到的外部程序发送数据,提取并转化为监听处理函数的返回值类型返回至函数调用对象。第二,依据所设计的gRPC具体服务需求,将虚幻引擎中的需回复的数据以回复(reply)类形式回复外部程序。
(5)创建“被动监听”的监听服务C++类
在虚幻引擎项目中创建“被动监听”的监听服务C++类。在该类中,利用C++智能指针(std::unique_ptr)创建gRPC监听服务类(Server)的实例指针,并为步骤(4)中创建的gRPC具体服务的C++类创建服务完成队列(ServerCompletionQueue)的实例指针,将上述实例指针作为该类的类变量。同时,提供监听服务的开始运行和结束运行函数。开始运行函数指定监听端口号,打开gRPC服务监听端口,并绑定各服务完成队列。结束运行函数关闭gRPC服务监听端口,并关闭各服务完成队列。
(6)创建“被动监听”异步线程的C++基类
在虚幻引擎项目中,创建“被动监听”异步线程的C++基类。该基类通过继承自虚幻引擎提供的异步线程基类(FRunnable类)实现创建异步线程执行并在异步线程上执行任务的能力。在该基类中,除了虚幻引擎中使用FRunnable基类必须设置的默认变量和函数外,本方法额外设置两个类变量。第一个额外的类变量为步骤(5)中创建的“被动监听”的监听服务C++类的类实例指针,该类实例指针通过虚幻引擎提供的共享指针模板类(TSharedPtr)创建;第二个额外的类变量为布尔类型(bool),用以作为监听服务是否已完成的标志位。
(7)创建每项“被动监听”的gRPC具体服务的异步线程类
在虚幻引擎项目中,为每一项“被动监听”的gRPC具体服务创建异步线程类。该类继承自步骤(6)创建的“被动监听”异步线程基类。在该类中,除继承基类的类变量外,额外设置一个类变量。该类变量为虚幻引擎提供的队列模板类(TQueue)的实例,其队列中数据类型该类对应的gRPC具体服务C++类中监听处理函数的返回值类型(由步骤(4)指定)。同时,该类覆写基类中的异步线程执行函数(Run())。在该执行函数中,通过C++的while循环,循环使用步骤(6)中创建的第一个额外变量调用步骤(4)中创建的监听处理函数以处理该类对应的在步骤(5)中创建的服务完成队列中的数据。每次循环中,处理得到的数据被写入该类的队列模板类(TQueue)实例变量中,供其它线程读取。该循环的执行条件,由步骤(6)中创建的第二个额外变量决定(称为循环执行标志位):当该变量值为false时执行循环,当该变量值为true时结束循环。
(8)封装“监听服务开启函数”和“监听服务关闭函数”
在虚幻引擎项目中封装“监听服务开启函数”和“监听服务关闭函数”。在监听服务开启函数中,调用步骤(5)中创建的“被动监听”的监听服务C++类中的开始运行函数,开启监听服务。同时,在监听服务开启函数中使用虚幻引擎提供的异步线程构建函数(FRunnableThread::Create)构建异步线程并执行步骤(7)中创建的gRPC具体服务异步线程类,用以在异步线程上处理监听到的gRPC具体服务中包含的数据。在监听服务关闭函数中,将所有步骤(7)中创建的gRPC具体服务异步线程类中的循环执行标志位设置位true,执行步骤(5)中创建的“被动监听”的监听服务C++类中的结束运行函数关闭监听服务,并删除在监听服务开启函数中构造执行的所有异步线程。
(9)在C++或蓝图中调用“监听服务开启函数”和“监听服务关闭函数”
在虚幻引擎项目中需要利用“被动监听”进行通信时,通过C++或蓝图调用在步骤(8)封装的监听服务开启函数,即可实现引擎被动监听外部程序发送的数据,并将有关数据回复给外部程序。当无需继续进行“被动监听”通信时,通过C++或蓝图调用在步骤(8)封装的监听服务关闭函数,即可关闭被动监听通信。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。

Claims (1)

1.一种虚幻引擎与外部程序的数据通信方法,其特征在于,所述虚幻引擎与外部程序之间采用gRPC远程服务调用作为数据传输的通信方式,采用protobuf作为数据传输格式;虚幻引擎与外部程序的数据通信分为虚幻引擎主动请求和虚幻引擎被动监听两种形式;其中,
所述虚幻引擎主动请求是虚幻引擎将需要发送的消息封装为protobuf数据传输格式,采用gRPC提供的request功能,将数据发送给指定的外部程序,并收取该外部程序通过gRPC提供的reply功能对上述数据进行的回复;具体包括如下步骤:
1.1、建立protobuf数据格式文件
建立protobuf数据格式文件,根据protobuf格式语法,定义数据传输格式,在该数据格式文件中定义gRPC远程服务调用的具体服务名称并指定该服务在request和reply功能中传递数据的传输格式;
1.2、编译protobuf数据格式文件
使用protobuf工具protoc编译在步骤1.1中建立的protobuf数据格式文件,生成protobuf数据格式的C++头文件和源文件;将头文件和源文件拷贝至虚幻引擎项目中,供虚幻引擎使用步骤1.1中定义的protobuf数据格式和gRPC远程调用服务;
1.3、创建“主动请求”的C++基类
在虚幻引擎项目中创建“主动请求”的C++基类,在此基类头文件中引用步骤1.2中生成的头文件,并在此基类中利用C++智能指针创建步骤1.1中定义的gRPC远程服务调用的通信凭证作为其类变量;
1.4、创建每种“主动请求”的gRPC具体服务的C++类
在虚幻引擎项目中为每一种需要虚幻引擎“主动请求”的gRPC具体服务创建C++类,这些类继承步骤1.3中创建的“主动请求”的C++基类;在这些类中,定义消息发送的具体实现函数,使用基类中的通信凭证中包含的gRPC异步消息发送函数发送数据;其中,所述发送数据具有由步骤1.1定义的protobuf数据格式;
1.5、创建“主动请求”通信接口的C++类
在虚幻引擎项目中创建“主动请求”通信接口的C++类;在该类中,将步骤1.4中所有创建的虚幻引擎“主动请求”的gRPC具体服务的C++类实例化为通信接口类的类变量,同时设置一个字符串类型的类变量用以保存所需通信的外部程序的监听地址;在该类中提供通信接口的构造函数以及每项gRPC具体服务通信的接口函数;其中,通信接口构造函数参数为所需通信的外部程序的监听地址、gRPC通信配置;外部程序的监听地址传入步骤1.3基类中的通信凭证变量之中;gRPC通信配置为gRPC远程服务调用所需求的通用配置参数;每项gRPC具体服务通信的接口函数的参数为该通信所需发送的具体数据变量,该函数通过调用对应的通信接口类变量中的消息发送的具体实现函数发送数据,并返回外部程序对gRPC请求的响应数据;
1.6、创建每种“主动请求”的gRPC具体服务的异步任务类
在虚幻引擎项目中,为每一项“主动请求”的gRPC具体服务创建异步任务类,该类通过继承自虚幻引擎提供的异步任务基类实现任务异步执行的能力;在该类中,除了虚幻引擎中使用异步任务基类必须设置的默认变量和函数外,额外设置三个类变量:第一个额外的类变量为步骤1.5中创建的“主动请求”通信接口的C++类的类实例指针;第二个额外的类变量为所需发送的数据变量;第三个额外的变量为所接收的响应数据变量;上述额外设置的三个类变量的值,通过异步任务类的构造函数传入,在该异步任务类的任务执行函数中使用,使用方法为:将所需发送的数据变量以参数形式传入通信接口的C++类的类实例指针包含的对应本异步任务类的gRPC具体服务的接口函数中,将接口的返回值保存至响应数据变量中;
1.7、封装每种“主动请求”的gRPC具体服务的数据发送函数
在虚幻引擎项目中,为每一项“主动请求”的gRPC具体服务封装数据发送函数,并在该函数的声明前加上虚幻引擎提供的宏,将该函数设置为蓝图可调用;该数据发送函数利用异步任务类在异步线程上执行步骤1.6创建的异步任务类;
1.8、在C++或蓝图中调用数据发送函数
在虚幻引擎项目中需要利用“主动请求”进行通信时,通过C++或蓝图调用在步骤1.7封装的数据发送函数,实现引擎“主动请求”形式的通信;
所述虚幻引擎被动监听是虚幻引擎开启gRPC监听端口,监听任意外部程序通过gRPC提供的request功能发送到该端口的protobuf传输格式定义的数据;在收到数据后,虚幻引擎采用gRPC提供的reply功能对上述数据进行回复;具体包括如下步骤:
2.1、建立protobuf数据格式文件
建立protobuf数据格式文件,根据protobuf格式语法,定义数据传输格式,在该数据格式文件中定义gRPC远程服务调用的具体服务名称并指定该服务在request和reply功能中传递数据的传输格式;
2.2、编译protobuf数据格式文件
使用protobuf工具protoc编译在步骤2.1中建立的protobuf数据格式文件,生成protobuf数据格式的C++头文件和源文件;将头文件和源文件拷贝至虚幻引擎项目中,供虚幻引擎使用步骤2.1中定义的protobuf数据格式和gRPC远程调用服务;
2.3、创建“被动监听”的C++基类
在虚幻引擎项目中创建“被动监听”的C++基类,在此基类头文件中引用步骤2.2中生成的头文件;此基类创建为模板类,其模板的参数列表中包含三个虚拟类型参数名,分别用以传入监听处理函数的返回值类型、gRPC远程调用服务的请求类型、gRPC远程调用服务的回复类型;在此C++基类中,创建gRPC中异步服务类的实例指针、服务完成队列类的实例指针、服务异步响应类的实例、请求类实例以及回复类实例作为类变量;在此C++基类中以纯虚函数的形式定义监听处理函数的接口;
2.4、创建每种“被动监听”的gRPC具体服务的C++类
在虚幻引擎项目中为每一种需要虚幻引擎“被动监听”的gRPC具体服务创建C++类,这些类继承步骤2.3中创建的“被动监听”的C++基类,并将该服务所涉及的具体的监听处理函数的返回值类型、gRPC远程调用服务的请求类型、gRPC远程调用服务的回复类型传入步骤2.3中模板的参数列表中;在这些类中,针对不同的需要监听的gRPC服务,给出监听处理函数的具体实现;在监听处理函数的具体实现中,使用基类中创建的类变量异步接收外部程序发送来的具有由步骤2.1定义的protobuf数据格式的数据,并将数据存放至服务完成队列中等待处理;对于服务完成队列中的数据的处理,包含两个步骤:第一,将接收到的外部程序发送数据,提取并转化为监听处理函数的返回值类型返回至函数调用对象;第二,依据所设计的gRPC具体服务需求,将虚幻引擎中的需回复的数据以回复类形式回复外部程序;
2.5、创建“被动监听”的监听服务C++类
在虚幻引擎项目中创建“被动监听”的监听服务C++类;在该类中,利用C++智能指针创建gRPC监听服务类的实例指针,并为步骤2.4中创建的gRPC具体服务的C++类创建服务完成队列的实例指针,将上述实例指针作为该类的类变量;提供监听服务的开始运行和结束运行函数,开始运行函数指定监听端口号,打开gRPC服务监听端口,并绑定各服务完成队列,结束运行函数关闭gRPC服务监听端口,并关闭各服务完成队列;
2.6、创建“被动监听”异步线程的C++基类
在虚幻引擎项目中,创建“被动监听”异步线程的C++基类;该基类通过继承自虚幻引擎提供的异步线程基类实现创建异步线程执行并在异步线程上执行任务的能力;在该基类中,除了虚幻引擎中使用异步线程基类必须设置的默认变量和函数外,额外设置两个类变量:第一个额外的类变量为步骤2.5中创建的“被动监听”的监听服务C++类的类实例指针,该类实例指针通过虚幻引擎提供的共享指针模板类创建;第二个额外的类变量为布尔类型,用以作为监听服务是否已完成的标志位;
2.7、创建每项“被动监听”的gRPC具体服务的异步线程类
在虚幻引擎项目中,为每一项“被动监听”的gRPC具体服务创建异步线程类;该类继承自步骤2.6创建的“被动监听”异步线程基类;在该类中,除继承基类的类变量外,额外设置一个类变量,该类变量为虚幻引擎提供的队列模板类的实例,其实例中数据类型为该类对应的gRPC具体服务C++类中监听处理函数的返回值类型;该异步线程类覆写基类中的异步线程执行函数,在该执行函数中,通过C++的while循环,循环使用步骤2.6中创建的第一个额外变量调用步骤2.4中创建的监听处理函数以处理该异步线程类对应的在步骤2.5中创建的服务完成队列中的数据,每次循环中,处理得到的数据被写入该异步线程类的队列模板类实例变量中,供其它线程读取;该while循环的执行条件,由步骤2.6中创建的第二个额外变量决定:当该变量值为false时执行循环,当该变量值为true时结束循环;
2.8、封装“监听服务开启函数”和“监听服务关闭函数”
在虚幻引擎项目中封装“监听服务开启函数”和“监听服务关闭函数”;在监听服务开启函数中,调用步骤2.5中创建的“被动监听”的监听服务C++类中的开始运行函数,开启监听服务;在监听服务开启函数中使用虚幻引擎提供的异步线程构建函数构建异步线程并执行步骤2.7中创建的gRPC具体服务异步线程类,用以在异步线程上处理监听到的gRPC具体服务中包含的数据;在监听服务关闭函数中,将所有步骤2.7中创建的gRPC具体服务异步线程类中的循环执行标志位设置为true,执行步骤2.5中创建的“被动监听”的监听服务C++类中的结束运行函数关闭监听服务,并删除在监听服务开启函数中构造执行的所有异步线程;
2.9、在C++或蓝图中调用“监听服务开启函数”和“监听服务关闭函数”
在虚幻引擎项目中需要利用“被动监听”进行通信时,通过C++或蓝图调用在步骤2.8封装的监听服务开启函数,实现引擎被动监听外部程序发送的数据,并将有关数据回复给外部程序;当无需继续进行“被动监听”通信时,通过C++或蓝图调用在步骤2.8封装的监听服务关闭函数,关闭被动监听通信。
CN202110523205.8A 2021-05-13 2021-05-13 一种虚幻引擎与外部程序的数据通信方法 Active CN113296979B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110523205.8A CN113296979B (zh) 2021-05-13 2021-05-13 一种虚幻引擎与外部程序的数据通信方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110523205.8A CN113296979B (zh) 2021-05-13 2021-05-13 一种虚幻引擎与外部程序的数据通信方法

Publications (2)

Publication Number Publication Date
CN113296979A CN113296979A (zh) 2021-08-24
CN113296979B true CN113296979B (zh) 2022-10-14

Family

ID=77321838

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110523205.8A Active CN113296979B (zh) 2021-05-13 2021-05-13 一种虚幻引擎与外部程序的数据通信方法

Country Status (1)

Country Link
CN (1) CN113296979B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114500685B (zh) * 2022-01-11 2023-07-21 中国人民解放军国防科技大学 一种适配虚幻引擎应用的第三方通信库桥接方法及系统
CN115576952B (zh) * 2022-11-14 2023-05-26 润芯微科技(江苏)有限公司 一种基于Unreal的车载安卓平台通信结构实现方法

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102082884B (zh) * 2009-11-30 2013-08-14 中国移动通信集团四川有限公司 一种基于3g的音视频协作方法及系统
CN109257339A (zh) * 2018-08-29 2019-01-22 长春博立电子科技有限公司 远程虚拟现实仿真环境的高效交互方法及系统
US10846155B2 (en) * 2018-10-16 2020-11-24 Samsung Electronics Co., Ltd. Method for NVMe SSD based storage service using RPC and gRPC tunneling over PCIe +
CN110321237A (zh) * 2019-07-12 2019-10-11 四川长虹电子系统有限公司 基于grpc及protobuf实现综治工作端系统通信的方法
CN111300412A (zh) * 2020-02-28 2020-06-19 华南理工大学 一种基于虚幻引擎的控制机器人的方法
CN112769938B (zh) * 2021-01-12 2022-08-23 烽火通信科技股份有限公司 一种基于QUIC的Kubernetes云边通信系统与方法

Also Published As

Publication number Publication date
CN113296979A (zh) 2021-08-24

Similar Documents

Publication Publication Date Title
US11216319B2 (en) Intelligent real-time robot operating system architecture and operation method thereof
CN113296979B (zh) 一种虚幻引擎与外部程序的数据通信方法
WO2019042312A1 (zh) 分布式计算系统,分布式计算系统中数据传输方法和装置
US10862982B2 (en) Cloud-scale heterogeneous datacenter management infrastructure
WO2021217529A1 (zh) 一种进程间通信的方法及系统
US5721876A (en) Sockets application program mechanism for proprietary based application programs running in an emulation environment
CN109347884B (zh) 一种实时以太网到现场总线的转换方法及装置、存储介质
WO2015135221A1 (zh) 基于Android的应用层的进程间通信方法及基础应用通信系统
US10303529B2 (en) Protocol for communication of data structures
CN108804238B (zh) 一种基于远程过程调用的软总线通信方法
US10609125B2 (en) Method and system for transmitting communication data
CN108304269A (zh) 一种数据的发送、接收方法、装置及通信框架
WO2023092415A1 (zh) 一种消息处理方法及装置
CN112235357A (zh) 跨平台应用开发系统
CN109729121B (zh) 一种云存储系统及用于云存储系统中实现自定义数据处理的方法
WO2023221644A1 (zh) 一种基于云边协同系统的AIoT设备复用建模化方法
CN106453250B (zh) 一种大数据rpc的处理方法
CN110990169B (zh) 一种利用共享内存进行进程间字节流通信的结构及方法
CN116680209A (zh) 基于wasm的多智能合约实例管理方法
CN113849449A (zh) 一种通信系统和信息交互方法、设备和介质
CN114553980A (zh) 一种控制流与数据流解耦的消息服务方法
CN109800035B (zh) 一种算法集成服务框架系统
CN113778706A (zh) 一种基于amp架构的操作系统核间通信方法
CN109669793B (zh) 中间件进程内对象调用方法
CN114513383A (zh) 基于原始套接字的实时以太网现场总线数据包处理方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant