【转】 纯技术帖:MMOG网络同步算法揭秘
http://www.360doc.com/content/12/0723/11/110467_225954142.shtml
来源:网络
概述
游戏发展从单机游戏到局域网游戏再到mmog(Massive multiplayer online game,
即大型多人在线游戏),越来越强调玩家之间的互动。mmog形成互动的前提是游戏中的所有玩家认为他们是在同一个游戏世界中,然而这个同一个游戏世界真的存在吗?答案是否定的,实际上,从不同的维度看,mmog中存在3种不同世界:
真实世界,也就是mmog服务器推演的游戏世界;
玩家自己的世界,是真实世界在玩家自己角度的一个映射;
其他玩家的世界,也就是真实世界在其他玩家角度的一个映射。
连接这3种世界的就是网络,如何通过网络同步这些世界之间的数据?网络存在延时,每个用户的上行/下行带宽有限制,服务器端和客户端计算资源有限,不同mmog类型对于网络同步的要求也是不一样的(例如FPS类型的mmog要求延时尽量短),总之,我们应该根据限制条件和不同mmog类型的特点选择合适的网络同步算法。
概述
游戏发展从单机游戏到局域网游戏再到mmog(Massive multiplayer online game,
即大型多人在线游戏),越来越强调玩家之间的互动。mmog形成互动的前提是游戏中的所有玩家认为他们是在同一个游戏世界中,然而这个同一个游戏世界真的存在吗?答案是否定的,实际上,从不同的维度看,mmog中存在3种不同世界:
真实世界,也就是mmog服务器推演的游戏世界;
玩家自己的世界,是真实世界在玩家自己角度的一个映射;
其他玩家的世界,也就是真实世界在其他玩家角度的一个映射。
连接这3种世界的就是网络,如何通过网络同步这些世界之间的数据?网络存在延时,每个用户的上行/下行带宽有限制,服务器端和客户端计算资源有限,不同mmog类型对于网络同步的要求也是不一样的(例如FPS类型的mmog要求延时尽量短),总之,我们应该根据限制条件和不同mmog类型的特点选择合适的网络同步算法。
网络同步基本算法
MMOG网络同步需要考虑玩家及NPC移动信息同步、视野信息同步及其他状态信息同步,这些信息同步中以移动同步设计最为关键。
设计要点
客户端发出移动请求并附带寻路信息;
客户端发出移动请求的同时,自己立即移动所控制的玩家;
服务器验证路径信息,如果合法则合并存储路径并将路径转发给视野中的其他相关玩家,如果不合法则返回移动位置矫正消息给客户端将其拉扯到server所认为的位置;
玩家的移动速度由服务器控制并通知给相关玩家;
服务器每隔一定时间按照所存储的路径和玩家当前速度以及最后一次移动的时间改变其位置;
在一些特定处理时,例如移动速度改变、与距离相关的操作等,服务器立即计算并改变玩家的位置。
客户端和服务器之间存在网络延时,为解决网络延时带来的同步问题,QQ幻想中引入了移动消息序列号和路径补偿机制。
移动消息序列号机制
当服务器的位置调整协议还没有到达客户端时,网络上仍然有客户端发过来的移动请求消息,而影响服务器逻辑处理。在QQ幻想中通过每个移动同步消息携带一个序列号来解决此问题
服务器发送位置调整协议后,会将接收序列号做个较大幅度的变更,此后收到的移动请求消息如果序列号不同步则直接丢弃;
位置调整协议消息会带有调整后的序列号,这样客户端收到后也更新自己的移动起始序列号。
路径补偿机制
由于客户端和服务器之间存在网络延时,当服务器收到客户端请求包验证通过后进行路径合并时,有两种情况:
假设黑线段是服务器存储的上一次路径,绿线段是最新收到的路径信息,在原路径的(x1,y1)上改变路径。第一种情况是服务器上玩家的位置在(x2,y2),没有到达(x1,y1),这时只需要把新的路径合并进来就可以。第二种情况就是服务器上玩家的位置在(x3,y3),超过了(x1,y1),这时需要把多行走的距离折算到新的路径上,这种情况指的就是服务器的路径补偿,当然补偿的距离应该用速度和时间的乘积计算更准确。
同步算法的改进
上述的移动同步算法并不是QQ幻想的最终版本,在中国存在多家网络服务提供商(ISP),跨ISP通信时,网络丢包率和延时都比较大;当玩家跨ISP进行游戏时,例如网通接入的用户在电信的服务器上进行游戏,由于则被服务器验证路径失败而导致的回扯现象特别严重。
这个问题主要的原因是当玩家跨ISP进行游戏时,我们发现在服务器端特别容易出现粘包现象:
在客户端虽然发送的移动请求有一定的时间间隔,在服务器端收到这个请求时由于网络延时或网络丢包,其间隔与客户端可能不一致。当服务器端只以收到消息包的时间作为请求发生的时间,进行条件判定时会导致一些问题。例如服务器端由于频率限制等原因默认有一个客户端的最小移动请求间隔,如果两个移动请求之间的间隔比这个间隔还小,则认为非法,发出位置调整协议消息调整客户端玩家的位置,出现回扯。
一种解决方式是增加客户端的参考时间戳。客户端的参考时间戳是指客户端发出请求时服务器端对应的映射时间,也就是说客户端角度的世界与服务器的真实世界应该存在一个时间上的映射关系,如果网络延时不变,客户端角度的世界t1时间发生的事件在服务器端真实世界发生的时间是t1',则客户端角度的世界t1+Δt时间发生的事件在服务器端真实世界发生的时间是t1'+Δt。
那么,如何建立这个时间映射关系呢?一般采用的方式就是使用客户端和服务器之间的对时机制。也就是在客户端和服务器建立连接后,使用特殊的对时消息交互获取一个时间上的映射关系。
服务器会对客户端的参考时间戳进行检查,以解决一些同步相关外挂带来的安全问题,例如会检查这个时间戳必须是递增的,时间戳之间的间隔必须大于最小的请求间隔等等。
总结
网络同步是MMOG设计中非常关键的一环,同步设计中视野管理、带宽管理、安全性等问题本文限于篇幅没有逐一展开,抛砖引玉,希望能激发同行对此话题更多的交流和碰撞。
【转】 纯技术帖:MMOG网络同步算法揭秘的更多相关文章
- Web技术的发展 网络发展简介(三)
在上一篇文章中,对TCP/IP通信协议进行了简单的介绍 通信协议是通信的理论基石,计算机.操作系统以及各种网络设备对通信的支持是计算机网络通信的物质基础 而web服务则是运行于应用层,借助于应用层的协 ...
- 2017-2018-2 20155314《网络对抗技术》Exp7 网络欺诈防范
2017-2018-2 20155314<网络对抗技术>Exp7 网络欺诈防范 目录 实验目标 实验内容 实验环境 基础问题回答 预备知识 实验步骤 1 利用setoolkit建立冒名网站 ...
- 20165101刘天野 2018-2019-2《网络对抗技术》Exp7 网络欺诈防范
目录 20165101刘天野 2018-2019-2<网络对抗技术>Exp7 网络欺诈防范 1.实验内容 1.1 简单应用SET工具建立冒名网站 1.2 ettercap DNS spoo ...
- 华为参与《基于5G技术的医院网络建设标准》的制定
[摘要] 5G 千兆网承载五地远程会诊,现场完成三例复杂性疑难重症远程病例讨论 [中国,北京,2019年9月4日] 金秋之际,在国家卫生健康委指导下,由中日友好医院•国家远程医疗与互联网医学中心•国家 ...
- 2018-2019-2 网络对抗技术 20165318 Exp7 网络欺诈防范
2018-2019-2 网络对抗技术 20165318 Exp7 网络欺诈防范 原理与实践说明 实践目标 实践内容概述 基础问题回答 实践过程记录 简单应用SET工具建立冒名网站 ettercap D ...
- 20165214 2018-2019-2 《网络对抗技术》Exp7 网络欺诈防范 Week10
<网络对抗技术>Exp7 网络欺诈防范 Week10 一.实验目标与内容 1.实践目标 理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法 2.实践内容 (1)简单应用SET工 ...
- 2018-2019-2 20165315《网络对抗技术》Exp7 网络欺诈防范
2018-2019-2 20165315<网络对抗技术>Exp7 网络欺诈防范 一.实验内容 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法.具体实践有 简单应 ...
- 2018-2019-2 网络对抗技术 20165322 Exp7 网络欺诈防范
2018-2019-2 网络对抗技术 20165322 Exp7 网络欺诈防范 目录 实验原理 实验内容与步骤 简单应用SET工具建立冒名网站 ettercap DNS spoof 结合应用两种技术, ...
- 2018-2019-2 网络对抗技术 20165212 Exp7 网络欺诈防范
2018-2019-2 网络对抗技术 20165212 Exp7 网络欺诈防范 原理与实践说明 1.实践目标 理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 2.实践内容概述 简单应 ...
随机推荐
- sparklyr-R语言访问Spark的另外一种方法
Connect to Spark from R. The sparklyr package provides a complete dplyr backend. Filter and aggregat ...
- ORACLE-016:ora-01720 授权选项对于'xxxx'不存在
报错的情形如下, A用户:视图V_A B用户:视图V_B,并且用到了V_A C用户:需要用V_B, 授权过程, A用户下: grant select on V_A to B B用户下: grant s ...
- python安装MySQLdb(即mysql-Python)模块的一些问题
1.超时问题 如果出现:ReadTimeoutError: HTTPSConnectionPool(host='pypi.python.org', port=443): Read timed out ...
- 十八、Spring框架(AOP)
一.AOP(基于XML方式配置AOP) AOP(Aspect Oriented Program):面向切面编程.思想是:把功能分为核心业务功能和周边功能. 所谓核心业务功能:比如登录,增删改数据都叫做 ...
- Java 求两个数百分比%
int num1 = 500; int num2 = 312; // 创建一个数值格式化对象 NumberFormat numberFormat = NumberFormat.getInstance( ...
- 在Ubuntu 12.04 上为Virtualbox 启用USB 设备支持
在Ubuntu 12.04 上为Virtualbox 启用USB 设备支持 http://www.cnblogs.com/ericsun/archive/2013/06/10/3130679.htm ...
- laravel中对模型和路由做缓存,提高性能
模型缓存命令: php think optimize:schema 路由缓存命令: php think optimize:route
- Dev-cpp怎样去掉括号匹配?
很多编C/C++的同学在用Dev-cpp的时候,就感觉到括号匹配很烦,又不知道哪里去掉. 所以,让ljn告诉你怎样去掉括号匹配. 1.打开Dev-cpp. 2.在菜单栏上,点击“工具[T]”,选择“编 ...
- UVa 10795 - A Different Task 对称, 中间状态, 数位DP 难度: 3
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- OOP⑵
1.问题? 怎么创建对象? 类名 对象名=new 类名(); 在java中只要是看到了()! 这就是方法! 2.构造方法: 创建某个对象的方法! Student stu=new Student(); ...