实时FPS游戏向服务器发送什么?


23

将本地播放器的位置告诉服务器的正确方法是什么?一些文档说,最好在产生输入时发送输入。还有一些文件说,客户以固定的间隔发送其头寸。

使用发送输入方法:如果玩家按住方向键该怎么办?这意味着我需要在每个帧中将包发送到服务器。是不是太多了?鼠标输入还可以播放播放器。这是一个例子:

http://www.gabrielgambetta.com/fpm_live.html

如何以固定间隔的方式发送头寸。它向服务器发送的消息太少。但这也会降低响应速度。

那么哪种方法更好呢?

Answers:


19

简单答案:作弊还是不那么准确!

如果您在线玩了一些射击游戏,那么如果您与服务器的连接不好,那么您很可能会经历过所谓的“橡皮筋”。

这是由您的客户不时纠正您的职位引起的。

基本上,这发生在两个方面:

  • 服务器将跟踪您的运动,并按预期方式将更新发送给客户端。这些不一定总是完整的更新。每x帧可能会有一个完整的更新,所有其他帧只发送新的速度矢量(如果有任何变化)。

  • 您自己的客户端将允许您自由移动,但将使用服务器提供的更新来更正/调整您的位置。即使您不逐帧更新位置,这也将确保游戏具有响应能力。

但是如何处理输入?您的客户会将您的职位发送到服务器“我搬到那里”。服务器将验证此更新(例如,您是否应该能够快速移动到那里?),如果有效,则将您(或者拒绝您的更新,从而导致“橡皮筋”)。

因此,是的,您的固定间隔方法将很可能有效并且足够。

但是,即使您要发送输入并处理两侧的移动,也请记住,您不必发送“按钮仍处于按下状态”。而是在按下按钮时发送一个事件,在释放按钮时发送另一个事件。


5
是的,我可以跟踪按钮的按下和释放。但是鼠标输入呢?它在不断变化。
syloc 2014年

6
“相反,在按下按钮时发送一个事件,在释放按钮时发送另一个事件。” -是的,但是确实需要进行检查,以确保最终释放“发布时”事件,具体取决于游戏的规则。例如,在Rainbow 6 Vegas 2多人游戏中,玩家可以开始射击他的枪,并且(不幸的是,常见的)错误导致“停止射击”消息无法成功到达服务器。这导致枪响声在其余比赛中保持无限循环。只是一个值得警惕的例子。youtu.be/GOQIbLCy7m8?t=9m10s
Mike Baxter

@syloc:只需在客户端处理它,然后让服务器确定移动是否有效/可能(以防止诸如传送黑客之类的事情)。
马里奥

@syloc只需为鼠标设置一个间隔,但是仍然要节省额外的带宽,请客户端进行检查以查看其是否已更改。如果一段时间没有鼠标移动,则无需继续发送有关它的消息。
2014年

在我的一项工作中,我们让一名工程师几乎疯狂地优化了弹簧性能,以弥补拨号丢失的位置更新(13年前)。现在,我看到具有足够带宽和可笑的低延迟的游戏正遭受这个问题的困扰,似乎这个问题将永远不会消失,或者人们最近对它的关心程度降低了。
安东·科尔曼

5

如果您还没有的话,我建议您阅读以下两篇深而易懂的文章:https : //developer.valvesoftware.com/wiki/Source_Multiplayer_Networkinghttp://fabiensanglard.net/quake3/network.php

这些解释了为什么建议使用“固定间隔”数据包发送。简而言之,实际上对于服务器发送的数据包而言,这主要是重要的。

发送数据包的费用固定,网络数据包的最大大小约为1.5 KB。因此,例如,如果您的服务器上有16个播放器,则在计算一个播放器的移动时,每一帧,天真的代码可以在每个移动分辨率后向每个播放器发送一个更新数据包,因此16 * 16 = 256个数据包。如果帧速率为30,则为7680个数据包。

更好的方法是在帧的每个开始处创建一个缓冲区,在其中连接您计算的16个位置更新,然后将其发送给您的16个播放器。

现在,您仅按秒发送480个数据包即可获得相同的结果。

在播放器到服务器的情况下,这仅意味着您应该在同一数据包中发送最多的数据,例如:位置,动作称为此框架,依此类推。

关于您问题的第二部分-我选择减少延迟感的方法是在每帧上将此信息发送到服务器:

  • 播放器的实际当前位置(服务器用于检查服务器端和播放器端的位置是否没有过多失步)。

  • 估计的玩家位置(以1秒为单位):由客户端计算:如果玩家不改变鼠标方向并且将键盘保持在当前状态1秒钟,玩家将在哪里?(我们不在乎碰撞)如果玩家不移动,则他在1秒内的估计位置就是其当前位置。

  • 他看的位置。

每次服务器收到此信息时,它将更新将来的位置和查看的位置,并且玩家实体最终会移向其将来的位置。

玩家永远不会完全同步,但是输入响应是即时的(对我来说最重要),我发现预测的位置对我来说足够准确。


“玩家永远不会永远不会完全同步”,我认为提到准确性水平取决于实际游戏(玩法)也很重要。例如,经典的MMO只需单击并选择实体,几乎不需要所有内容都具有完美的准确性,但是在射击游戏中,良好而完美的同步至关重要。
2014年

事实是,没有人在他们的头脑中使用TCP进行FPS。他们宁愿处理复杂的重新排序和丢失数据报,也不愿承担TCP的开销。
安东·科尔曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.