游戏服务器与web服务器的不同点在于游戏服务器的数据大部分是实时的内存数据。因为游戏中各个玩家的状态是相互的,同时也是相互影响的。所以很多情况下一个玩家的动作可能会涉及到游戏服务器内的很多操作。
比如,一个玩家登录上线的时候,可能需要向其上线后的周围玩家来广播其上线信息。一些传奇魔域类的游戏,可能还存在战力第一的玩家上线后向所有服务器内所有玩家广播公告的操作。
代码中可能会像这样:
public void onRoleEnter(){
// 广播周围玩家上线信息
doSomeThing()
....
// 检查战斗力排行,是否需要发送全服公告
doSomeThing()
...
// 其他的一些操作
}
通常这样的业务逻辑是没错的,但是,一旦游戏中的功能变的越来越多,即便只在这个方法内去调用各个功能中对于的接口。累积起来的代码量也是很大的。同时也会导致各个模块越来越耦合。
不得不说java spring 的ioc,aot解决方案还是很经典的。通过反射,使得各个模块的加载不在依赖于主逻辑,这样就解耦了一部分的模块。
.net中有一种特性叫事件。实际是通过一种方法指针的语法糖,来构造一个方法字典,这样我就可以通过类似的
funcDc[roleEnter]();
来调用所有注册了roleEnter事件的方法。
所以,综合一下这种方法,我们就可以在主逻辑中创建一个类似方法字典,其他的各个功能模块,在初始化的时候来把自己需要注册的方法来注册进这个字典。然后在自己的功能中来写对应的业务逻辑。