我要发帖 回复

管理员

327

主题

4333

积分

15

专家分

兴趣点(最多三项):

视景仿真
地形仿真
高层游戏引擎

私信
发表时间 : 2008-9-6 10:05:03 | 浏览 : 6297    评论 : 5
HLA(High Level Architecture:高层体系结构)的诞生是为了满足了大规模复杂系统的迫切需求,目前不但在军用领域得到了广泛的应用并在民用领域展示出了广阔的应用前景。而RTI(Run Time Infrastructure:运行支撑环境)作为他HLA的重要组成部分,一直是HLA实现的核心内容。RTI原形系统开始于1995年底,到现在已经整整10年了,就像windows编程世界里WIN32 API被MFC所替代一样,通过直接编写繁琐的RTI代码来实现HLA的开发人员正逐渐减少,这是软件界不变规律,也是历史发展的必然结果。对于绝大多数HLA应用开发人员来说,并不希望也不需要对花过多的时间去理解RTI的细节,而更愿意在应用本身上多下功夫,编程只是实现的手段,实现过程当然越简单越好。既然市场有这个需求当然就会有相应的产品,从DIS时代开始,MAK的VR-Link就给开发者提供了这样一个产品,它也成为了国际市场上此类软件的佼佼者,事实上VR-Link已经使得大量的HLA应用程序开发者在对RTI并不十分了解的情况下编出了可靠而功能强大的HLA应用。下面就以MAK的VR-Link为例说明一下RTI中间件的工作方式,需要补充说明的是,VR-Link并不是RTI的替代品,VR-Link是RTI与用户应用程序之间的中间件,开发者只需要调用简单的VR-Link API就可以完成HLA的实现,而烦琐的RTI函数都交给VR-Link去调度。   

什么是VR-Link?

    VR-Link 是一个面向对象的C++工具包,它使得仿真开发人员可以方便快捷的进行HLA或DIS应用开发。 它提供了一系列的类库,用于执行实现HLA和DIS的可靠、稳定的API (应用程序接口) 。当你使用VR-Link时,你可以专注于你的应用,而不用花太多的时间去担心网络传输的细节。少量的VR-Link函数调用可以替代数千行的RTI代码,在开发和维护过程中为你节省了时间和金钱。
    VR-Link的顶层API与网络协议无关。例如,应用程序设置本地实体和对象的状态时,所有被需要的数据都会通过HLA RTI或DIS网络自动的送往其它的应用程序。在接受方,VR-Link 处理所收到的信息并提供一个远程对象的当前状态接口,应用程序甚至不需要知道更新到达的时间。
    VR-Link是RTI代码自动生成软件吗?
    不是。现在有很多的RTI代码自动生成软件,这类软件可以通过fed文件自动生成RTI代码,所生成的RTI代码只是一个不包含任何应用程序流程的一个联邦成员框架。对于HLA应用程序开发者而言,如果他们选择使用RTI自动代码工具,还是需要掌握繁琐的RTI内容,而且并不能减轻应用程序本身的逻辑的开发工作量。在后期维护方面,由于RTI代码自动生成软件所生成的代码需要考虑到通用性,所生成的代码往往比手写RTI代码更加繁琐,而且在程序出错时也不容易找到错位来源。于RTI代码自动生成工具不同,VR-Link是一套类库,有着功能强大而又简洁方便的API,使用VR-Link所编写的应用程序代码中可以不包含任何的RTI函数,当然VR-Link也提供了RTI的函数接口,不过在绝大多数情况下你都不需要使用它。使用VR-Link开发基于HLA的应用程序时,开发人员之需要了解一些RTI的基本概念例如:联邦,联邦成员,发布,订购等。当然与RTI代码自动生成工具相比VR-Link也有自己的弱点,由于VR-Link使用的是自己的API,并有着一套独特的框架结构,在使用前,开发人员需要一段时间来学习如何使用它,当然学习VR-Link要比理解RTI要容易的多,如果你已经掌握了RTI,那么这一学习过程将会更加轻松而短暂。
    VR-Link只是RTI与应用程序的中间件吗?
