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

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

事件报文网络

状态报文对象

###报文的实现游戏

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

状态报文只须要保证最终的状态一致,例如玩家的HP,位置等数据,所以能够采用UDP传输,只须要保证最终状态被同步一致便可。字符串

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

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

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

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

####报文的格式能够是: 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后续部分为各类数据。

相关文章
相关标签/搜索