简介

距离我上次发表上一篇文章已经过去了很长很长时间(2年。。。),出乎我的意料,我收到了很多邮件来询问我“下一篇文章”。好吧,这就是我的下一篇文章——延时的时间一致性,或者简单的说,爆头:)

回顾

前面3篇文章解释了客户端-服务器架构的内容可概述为:

  • 服务器收到客户端的输入,包含时间戳;
  • 服务器处理输入并且更新游戏状态;
  • 服务器发送游戏状态给所有客户端;
  • 客户端发送输入并在本地进行模拟运算;
  • 客户端收到服务器发回的世界状态并且:
    • 把本地的世界状态同步为权威世界状态;
    • 利用已知的状态对实体进行插值;

玩家视角中的2个重要因素:

  • 玩家看到的自己处于现在时;
  • 玩家看到的其他实体处于过去时;

这种情况通常是没问题的,但是在时空敏感的时间上变得极其糟糕——比如爆头其他玩家的情况!

延迟补偿

现在你用你的狙击枪完美瞄准了你的敌人的头部,你开枪了,这理应是一枪完美的爆头!然而你miss了。
为什么?
因为在本文所描述的网络架构中,你瞄准的是100ms之前的敌人的头部。在你扣下扳机的瞬间,敌人已经跑远了。
辛运的是,我们有一个相对简单的解决方案来解决绝大部分此类问题(除了一个例外,后文会讨论)
解决方法如下:

  • 当你射击的时候,客户端发送射击事件给服务器,同时包含了射击事件准确的时间戳,以及武器准确的瞄准位置。
  • 这是最重要的一步。由于服务器具有所有输入的时间戳,因此可以精确重建游戏世界中任何时间点的状态。特别的,可以重建在任何客户端视角下的任何时间点的状态。
  • 这意味着服务器精确的知道你的武器开火瞬间的世界状态。在服务器的视角,是敌人在“过去”时候的头部的位置,但是同时也是你“现在”瞄准的位置。
  • 服务器在你开火的时间点上处理射击事件,并通知客户端。

于是皆大欢喜了!
服务器开心是因为他是服务器,服务器总是开心的。
你也开心了,因为你瞄准了敌人的头部并射击了,然后成功爆头了!
或许被爆头的敌人是唯一不开心的了。如果他站在原地不动,则被爆头;如果他移动了…那你真是一个优秀的狙击手。
但是,如果你开枪的瞬间之后(几分之一秒),他躲到了墙后面,还觉得他安全了呢?
恩,这是有可能发生的,这就是这种解决方案所付出的代价。因为你射击的是他几分之一秒前的位置,因此他仍然会被爆头。
看上去不太公平。然而对所有人而言,这是最可被接受的解决方案了。这总比你瞄准了开火确被服务器告知miss好得多吧!

结论

这是本系列文章的结尾。这类问题总是很难得到完美结果的。但是只要理解了背后的原理,总能得到合理的解决方案。
虽然本文的读者是游戏开发者,但是另外一类读者——玩家也能获得收益!站在玩家的角度上理解各种游戏现象背后的问题也是非常有趣的。

扩展阅读

下面给出一些文章和参考资料,甚至一些源代码和实验结果。
与本文最接近的文章有:
《 What Every Programmer Needs to Know About Game Networking》
《 Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization》
下面给出一个JS写的DEMO,有兴趣的读者可以去调试各种参数看看结果:
http://www.gabrielgambetta.com/fpm_live.html

================================================
原文链接:
http://www.gabrielgambetta.com/fpm4.html

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

  1. 快节奏多人在线游戏网络入门系列教程(1):简介

    简介 该系列教程主要讨论快节奏多人在线游戏的网络相关的技术和算法.这是该系列教程的第一章,如果你对多人在线游戏有一定了解,可以跳过本章. 开发任何一款游戏都是一个挑战性的任务.而多人在线游戏增加了更多 ...

  2. 快节奏多人在线游戏网络入门系列教程(2):客户端预测与服务器协调

    简介 在上一篇文章中,我们简单介绍了权威服务器的体系.客户端发送交互信息给服务器,服务器周期性的更新游戏状态,然后返回游戏状态给客户端. 这个简单体系会导致用户发送命令时和屏幕渲染响应之间的延迟.产生 ...

  3. html5游戏制作入门系列教程(八)

    今天,我已经准备了一个新的游戏 – SkyWalker.基本上 – 这是用飞飞行模拟射击类游戏.我们的目标到达终点线.这个游戏还有其它一些特点,例如使用飞机运动动画和爆炸动画,多按键处理(例如同时移动 ...

  4. html5游戏制作入门系列教程(七)

    我们继续这一系列文章,使用HTML5的canvas组件进行游戏开发.我们将要更新完善我们的第4课html5游戏制作入门系列教程(四)的游戏实例,并增加了火球,敌人和碰撞检测等功能模块.所以,现在我们的 ...

  5. html5游戏制作入门系列教程(六)

    我们继续这一系列文章,使用HTML5的canvas组件进行游戏开发.今天,我们将创建我们的第一个完整的游戏 – 打砖块.在这一课中,我会告诉你如何检测基本的碰撞和HTML5的本地存储.您可以使用鼠标和 ...

  6. html5游戏制作入门系列教程(五)

    我们继续这一系列文章,使用HTML5的canvas组件进行游戏开发.今天,这是相当完整的游戏例子 – 它会回顾经典的旧电脑游戏 – 坦克大战.我会教你使用阵列地图并教你如何检测活动对象(坦克)与环境( ...

  7. html5游戏制作入门系列教程(四)

    今天,我们继续一系列文章,使用HTML5的canvas组件进行游戏开发.今天我们要学习下元素:声音控制与动画.在我们的演示中,你会 看到一个飞龙.我们会听到持续的翅膀拍打的声音(我们将循环这个声音), ...

  8. html5游戏制作入门系列教程(三)

    今天,我们继续一系列文章,使用HTML5的canvas组件进行游戏开发.接下来,我们将开始学习如何添加动画以及一些更有趣的功能.我 们的演示将包括一艘太空船飞越时空,并使用一个新的游戏元素 – 对话框 ...

  9. html5游戏制作入门系列教程(二)

    今天,我们继续html5游戏制作入门系列的系列文章.今天,我们将继续基础知识(也许甚至是高级技巧的基础).我要告诉你如何具有渐变颜色填充对象,绘制文本,使用自定义的字体绘制文本,基本的动画,以及最重要 ...

  10. html5游戏制作入门系列教程(一)

    从今天开始,我们将开始HTML5游戏开发一系列的文章.在我们的第一篇文章中,我们将讲解在画布canvas上的基础工作,创建简单的对象,填充和事件处理程序.另外,要注意在这个阶段中,我们不会立即学习We ...

最新文章

  1. 比利牛斯獒犬 flask web
  2. pku1182(食物链) hdu3047 Zjnu Stadium
  3. 导入依赖和加上注释后,lombok gettersetter识别不到
  4. @SpringBootApplication注解分析
  5. 每天晚上坚持喝一杯无糖燕麦会怎样?
  6. python入门指南小说-Python 入门指南
  7. 支持Delphi2009/2010的DES加密单元
  8. de4dot构建过程
  9. wlacm 铲雪车snow 题解
  10. Dracoo Master天龙卡牌大师
  11. java 开发 cms_10 个最受欢迎的 Java 开发的 CMS 系统
  12. 把绝对时间转换成当前时间
  13. 自学之javaWeb
  14. 【前端大屏实战1】Vue+Echarts -- 大屏简介初体验 => 大屏自适应缩放解决方案 => 使用transform:scale => 组件化抽离ScaleBox=>【两分钟实现大屏宽高等比例】
  15. 应广常用的单片机的介绍
  16. PackEdge Plato 18.1中文版
  17. 记:《洛克菲勒留给儿子的38封信》-- 3
  18. 【操作教程】AI智能视频安防平台EasyCVR如何隐藏页面底部文字信息?
  19. 网络安全培训课程自学
  20. dmol3给定关键字不在字典中_materials studio 学习整理知识点

热门文章

  1. 欧姆龙编程软件SysmacStudio卸载方法
  2. 2022张宇考研基础30讲 第九讲 一元函数积分学的几何应用
  3. Java 通过银行卡号获取银行名称
  4. 【ModBus】基础使用:【01】MThings国产调试工具
  5. 有赞MENLO 2022发布会:升级私域运营解决方案,发布人工智能引擎Jarvis
  6. 最新即时通讯聊天安卓APP源码+全开源/Uniapp内核
  7. 高校图书馆管理系统 php 漏洞,江苏汇文Libsys图书馆管理系统几处通用SQL注入漏洞...
  8. 威纶触摸屏和台达b2伺服通讯,含程序案例资料
  9. 有什么软件方便画er图_数据库ER图绘制工具(DbSchema)
  10. Nsight Visual Studio 调试