多人在线游戏,客户端服务器间同步低延迟方案(译)

原文:https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

输入预测

假设玩家的网络延迟为150毫秒,并开始向前移动。该按键命令发送到服务器。用户命令被处理,并且玩家的角色在游戏世界中向前移动。这个状态更改将通过下一次快照更新传输到所有客户端。所以玩家在开始走路之后,会在150毫秒的延迟时间后看到自己的动作变化。这种延迟存在于所有玩家的行动,如运动,射击武器等,并且随着更高的延迟而变得更糟。玩家输入和相应的视觉反馈之间的延迟会产生奇怪的,不自然的感觉,并且使得难以精确地移动或瞄准。

客户端输入预测(cl_predict 1)是一种消除这种延迟的方法,让玩家的动作感觉更加即时。而不是等待服务器更新自己的位置,本地客户端只是预测自己的用户命令的结果。因此,客户端运行与服务器完全相同的代码和规则,便于服务器验证用户命令。预测完成后,本地玩家将立即移动到新位置,而服务器仍然在旧位置看到他。

150毫秒后,客户端将根据他之前预测的用户命令接收包含更改的服务器快照。然后,客户端将服务器位置与他的预测位置进行比较。如果它们不同,则发生预测错误。这表示客户端在处理用户命令时没有获得其他实体和环境的正确信息。然后,客户端必须纠正自己的位置,因为服务器具有决定客户端预测是否准确的最终权限。如果cl_showerror 1打开,客户可以看到预测错误发生。预测误差校正可能非常显著,可能导致客户端的视图不规律地跳动。通过在短时间内逐渐纠正这个错误(cl_smoothtime),可以顺利地纠正错误。cl_smooth 0

只有当他们受到影响的本地玩家和实体才能进行预测,因为可以通过使用客户的按键来做出玩家最终的“最好的猜测”。无法预测其他的玩家。

滞后补偿

源代码SDK中提供了用于滞后补偿和视图插值的所有源代码。查看实施细节的滞后补偿

假设玩家在客户端10.5射击目标。发射信息被打包成用户命令并发送到服务器。当数据包正在通过网络时,服务器继续模拟世界,目标可能已经移动到不同的位置。用户命令到达服务器时间10.6,并且服务器将会检测到未命中,即使玩家完全瞄准目标。该错误需要服务器端滞后补偿进行纠正。

滞后补偿制度保存了所有近期一秒钟内玩家的历史位置。如果执行了用户命令,则服务器估计创建命令的时间如下:

命令执行时间 = 当前服务器时间 - 数据包延迟 - 客户端视图插值

然后,服务器将所有相关玩家 - 移动到他们在命令执行时间的地方。执行用户命令并正确检测命中。用户命令处理完毕后,玩家将恢复到最新的位置。

注意:由于实体内插值含在方程式中,因此不启用该选项可能会导致不正常的结果。

举个例子:

该屏幕截图是net_fakelag在服务器确认命中之后,在具有200毫秒延迟(使用)的监听服务器上拍摄的。红色的hitbox在客户端显示100ms + interp之前的目标位置。此后,当用户命令发往服务器时,目标继续向左移动。用户命令到达后,服务器根据估计的命令执行时间恢复目标位置(蓝色命中框)。服务器确认命中(客户端看到血液效应)。

思考:

由于时间测量中的精确度误差小,客户端和服务器的命中框不完全匹配。即使是几毫秒的小差也可能导致快速移动物体几英寸的误差。多人攻击检测不是像素完美的,并且基于运动对象的滴答率和速度已知精度限制。

问题出在了,为什么命中检测在服务器上这么复杂?在点击检测时,对玩家位置执行后跟踪和精度处理错误,可以通过客户端方式更轻松,并更精确。客户端只是告诉服务器一个“命中”消息什么玩家被击中和哪里。但是我们不能容忍,因为游戏服务器不能信任客户端这样重要的决定。即使客户端“干净”并受到Valve Anti-Cheat的保护,也可以在第三台机器上修改数据包,同时路由到游戏服务器。这些“欺骗代理”可能会在VAC(“中间人”攻击)中察觉到“打”消息到网络包中。

网络延迟和滞后补偿可能产生与现实世界似乎不合逻辑的矛盾。例如,你可以被一个甚至不能再看到的攻击者击中,因为你已经被盖了。发生了什么事情是,服务器将您的播放器命中的时间推迟回来,您仍然暴露在您的攻击者身上。由于数据包速度相对较慢,这种不一致性问题一般无法解决。在现实世界中,你不会注意到这个问题,因为光(包)行进得如此之快,你和你周围的人都看到与现在相同的世界。

附:一种计算客户端服务器间网络延迟的方法

客户端想服务器发送一个请求,同时客户端记录下当前时间:sendTime
这个请求服务器收到以后不做任何处理,直接返回给客户端。客户端收到以后再次记录当前时间:receiveTime
网络延时就是: (receiveTimer - sendTime)/ 2

服务器方的计算方法同理。

服务器端的工作简介:针对客户端的命令,验证当前位置是否合法,目标位置是否可达并修正(碰撞检测),玩家操作延时补偿,

时间: 2025-01-02 02:43:47

多人在线游戏,客户端服务器间同步低延迟方案(译)的相关文章

快节奏多人在线游戏网络入门系列教程(3):实体插值

