您的位置:首页 > 理论基础 > 计算机网络

网络游戏服务器中事件和状态

2016-05-10 00:00 429 查看
摘要: Actor,游戏服务器,skynet

###网络游戏中传递的报文,主要分为两种:

事件报文

状态报文

###报文的实现

事件需要保证顺序,可靠,例如玩家使用某个技能,而事件通常可以采用类似 RPC的方式来实现,事件报文的传递,采用类似于TCP的协议来进行。

状态报文只需要保证最终的状态一致,例如玩家的HP,位置等数据,因此可以采用UDP传输,只需要保证最终状态被同步一致即可。

通常某个事件发生,会影响状态,例如玩家命中目标这个事件,会影响目标HP状态的变化,通常事件和状态的同步分离进行。

而在某个事件发生的时候,需要使用一些玩家的状态参数,例如使用技能时刻,玩家所在的位置和朝向这个状态数据是需要的。

可以将游戏按照服务器离散帧来划分,例如服务器50ms一帧,这样只需要知道事件执行所在的游戏帧,而客户端知道在该帧时刻,玩家的状态数据,这样就减少了事件命令需要同步的数据了,但是增加了客户端存储的数据量,客户端需要存储多帧的玩家状态。

同时在命令和状态同步,需要为数据增加相应的服务器帧编号。

####报文的格式可以是:
length 报文长度

moduleId, msgId 报文的模块和msg编号

flowId 报文的流ID

frameId 报文的服务器帧ID

body 报文体数据

其中flowId 是为了实现 请求响应模式;

而frameId 即为服务器帧id,一般只有服务器对客户端发送。

可以缩减固定包头的长度,将flowId 放置到body协议内,使用protobuf的 optional 字段,对有需要的报文才使用 flowId;

moduleId, msgId, 对于网络协议,可以每个协议定义一个protobuff message对象,这样需要使用 moduleId和msgId来区分不同协议;

也可以在 body区域的 protobuf使用一个大一统的pb message,在这个message 头部定义一个字符串,使用字符串来区分不同的协议,而message后续部分为各种数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: