将本地播放器的位置告诉服务器的正确方法是什么?一些文档说,最好在产生输入时发送输入。还有一些文件说,客户以固定的间隔发送其头寸。
使用发送输入方法:如果玩家按住方向键该怎么办?这意味着我需要在每个帧中将包发送到服务器。是不是太多了?鼠标输入还可以播放播放器。这是一个例子:
如何以固定间隔的方式发送头寸。它向服务器发送的消息太少。但这也会降低响应速度。
那么哪种方法更好呢?
将本地播放器的位置告诉服务器的正确方法是什么?一些文档说,最好在产生输入时发送输入。还有一些文件说,客户以固定的间隔发送其头寸。
使用发送输入方法:如果玩家按住方向键该怎么办?这意味着我需要在每个帧中将包发送到服务器。是不是太多了?鼠标输入还可以播放播放器。这是一个例子:
如何以固定间隔的方式发送头寸。它向服务器发送的消息太少。但这也会降低响应速度。
那么哪种方法更好呢?
Answers:
简单答案:作弊还是不那么准确!
如果您在线玩了一些射击游戏,那么如果您与服务器的连接不好,那么您很可能会经历过所谓的“橡皮筋”。
这是由您的客户不时纠正您的职位引起的。
基本上,这发生在两个方面:
服务器将跟踪您的运动,并按预期方式将更新发送给客户端。这些不一定总是完整的更新。每x帧可能会有一个完整的更新,所有其他帧只发送新的速度矢量(如果有任何变化)。
您自己的客户端将允许您自由移动,但将使用服务器提供的更新来更正/调整您的位置。即使您不逐帧更新位置,这也将确保游戏具有响应能力。
但是如何处理输入?您的客户会将您的职位发送到服务器“我搬到那里”。服务器将验证此更新(例如,您是否应该能够快速移动到那里?),如果有效,则将您(或者拒绝您的更新,从而导致“橡皮筋”)。
因此,是的,您的固定间隔方法将很可能有效并且足够。
但是,即使您要发送输入并处理两侧的移动,也请记住,您不必发送“按钮仍处于按下状态”。而是在按下按钮时发送一个事件,在释放按钮时发送另一个事件。
如果您还没有的话,我建议您阅读以下两篇深而易懂的文章:https : //developer.valvesoftware.com/wiki/Source_Multiplayer_Networking和http://fabiensanglard.net/quake3/network.php。
这些解释了为什么建议使用“固定间隔”数据包发送。简而言之,实际上对于服务器发送的数据包而言,这主要是重要的。
发送数据包的费用固定,网络数据包的最大大小约为1.5 KB。因此,例如,如果您的服务器上有16个播放器,则在计算一个播放器的移动时,每一帧,天真的代码可以在每个移动分辨率后向每个播放器发送一个更新数据包,因此16 * 16 = 256个数据包。如果帧速率为30,则为7680个数据包。
更好的方法是在帧的每个开始处创建一个缓冲区,在其中连接您计算的16个位置更新,然后将其发送给您的16个播放器。
现在,您仅按秒发送480个数据包即可获得相同的结果。
在播放器到服务器的情况下,这仅意味着您应该在同一数据包中发送最多的数据,例如:位置,动作称为此框架,依此类推。
关于您问题的第二部分-我选择减少延迟感的方法是在每帧上将此信息发送到服务器:
播放器的实际当前位置(服务器用于检查服务器端和播放器端的位置是否没有过多失步)。
估计的玩家位置(以1秒为单位):由客户端计算:如果玩家不改变鼠标方向并且将键盘保持在当前状态1秒钟,玩家将在哪里?(我们不在乎碰撞)如果玩家不移动,则他在1秒内的估计位置就是其当前位置。
他看的位置。
每次服务器收到此信息时,它将更新将来的位置和查看的位置,并且玩家实体最终会移向其将来的位置。
玩家永远不会完全同步,但是输入响应是即时的(对我来说最重要),我发现预测的位置对我来说足够准确。