Torque引擎系列之核心类(NetObject)

NetObject类
在上篇文章中,我介绍了一下SimObject类,这篇文章主要是介绍一下它的子类。在所有simObject的子类中,NetObject类是最重要的子类,不过其他的类例如SimSet、SimDataBlock、ScriptObject、ScriptClass都是比较重要的类。在介绍NetObject之前,我们先研究一下这几个类。
一、SimSet class
SimSet是一个容器类,准确的来说是一个存储simObject对象的容器类。和所有的容器类一样,该类提供了基本的增加、删除、访问、寻找等操作。内部的实现方式是一个动态数组。使用simset的时候,有几个地方需要注意一下。1、simset容器中的所有元素不是该容器所独有的,就是说一个元素可以被添加到多个simset容器中。2、当一个simset对象destroy后,里面的元素并没有被destroy。从这两点可以看出,simset里面包含的元素实际上都是simobject的指针。添加的时候,只是把指针复制到该容器中。另外从simset类中进化出一个simGroup子类,simGroup与其父类主要的不同点是simGroup类中的元素是独有的,同时只能被一个simGroup容器包含。simGroup添加元素之前首先会检查该元素是否在别的容器中,如果在的话,会先从之前的那个容器中remove掉,然后再添加到当前容器中。simGroup有一个非常重要的子类就是GuiControl,该类是TGE中所有界面控件的基类,以后有机会我会详细介绍一下TGE的界面控件类。
二、simDataBlock class
我们知道,游戏中的对象例如一个player对象,有许许多多的属性,包括名字、生命值、模型、质量、速度、位置等。在游戏中,我们要时时刻刻进行对象的更新,实际上就是对这些属性进行更新。但是我们知道有些属性例如人物的模型、质量、重力加速度等属性是一些固有属性,在游戏过程中不会改变的属性。这些属性只需要在游戏加载的时候一次性进行初始化,以后不需要更新。这些属性抽象出来,就是simDataBlock。该类有几个重要的函数:preload(),packData()、unpackData()。这三个函数中,第一个函数对于服务端和客户端都有用,主要是在加载datablock之前进行属性的错误检查和数据解析。packData函数只在服务端执行,负责发送datablock。unpackData函数在客户端执行,负责接收datablock。
三、ScriptObject class
在脚本中,我们很多时候需要定义一些简单的对象,例如技能对象、任务对象。TGE为我们提供了ScriptObject类,能够方便的让我们定义出自己所需要的对象。ScriptObject中有两个属性非常重要,一个是class,另一个是superClass。下面举个简单的例子说明一下:

  1. new ScriptObject(MyObject) 
  2. {
  3.     class = Bar;
  4.     superClass = Foo;
  5. };
  6. function MyObject::doSomething(%this)
  7. {
  8.     echo("Hi,MyObject!");
  9.     Parent::doSomething(%this);
  10. }
  11. function Bar::doSomething(%this)
  12. {
  13.     echo("Hi!Bar");
  14.     Parent::doSomething(%this);
  15. }
  16. function Foo::doSomething(%this)
  17. {
  18.     echo("Hi! Foo");
  19. }
  20. function Bar::go(%this)
  21. {
  22.     %this.doSomething();
  23.     Parent::doSomething(%this);
  24. }

执行MyObject.doSomething(),输出:"Hi,MyObject!" "Hi!Bar" "Hi! Foo"
执行MyObject.go(),输出:"Hi!Bar" "Hi! Foo"

上面介绍了simObject的几个比较重要的子类,下面我将着重介绍一下netObject类
TGE引擎是一个基于C/S架构的引擎,在这类引擎中。我们要求所有的游戏对象在服务器端进行集中管理,然后在每个客户端进行拷贝。逻辑处理都是在服务端进行,然后把数据更新到每个客户端。为了支持服务端与客户端的这种通信,TGE引用了netObject类。
我们先来看看TGE中服务端与客户端进行通信的流程吧。首先在我们进游戏之前,会有一个加载过程。在这个过程中,服务器会把所有的datablock克隆到所有与该服务器连接的客户端,datablock包括对象的静态属性,即你不需要在游戏过程中进行实时更新的属性。进入游戏后,服务端会有一个管理所有游戏对象的列表,这个列表包括了所有会在游戏中进行更新的对象。当一个客户端的camera进行移动时,会对场景中的物体进行裁剪。从渲染层来看,不在视野范围内的物体是不会被渲染的。当然,这些物体也不需要进行更新。引擎会定时检测摄像机的视野,然后把在视野范围内的对象加入到一个列表中,服务器会发送更新包对这个列表中的对象进行更新,包括对象的位置、动作等等。另外为了提高通信的效率,节省网络带宽,TGE中使用了脏技巧:把对象需要更新的属性分为几类,例如位置、动作、伤害等,每类用一个mask来表示,服务器中某个对象的某类属性需要更新,就把对应的标志位置为脏,然后传送到客户端,客户端根据mask来更新,这样就有效的节省了带宽,提高了性能。
我们了解了TGE中的通信流程后,就能很好地理解netObject类了。该类中最重要的两个函数是packUpdate和unpackUpdate,packUpdate负责服务端发送更新包,unpackUpdate负责客户端接收更新包。这两个函数都是虚函数,netobject的每个子类都必须对该函数进行重写。另外还提供了setMaskBits、clearMaskBits等辅助函数。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值