网络游戏服务器中事件和状态
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后续部分为各种数据。
###网络游戏中传递的报文,主要分为两种:
事件报文
状态报文
###报文的实现
事件需要保证顺序,可靠,例如玩家使用某个技能,而事件通常可以采用类似 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后续部分为各种数据。
相关文章推荐
- Python网络爬虫基础知识学习
- 用Fiddler模拟低速网络环境
- 传感器网络的应用层技术
- HttpSession笔记
- 96_网络框架Volley
- 网络
- 网络dos
- 为什么udp为什么不能发送大于1472字节数据
- 网络带宽和吞吐量throughput的关系
- 【Java8网络编程】第2章.Java中的URL和URI
- 关于网络编程
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- linux网络流量监控工具之iptraf
- Android Http请求头与响应头的学习
- 关于HTTP_CLIENT_IP,HTTP_X_FORWAR
- php http请求 curl方法
- OKHttp3的使用,自己项目实战经验
- ArchLinux安装VMware后网络无法连接
- CentOS---网络配置详解
- 127.0.0.1、192.168.0.111、本机地址、URL