快速多人游戏(4) - 爆头!(AKA延迟补偿)

翻译 2016年05月31日 00:28:13

原文链接:Fast-Paced Multiplayer (Part IV): Headshot! (AKA Lag Compensation)

介绍

从上一篇文章到现在已经过了很久很久了(整整两年!哦耶!),不过让我开心的是收到了很多email来问我下一篇什么时候更新,所以,这里就是更新了!这篇文章的主题可以称作对延迟敏感事件的时间一致性,但是叫做爆头好像更加炫酷 : )


回顾

总结一下前面三篇关于C-S模式文章:

1.服务器从客户端收到带有时间戳的输入信息;

2.服务器处理输入并且更新世界状态;

3.服务器以一定的频率发送世界信息给所有客户端;

4.客户端发送输入并且模拟游戏的结果;

5.客户端获取世界的更新并且

1)将自身预测的状态和服务器发送来的状态进行同步;

2)对所有的Entity进行插值

从一个玩家的角度,有两个重要的影响

1.玩家看到自己是当前的;

2.玩家看到别人是过去的;

这其实并没有什么大不了的问题,但是对于时间和空间非常敏感的事件就会造成很大的问题;比如在射击游戏中爆掉敌人的头!


延迟补偿

假设你现在正用你的狙击步枪完美地瞄准目标的头部,然后你射击 - 你觉得这一发你绝对不可能有失误,但是你并没有打中。

到底发生了什么?

原因就在于我们之前说的权威服务器架构中,你瞄准的敌人的头部其实是100ms以前的位置 - 并不是你射击的那个时刻!

就像在一个速度非常非常慢的世界,你瞄准的是敌人过去的某个位置,当你扣动扳机的时候,它已经跑得非常远了。

比较幸运的是有一个相对简单的解决方案,对几乎所有的玩家都是友好的,下面来解释一下它的工作流程:

1.当你射击的时候,客户端将事件发送给服务器:里面还包含了时间戳还有你瞄准时用的武器。

2.这是最关键的一步。因为服务器有所有包含时间戳的输入,它能够重建出任何过去某个世界的场景,特别的,它能够重建出某个时间点所有玩家的场景。

3.这意味着服务器知道你武器的准心里面某个片刻瞄准的是什么,它是敌人的过去某个时候头部的位置,但是服务器知道在你当前的时刻,那个位置也是你瞄准的位置。

4.服务器即时处理掉这个时间点,然后更新所有客户端。


所有人都很开心!

服务器因为它是服务器而开心。它总是开心的。

你瞄准了敌人的头,设计,然后获得了一发爆头,你也很开心。

敌人可能是唯一一个不那么开心的,如果他一直站在那被你打中了,那是他的错,不是吗?但是如果他是一直运动的...哇!你真的是一个超级狙击手!

但是如果在一个开放的地方,然后躲在一堵墙的后面,当他以为他安全的时候还是再几分之一秒之后被杀了,这咋办呢?

好吧,这确实会发生,这是你要做出的让步。因为你射击的是过去的他,它可能在几万分之一秒前还没躲到墙后呢。

这也许有点不公平,但是这是所有人最可接受的解决方案了,这可比没法爆头好多了!


结论

这是我的“快速多人游戏系列“文章的最后一篇了。多人游戏这种东西都是比较tricky的,但是如果你对所有事都了如指掌的话,它并不是超级难。

虽然这些文章是写给游戏开发者看的,但是还有一群人感兴趣的读者:玩家!从游戏玩家的角度,去了解事情是怎么发生的也是蛮有趣的。


延伸阅读

这些技术都非常厉害,我并没什么大不了的,这些文章只是我对学来的知识的一些简单的理解,包括一些论文和源码,还有一些实验。

和这个主题最有关的一些文章是

What Every Programmer Needs to Know About Game Networking 

Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization.

相关文章推荐

C#回调函数和闭包

整理自http://bbs.csdn.net/topics/390622815 回调函数,这一般是在C语言中这么称呼,对于定义一个函数,但是并不由自己去调用,而是由被调用者间接调用,都可以叫...

快速多人游戏(3) - Entity插值

介绍在系列的第一篇文章中,我们介绍了一种权威服务器的思想还有他在防止玩家作弊方面的优势。但是直接使用这种技术会引起可玩性和响应性方面的问题。在第二篇文章中,我们提出了一种客户端预测的方法来处理。到现在...

快速多人游戏(4) - 爆头!(AKA延迟补偿)

http://blog.csdn.net/silangquan/article/details/51542203 原文链接:Fast-Paced Multiplayer (Part IV): He...

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

简介距离我上次发表上一篇文章已经过去了很长很长时间(2年。。。),出乎我的意料,我收到了很多邮件来询问我“下一篇文章”。好吧,这就是我的下一篇文章——延时的时间一致性,或者简单的说,爆头:)回顾前面3...
  • lsldd
  • lsldd
  • 2017年05月15日 23:36
  • 1681

延迟补偿在C/S架构游戏协议设计和优化中的应用

这篇文章介绍了cs这样的第一人称射击游戏中如何实现延迟补偿。非第一人称设计游戏设计也可以参考其中一些思想 原文地址: https://developer.valvesoftware.com...
  • buck84
  • buck84
  • 2012年11月28日 16:49
  • 6917

UE4联机多人游戏基本设置

UE4自带网络联机功能,但是似乎只有蓝图接口

Airplay 教程: 一个 Apple TV 多人竞答游戏(4)

现在,客户端需要根据服务器发来的命令进行动作。在方法 receiveData:fromPeer:inSession:context:末尾加入代码:   if ([commandReceived ...
  • kmyhy
  • kmyhy
  • 2014年06月04日 17:02
  • 1585

UE4创建多人游戏的配置(启动网络模块)

UE4 蓝图(Blueprints)提供了联网功能, 但默认情况下UE4并没有启用网络模块,启动网络联机功能需要以下两个步骤: 1:在工程的 Config 目录下 DefaultEn...

快速多人游戏(2) - 客户端预测和服务器校验

http://blog.csdn.net/silangquan/article/details/51512400 原文链接:Fast-Paced Multiplayer (Part II): Cli...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:快速多人游戏(4) - 爆头!(AKA延迟补偿)
举报原因:
原因补充:

(最多只允许输入30个字)