当初在设计消息处理的时候,考虑的是网络层与业务逻辑层分离,即网络层只管手法数据,消息处理就不管了。
而对于消息处理,在最初设计的时候,并没有一个统一的方法来管理消息,而是丢给各个模块来处理。为什么说是丢给各个模块呢?
当初在设计消息结构的时候,消息ID并不是采用单一变量,而是一个由2个byte组合的组合变量,一个byte表示是哪个模块,另外一个byte是消息ID,当然这个消息ID的数字可能重复,但是和前面的模块byte组合起来就是一个唯一值了。按照前面的说法,因为消息是分模块的,因此在消息处理流程上,是先丢给当前用户所在的区域(city)由它来负责消息的解析,在city类里,根据消息的模块,再将消息传入具体的处理模块(DoMsg),在每个模块里又有一个消息处理函数,这时负责对消息进行必要的处理,并调用最终的处理逻辑函数。
这样的处理方法,在现在看来,有点繁琐,主要是对于最终消息和对应的处理函数的对应上,会走过很多路,并且在对象设计上,每个逻辑处理对象里都可能包含消息的分类函数,对类的职责显得不够清晰。因此在下一个阶段处理就是将消息处理和逻辑处理分离开,当消息发送到服务器端后,通过一个消息分发函数,直接可以让游戏消息调用到具体的业务逻辑。
原消息处理代码:
server/GameServer/city.cpp
未来的消息处理流程参考: