消息驱动的分布式方案推演引擎设计
2020-08-22田朝晖
田朝晖,陈 清,石 畅
(中国电子科技集团公司第二十八研究所,江苏南京 210007)
0 引言
目前很多大型软件系统采用引擎式设计,例如搜索系统的搜索引擎[1]、游戏系统的游戏引擎[2]、杀毒软件的杀毒引擎等,它们都是将核心基础功能抽离出来形成一个被称为引擎的通用部件,实现组件式开发与集成、控制系统的运转。基于引擎,研发人员可以较为容易地制作相应的软件产品,而不必把资源浪费在重复的基础功能实现上。在推演软件研究方面,一些较为合理的系统[3]、框架[4]设计方案被提出,文章以满足指挥信息系统的需求[5]为目标,分布式设计参考数据-业务-协作架构[6]。
1 模型描述
推演模型中的车辆、飞行器、坦克等作战单元模型都可视为对现实物体的模拟称实体,记为o。
实体模型在推演中的某一时刻有具有它的状态,使用实体属性进行描述,将属性值表示为时间函数记为p(t),其中t为推演时间,将实体状态记为So(t),因此:
将模拟世界本身也视作一个实体并包含属性值,将整个推演模拟世界记为W,世界状态由世界本身属性与所属组成实体属性组成,有:
Sw(t)是时间连续映射,世界状态的第tn时刻取值Sw(tn)确定了该时刻的世界静态信息,Sw(tn)的所包含的信息可唯一确定一个用于计算机屏幕显示的静态图像。我们把Sw(tn)的值称为逻辑帧,把由逻辑帧所确定的静态图像称为显示帧,一个逻辑帧为引擎对时间连续的世界状态的一次采样。
用一类消息表示导致实体状态转换的作用,在数学上对应一个映射,记为e,tn时刻作用于某实体的e使得实体值变换为tn+1时刻的相应属性新值,故有:
将tn时刻的模拟世界消息全集记作E,有E={e1,e2,…,eN},于是引擎逻辑帧推进模型有:tn+1-tn的值称为模拟推演时间步长记作Tstep,Tstep对应的真实时长称为逻辑帧周期记作TL,两个显示帧之间的真实时长称作显示帧周期记为Ts。
推演引擎的核心功能为使模拟世界状态按预定时间步长推进。
2 推演引擎构建
推演系统中各个模拟对象以预设的运动模型、行为模式与规则、预设条件等内容根据当前模拟时刻的实时状态生成各类消息,通过消息中心驱动推演逻辑帧更新实现模拟世界状态更新。
2.1 消息驱动与帧率控制
将消息封装为对象,依据关注事情的不同将消息划分为不同的类型进行相应地处理。在每一个循环开始,各组件由当前的逻辑帧为初始条件,根据各自的规则模式生成相关消息送入消息中间件,在消息分发与处理结果汇总过程中采用了分治策略的Fork/Join设计,使得处理过程支持并行计算,从而提升推演效率,推演引擎工作流程如图1所示。
图1 推演引擎工作流程
时间推进方式采用等模拟时间步长的方式,即每一轮推演循环使得推演模拟时间递增一个预设步长来控制推演过程。即有tn+1=tn+Tstep,这使得推演时间值与现实时间脱离直接关联,控制推演速率仅需要在推演循环中加入等待时长参数即可控制推演速率。因为显示帧数据提取自逻辑帧,逻辑帧未变化时更新显示帧没有意义,因此显示帧周期在max(20毫秒,Tstep)即可满足视觉需求(假定显示帧率上限设置为50 Hz)。帧率控制算法流程如下所示。
0.开始
1.设定逻辑帧周期为TL,设定显示帧周期为Ts,定义变量t0=0,ts0=0;
2.更新逻辑帧获取当前系统时间戳为t1,当t1-t0>TL时设置t0=t1,进入步骤4,否则进入步骤3;
3.推演循环线程等待TL-(t1-t0);
4.获取当前系统时间戳为ts1,当ts1-ts0>Ts时更新显示帧缓冲、设置ts0=ts1;推演帧内数据处理、消息分发、状态更新等操作;
5.判断推演是否结束,是则进入步骤6,否则回到步骤2;
6.结束。
2.2 分布式设计
图2 推演引擎分布式结构
分布式结构如图2所示,引擎的消息中间件需要维护全系统组件引用,因此各节点需要向消息调度模块注册自身,例如一个模拟飞行器实体组件可以简单地向注册服务注册自身加入推演系统,参与收发消息。模拟实体组件采用独立节点部署并注册至消息调度与服务中心,通过远程过程调用(RPC方式)获取数据,通过消息系统更新状态和发送信息。采用这种设计方式,可以配置化实现组件在系统的加入和移除,实现推演系统的可伸缩与模块间低耦合。
针对推演引擎的基本特点,节点数据同步策略采用逻辑帧同步,使得系统在一个逻辑帧周期上实现最终一致性,即在逻辑帧开始,过程管理系统将逻辑帧分发至全节点,在逻辑帧结束过程管理系统接收全节点的数据,汇总处理生成下一逻辑帧,保证在一个新逻辑帧开始后全系统的状态基准最终一致,具体同步过程如图3所示。
图3 推演引擎逻辑帧同步过程示意
3 结语
本文所述的方案推演引擎是推演系统中与推演案例无直接相关的基础结构,它协调控制系统的各组件,根据预设规则及可配置的参数逐步推进模拟世界实体组态,其中状态更新采用消息驱动,并在状态演进处理中应用了分治算法使得系统支持并行计算,在功能划分与部署上采用分布式设计,这使得系统具备可伸缩性与分布式并行计算的能力。这里仅分析研究了推演引擎的核心部分,实现完整的推演引擎还有很多内容有待研究。