场景服务--MMO服务器开发技术点记录
场景服务--MMO服务器开发技术点记录
Service / 服务
服务器其实也可以称为一个服务,为客户端提供某些功能。通常一个服务会运行在一个端口上供客户端访问。像下面我们要深入的场景服务,是一个独立运行的单点服务。游戏服务器涉及的服务通常还包括登录服务,大厅服务等。服务类继承自TcpServer类,属于应用层,与网络层解耦开来。这里可以设计一个连接器的接口,实现服务可以自定义所需的通信协议,如TCP、UDP、Websocket等。
场景服务
什么是场景服务?客户端的同学都知道,Unity中有个专门的部分称为场景,负责呈现游戏玩家所处的环境。服务器的场景也是如此,需要提供一个场景,玩家在场景中能够看见彼此,观察到这个共享的环境。后续玩家的事件,如移动、战斗、交互都会发生在场景中,影响场景的状态。
场景服务的第一个作用:消息处理函数网关, 在我们的MMO服务器架构中,场景服务是中心服务,是服务器网络流量的第一入口。来自客户端的请求将在这里进行解析、分发、处理。在ECS架构中,位于system的位置。
网络层接收到数据解析成string数组后,会获取场景服务,将数据丢到场景服务的消息处理函数。场景服务在这里解析消息,并进行消息分发和处理。我们这样设计消息分发机制,设计通用的消息处理函数类型,用Map维护。
1
2
3
4
using MsgHandler = void (SceneService::*) (TcpConnection*, const std::vector<std::string>&);
std::unordered_map<std::string, MsgHandler> _msg_2_handler_map;
std::unordered_map<std::string, MsgHandler> register_msg_handlers();
MsgHandler get_msg_handler(const std::string& msg_type);
场景提供的服务多种多样,根据游戏的需求来确定。这里简单举个例子,就拿我们的进出场景服务来说,进出场景服务是场景需要提供给客户端的基本服务。
- 玩家加入场景,场景服务将玩家实体添加入场景的玩家集合,初始化玩家的MoveComponent,并将MoveComponent序列化后封装进JoinReply发送回客户端;这是简单的加入场景的逻辑;
- 玩家退出场景,场景服务将玩家实体从场景的玩家集合中移除,并将LeaveNotify发送给其他玩家,通知他们该玩家已离开场景;
写好join和leave函数后,将它们注册到消息处理函数网关中。
场景服务的服务注册流程大致就是这样。
This post is licensed under CC BY 4.0 by the author.