这个问题就如同问“MFC是否只是Win32 API的中间件?”一样,当然不是。VR-Link不但可以使用简洁的API调用复杂的RTI函数,还增加了许多新的功能,以方便分布式仿真应用程序的开发,任何使用VR-Link可以实现的功能都能过使用RTI函数来实现,但是实现过程将会十分复杂,如果你选择直接使用RTI,那么你将花费更多的时间和精力。

VR-Link的API长什么样?
    回答这个问题最好的方法就是给你展示一个简单的VR-Link例子。这个例子的主要功能是从网络中读取数据:
Listen-Only Example:

[cpp]1 // Define a callback to process fire interactions
2 void fireCb(DtFireInteraction* fire, void* usr)
3 {
4 printf("Fire Interaction from %s\n", fire->attackerId().string());
5 }
6
7 int main()
8 {
9 // Create a connection to the exercise or federation execution
10 #if DtHLA
11 // Pass executionName and federateName
12 DtExerciseConn exConn("VR-Link", "VR-Link listen");
13 #else
14 // Pass port number, exerciseId, siteId and application number
15 DtExerciseConn exConn(3000, 1, 1, 15);
16 #endif
17
18 // Register a callback to handle fire interactions
19 DtFireInteraction::addCallback(&exConn, fireCb, NULL);
20
21 // Create an object to manage remote entities.
22 DtReflectedEntityList rel(&exConn);
23
24 while (1)
25 {
26 // Tell VR-Link the current value of simulation time
27 exConn.clock()->setSimTime(exConn.clock()->elapsedRealTime());
28 // Process any incoming messages
29 exConn.drainInput();
30
31 // Find the first entity in the reflected entity list
32 DtReflectedEntity *first = rel.first();
33
34 if (first)
35 {
36 // Grab its state repository, where we can inspect its data
37 DtEntityStateRepository *esr = first->entityStateRep();
38
39 // Print the position
40 printf("Position of first entity: %s\n", esr->location().string());
41 }
42
43 // Sleep till next iteration
44 DtSleep(0.1);
45 }
46 }

[/cpp]
代码一共46行,这46行中还包括了详细的注释,以及对DIS的兼容和打印程序的运行结果。而核心代码也就10行左右。与直接使用RTI相比,VR-Link大大减少了编码工作量,所编写的代码可读性更强,更利于日后的扩展和维护。下面我们对这些代码作一个简单的说明:
    1.加入联邦
    代码的10-16行创建了一个DtExerciseConnection,它是本联邦成员与联邦的接口。对于基于HLA的应用程序,只需要将联邦和本联邦成员的名字作为参数加入即可。
    2.管理状态和交互信息
    第2行定义了一个用户处理开火交互的回调函数fireCb,在第19行将这个回调函数注册到本联邦成员。这样我们就实现了对开火交互的订购并响应。
    3.跟踪实体
    在22行我们创建了一个影射实体列表rel,用于跟踪记录在网络中找到的实体。除完成订购工作外,Rel还负责跟踪实体的到达和离开,并进行航路推算,管理超时等工作。
    4.从网络中读取数据
    在每一个循环的开始,为VR-Link设置当前的仿真时间(第27行)。drainInput()函数的调用(第29行)读取并处理从联邦中收到的任何的消息,它将会触发所有你事先注册好并需要运行的回调函数。在HLA中,这也是RTI的到tick的地方。在程序第32行,程序获得实体列表中的第一个实体,然后在程序的第37行得到指向实体状态库的指针。在程序的第40行,进行航路推算并打印出实体的位置。

最近VR访客

stephencc 评论于2009-10-21 00:39:35
谢谢分享
水影心 评论于2011-2-27 20:23:18
支持一下,刚接触,不是很懂
chenergang 评论于2011-4-16 14:18:52
谢谢分箱、
99daodan 评论于2011-6-1 12:57:52
这个东西编起来的确简单,主要是集合了DIS和HLA的思想。老外的思考能力就是强,咱们咋没有想到呢
optimuslw专家组 评论于2013-1-24 19:47:55
谢谢共享

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-4-18 10:06 PM

返回顶部