场景与对象

场景与对象

场景与对象RPG游戏的核心,所有的具体业务逻辑都是围绕它们展开的。


场景模型

场景与场景中的对象是一种层级关系体系,如下:

游戏中只有一个SceneManager实例,它保存多个Scene实例,每个Scene又保存多个Obj实例。Role、Monster、Gather都是Obj的具体实现。所有的Obj的生命周期由它所在的Scene管理,所有的Scene的生命周期由SceneManager管理。

而场景又分为静态场景和动态场景,静态场景常驻内存,游戏运行过程中不会销毁,如新手村场景;动态场景是游戏运行过程中动态创建和销毁的,如经验副本场景。

Obj

Obj是所有对象的基类,提供了最基础的属性。其中最重要的一个属性是ObjID,它代表在其场景中的唯一ID,Scene通过ObjID可以获取到Obj对象。在Obj对象被创建的时候,由Scene给它分配一个ObjID。

ObjID实际上是一个数组下标,因此通过ObjID获取Obj对象是很快速的。

ObjID是可以复用的,如果一个Obj对象离开了Scene,那么其ObjID就会被回收利用。

一个常见的编程陷阱是:如果你在其他地方保留了ObjID,那么当对象离开场景前忘记重置(或验证)它,以后就可能操作到错误的对象。

Obj的另一个比较重要的属性是aoi句柄和obser句柄,它是用来管理对象视野的属性,这里暂不介绍。

帧循环

更新场景及其对象状态的方式是通过帧循环,帧循环由底层模块驱动,帧率由serverconfig.xml中的ClockModule/FPS设定,默认3帧每秒,也就是每帧大约333毫秒。

其流程大致为:

World::Update
    SceneManager::Update
        Scene::Update
            Obj::Update

由于Update的执行会消耗CPU,所以当服务器过载时,可能出现丢帧。或者你在断点调试的时候,也会卡帧,导致每帧间隔时间不稳定(大于333毫秒)。

丢帧时,客户端就可能出现延迟现象,比如点击一个按钮,过一段时间才有反应。不过网络不佳也可能出现这种情况。

延迟删除

移除场景或从场景中移除Obj对象时,对象不会马上被销毁(delete),而是放入一个删除列表中,在下一帧删除。之所以要延迟删除,是为了避免迭代器(指针)失效。我们必须调用安全的方法来删除Obj对象,这个方法是:Scene::DeleteObj

猜你喜欢

转载自blog.csdn.net/jonWei/article/details/82319420