(转)Delta3D源码分析
最近学习Delta3D, 2.4版忙着发布,一直不能成功编译SimCore, 索性静下心来看看源码,官网上竟然提供了几个重要组建的软件设计说明书(SDD),虽说基本都是2005版了,不过我看了后觉得主要构架仍然没有改变, 这几份SDD对于学习Delta3D具有很好的参考价值。
分析源码要从顶层着手,所以在看了GM部分的SDD后,我翻出源码看了下,顺便画几张序列图,算是做个笔记。
分析主要根据TankTargetTutorial(这也是我现在唯一能跑的DEMO),源码版本是09-10-12日的SVN。
Delta3D上层构架主要由 GameManager, GameActor, GameActorProxy, Components这几个组建构成:

总体构架图
GameManage: 统一管理游戏中的各种资源。完成程序运行时消息处理配送等重要工作,是一个枢纽类

GM处理消息
GameActor:主要是游戏中的实际对象,如坦克,飞机等,它需要完成处理与自己相关的消息,更新自我状态等任务。
GameActorProxy: 和GameActor是一对一的关系,既用户每定义一个GameActor,就需要定义一个预期相关的GameActorProxy。其主要任务是提供一个统一的对GameActor的各个属性进行存取操作的接口。接口的统一方便了GM的实现。同时在GM构架中GameActorProxy还起到了消息处理中间层的重要作用。
Components: 是一些游戏的辅助系统,主要功能是在一个较高层次上统一对系统中的信息进行处理(如实现网络通信,用户输入处理等)。
简单的说,使用Delta3D编写游戏,我们只需要实现自己的GameActor,以及Components以完成本应用需要的特定任务,然后按照一定的接口规范将其交给GM管理即可。我们来看一下大致的情况
第一步: 导入Actor
在现有系统下,Delta3D要求用户将自己的GameActor编译成插件形式(Windows下为DLL文件),进而实现能动态载入系统的功能。

导入Actor
第二步:创建Actor
通过第一步我们将GameActor集以插件的形式导入进来,这时程序就可以创建我们需要的GameActor对象了。

创建Actor
第二部为AddCreate, 这一步可以理解为将得到的Actor对象加入到游戏场景中。在这一步我们需要完成该GameActor对象的初始化操作, 最重要的任务是对该GameActor需要处理的消息注册到GM中。这一步也是由用户完成的,这样加强了一定的灵活性。
第三步:消息处理流程
有了上面两步,这一步基本上就是Delta3D自己的事情了,我们来看一下Delta3D是如何处理消息的。

消息处理
然而Delta3D也提供了一定的灵活性,允许GameActor自己同时也维护一个消息和自身的映射表来更灵活的处理消息。如流程2是所示。Delta3D有两套消息处理框架,一套是较低层的以Application类为核心的处理机制,大部分源码包中的Example采用该机制。 一套是较高层的以GameManager类为核心的处理机制,为源码中的Demo所采用。
所有基于Delta3D的程序都要有一套Application处理机制,我们来看下它的实现。

类图
程序运行时,GameApplication除了完全照搬执行Application的消息循环外,还通过GM进行高层消息处理循环,也即其同时拥有两套消息机制。
需要注意的是,GM继承自Base,他在构建时向System类进行消息注册,可以直接和系统底层消息队列打交道。

接口类图
Delta3D通过Scene类进行场景管理,可以看到Scene和View继承自Base,因而也都拥有了接受,发送低层消息的能力。 因为Delta3D在低层内置了ODE进行物理模拟,Scene类在初始化时向System进行了注册,现在主要是进行接受每帧System发出的消息,调用ODE接口完成物理计算操作。而View类没有通过封装osg::View进行相关视口显示工作,没有重载OnMessage函数,因而不接受消息,主要工作配合Application类处理用户交互的输入。
程序启动时, 有关函数进行关联操作,来看下序列图:

Scene启动配置
(转)Delta3D源码分析的更多相关文章
- ABP源码分析一:整体项目结构及目录
ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...
- HashMap与TreeMap源码分析
1. 引言 在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...
- nginx源码分析之网络初始化
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
- zookeeper源码分析之五服务端(集群leader)处理请求流程
leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- zookeeper源码分析之三客户端发送请求流程
znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...
- java使用websocket,并且获取HttpSession,源码分析
转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...
- ABP源码分析二:ABP中配置的注册和初始化
一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...
- ABP源码分析三:ABP Module
Abp是一种基于模块化设计的思想构建的.开发人员可以将自定义的功能以模块(module)的形式集成到ABP中.具体的功能都可以设计成一个单独的Module.Abp底层框架提供便捷的方法集成每个Modu ...
随机推荐
- 里氏替换原则(Liskov Substitution Principle,LSP)
肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑.其实原因就是这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的. 定义1:如果对每一 ...
- SpringMVC request生命周期
When the request leaves the browser, it carries information about what the user is asking for. At ve ...
- 从零开始学C++之模板(三):缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename
一.缺省模板参数 回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: temp ...
- Java vs C++ (7)导入
用法 import VS include Java import java.util.regex.Pattern; package com.slim; (1)假设少了; 会warning: C++ ...
- Go语言之进阶篇实现并发聊天功能
1.并发聊天服务器原理分析 2.并发聊天室 功能: 广播消息.广播上线. 查询在线用户.修改用户名.用户主动退出.超时处理 示例: package main import ( "fmt&qu ...
- go语言之进阶篇定时器Timer的使用
1.Timer的使用 示例: #创建一个定时器,设置时间为2s,2s后,往time通道写内容(当前时间) package main import ( "fmt" "tim ...
- Remove Duplicates from Sorted Array II leetcode java
题目: Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For e ...
- 华为推送 简介 集成 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 大数据开发实战:Stream SQL实时开发三
4.聚合操作 4.1.group by 操作 group by操作是实际业务场景(如实时报表.实时大屏等)中使用最为频繁的操作.通常实时聚合的主要源头数据流不会包含丰富的上下文信息,而是经常需要实时关 ...
- 【转载】.NET/C#-uploadify视频文件or大文件上传
引言 之前使用Uploadify做了一个上传图片并预览的功能,今天在项目中,要使用该插件上传大文件.之前弄过上传图片的demo,就使用该demo进行测试.可以查看我的这篇文章: [Asp.net]Up ...