简介 在第一篇文章中,我们介绍了权威服务器的概念和其防作弊的能力.然而,该框架简单的实现会导致一系列糟糕的响应性和可玩性.在第二篇文章中,我们介绍了客户端预测与服务器协调技术来克服这些缺点. 这两篇文章使用的技术使得单一玩家在在网络游戏上能够获取和单机游戏一样的游戏体验,即使在因特网具有一定延迟的情况下. 本文,我们将讨论多个玩家连接同一个权威服务器的情况. 服务器时间步长 上一篇文章中服务器的行为非常简单--读取客户端输入,更新游戏状态,返回给客户端.然而当有多个客户端存在的情况下,服务器的主

大型多人在线游戏服务器架构设计

由于大型多人在线游戏服务器理论上需要支持无限多的玩家,所以对服务器端是一个非常大的考验.服务器必须是安全的,可维护性高的,可伸缩性高的,可负载均衡的,支持高并发请求的.面对这些需求,我们在设计服务器的时候就需要慎重考虑,特别是架构的设计,如果前期设计不好,最后面临的很可能是重构. 一款游戏服务器的架构都是慢慢从小变大的,不可能一下子就上来一个完善的服务器构架,目前流行的说法是游戏先上线,再扩展.所以说我们在做架构的时候,一定要把底层的基础组件做好,方便以后扩展,但是刚开始的时候留出一些接口,并不

快节奏多人在线游戏网络入门系列教程(4):爆头!滞后补偿

简介 距离我上次发表上一篇文章已经过去了很长很长时间(2年...),出乎我的意料,我收到了很多邮件来询问我"下一篇文章".好吧,这就是我的下一篇文章--延时的时间一致性,或者简单的说,爆头:) 回顾 前面3篇文章解释了客户端-服务器架构的内容可概述为: 服务器收到客户端的输入,包含时间戳: 服务器处理输入并且更新游戏状态: 服务器发送游戏状态给所有客户端: 客户端发送输入并在本地进行模拟运算: 客户端收到服务器发回的世界状态并且: 把本地的世界状态同步为权威世界状态: 利用已知的状态对

多人在线扑克游戏源码带服务端完整版

多人在线扑克游戏源码带服务端完整版,本项目源码是一套网络版的扑克牌项目源码,带服务器端源码,服务器端也是用java做的,打开游戏以后需要配置IP服务器端的IP和端口,服务端默认监听9999端口,客户端ip填写10.0.2.2,端口信息不用管直接点连接就可以连接到电脑上的服务端.项目源码注释比较丰富,可以研究一下里面的算法之类的.搭建这个服务端环境废了我半天劲,不知道是不是我运行的方法不对,打开前两个游戏客户端没有问题,打开第三个就开始直接强制退出.游戏没玩成所以没有截那部分的图.<ignore_

rsync+inotify实现服务器间文件的实时同步

rsync虽然可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了我的需求,同步数据实时性的问题,下面便看我娓娓道来. 一) lists Ip Status Cp  PATH App 192.168.1.1 Server /data Rsync-server 192.168.1.2 Client /OM/logs/data Rsync-client+

Rsync服务配置详解,实现服务器间数据同步!

1.1 什么是rsync? rsync是Unix下的一款应用软件,它能同步更新两处计算机的文件与目录,并适当利用差分编码以减少数据传输.rsync中一项与其他大部分类似程序或协议中所未见的重要特性是镜像对每个目标只需要一次传送.rsync可拷贝/显示目录属性,以及拷贝文件,并可选择性的压缩以及递归拷贝. 在常驻模式(daemon mode)下,rsync默认监听TCP端口873,以原生rsync传输协议或者通过远程shell如RSH或者SSH伺服文件.SSH情况下,rsync客户端运行程序必须同

服务器1M带宽同时能承受多少人在线

1,首先要知道影响在线人数的因素访问量,毋庸置疑,访问量越大,占用的带宽越大,网站类型:如果是出文字的网站(如小说站),1M带宽带动日均5000IP,还勉强.如果是普通网站有图片,有文字.论坛.新闻资讯类型网站 大概1M能带一千IP.考虑到高峰期并发,1M高峰期还会卡.[最低配 单核CPU+512内存.1千IP CPU占用10%左右,内存200到300之间].比如华省省博客www.huashengsheng.com用的是1M的阿里云服务器,每天接受访问量5000IP正常打开! 2,下面根据影响因

C#中国象棋+游戏大厅 服务器 + 客户端源码

来源:www.ajerp.com/bbs C#中国象棋+游戏大厅 服务器 + 客户端源码 源码开源 C#版中国象棋(附游戏大厅) 基于前人大虾的修改版 主要用委托实现 服务器支持在线人数,大厅桌数的设置 游戏互不干扰 这个象棋大厅程序完全可以当做是C#委托事件的教程,而且游戏大厅功能也很多,服务器还可设置人数和桌数,大厅客户端也实时更新相关数据. 源码下载地址:http://www.ajerp.com/bbs/forum.php?mod=viewthread&tid=29&extra=pa

多学一点(十四)——服务器间通过rsync和inotify-tools动态同步数据

Linux 下的 rsync 命令非常强大,多用来同步不同服务器上的数据同步.以前我们通常使用 crond 来实现,但 crond 很难做到实时同步.下面介绍一种方法,通过在脚本中结合使用 inotify 及 rsync实现数据实时同步. 1.安装 rsync: [[email protected] ~]# yum install -y openssh-clients rsync 这里要注意两点,一是进行同步的两台服务器上均需安装 rsync ,二是 rsync 需要依赖 openssh-cli