原文链接:Fast-Paced Multiplayer (Part IV): Headshot! (AKA Lag Compensation)
从上1篇文章到现在已过了很久很久了(整整两年!哦耶!),不过让我开心的是收到了很多email来问我下1篇甚么时候更新,所以,这里就是更新了!这篇文章的主题可以称作对延迟敏感事件的时间1致性,但是叫做爆头好像更加炫酷 : )
总结1下前面3篇关于C-S模式文章:
1.服务器从客户端收到带有时间戳的输入信息;
2.服务器处理输入并且更新世界状态;
3.服务器以1定的频率发送世界信息给所有客户端;
4.客户端发送输入并且摹拟游戏的结果;
5.客户端获得世界的更新并且
1)将本身预测的状态和服务器发送来的状态进行同步;
2)对所有的Entity进行插值
从1个玩家的角度,有两个重要的影响
1.玩家看到自己是当前的;
2.玩家看到他人是过去的;
这其实并没有甚么大不了的问题,但是对时间和空间非常敏感的事件就会造成很大的问题;比如在射击游戏中爆掉敌人的头!
假定你现在正用你的狙击步枪完善地瞄准目标的头部,然后你射击 - 你觉得这1发你绝对不可能有失误,但是你并没有打中。
到底产生了甚么?
缘由就在于我们之前说的权威服务器架构中,你瞄准的敌人的头部实际上是100ms之前的位置 - 其实不是你射击的那个时刻!
就像在1个速度非常非常慢的世界,你瞄准的是敌人过去的某个位置,当你扣动扳机的时候,它已跑得非常远了。
比较荣幸的是有1个相对简单的解决方案,对几近所有的玩家都是友好的,下面来解释1下它的工作流程:
1.当你射击的时候,客户端将事件发送给服务器:里面还包括了时间戳还有你瞄准时用的武器。
2.这是最关键的1步。由于服务器有所有包括时间戳的输入,它能够重建出任何过去某个世界的场景,特别的,它能够重建出某个时间点所有玩家的场景。
3.这意味着服务器知道你武器的准心里面某个片刻瞄准的是甚么,它是敌人的过去某个时候头部的位置,但是服务器知道在你当前的时刻,那个位置也是你瞄准的位置。
4.服务器即时处理掉这个时间点,然后更新所有客户端。
所有人都很开心!
你瞄准了敌人的头,设计,然后取得了1发爆头,你也很开心。
敌人多是唯逐一个不那末开心的,如果他1直站在那被你打中了,那是他的错,不是吗?但是如果他是1直运动的...哇!你真的是1个超级狙击手!
但是如果在1个开放的地方,然后躲在1堵墙的后面,当他以为他安全的时候还是再几分之1秒以后被杀了,这咋办呢?
好吧,这确切会产生,这是你要做出的妥协。由于你射击的是过去的他,它可能在几万分之1秒前还没躲到墙后呢。
这或许有点不公平,但是这是所有人最可接受的解决方案了,这可比没法爆头好多了!
这是我的“快速多人游戏系列“文章的最后1篇了。多人游戏这类东西都是比较tricky的,但是如果你对所有事都了如指掌的话,它其实不是超级难。
虽然这些文章是写给游戏开发者看的,但是还有1群人感兴趣的读者:玩家!从游戏玩家的角度,去了解事情是怎样产生的也是蛮有趣的。
这些技术都非常利害,我并没甚么大不了的,这些文章只是我对学来的知识的1些简单的理解,包括1些论文和源码,还有1些实验。
和这个主题最有关的1些文章是
What Every Programmer Needs to Know About Game Networking
Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization.