运动在客户端 - 服务器多人(MMO)“算法”的游戏?(Movement “algorithm” i

2019-07-29 10:48发布

我已经写了一个2D闪多人游戏和一个套接字服务器。 我原来的客户端和服务器之间的运动算法的计划是以下几点:

  • 客户端通知有关球员的运动模式的服务器(向前移动或不移动)和玩家的转向模式(不转,左转或右转),只要这些变化。
    • 服务器循环所有玩家每隔几毫秒计算转过的角度和距离移动的基础上,在时间上的差异。 同样的计算是由客户端来完成。

我的电流计算为客户端(相同的数学在服务器使用)==>

车削

var newTimeStamp:uint = UtilLib.getTimeStamp(); //set current timeStamp
                var rot:uint = Math.round((newTimeStamp - turningTimeStamp) / 1000 * 90); //speed = x degrees turning every 1 second
                turningTimeStamp = newTimeStamp; //update timeStamp
                if (turningMode == 1) //left
                {
                    movementAngle = fixAngle(movementAngle - rot);
                }
                else if (turningMode == 2) //right
                {
                    movementAngle = fixAngle(movementAngle + rot);
                }

private function fixAngle(angle:int):uint //fixes an angle in degrees (365 -> 5, -5 -> 355, etc.)
        {
            if (angle > 360)
            {
                angle -= (Math.round(angle / 360) * 360);
            }
            else if (angle < 0)
            {
                angle += (Math.round(Math.abs(angle) / 360) + 1) * 360;
            }
            return angle;
        }

运动

var newTimeStamp:uint = UtilLib.getTimeStamp(); //set current timeStamp
                var distance:uint = Math.round((newTimeStamp - movementTimeStamp) / 1000 * 300); //speed = x pixels forward every 1 second
                movementTimeStamp = newTimeStamp; //update old timeStamp
                var diagonalChange:Array = getDiagonalChange(movementAngle, distance); //with the current angle, howmuch is dX and dY?
                x += diagonalChange[0];
                y += diagonalChange[1];

private function getDiagonalChange(angle:uint, distance:uint):Array
        {
            var rAngle:Number = angle * Math.PI/180;
            return [Math.round(Math.sin(rAngle) * distance), Math.round((Math.cos(rAngle) * distance) * -1)];
        }

这似乎工作的伟大。 为了照顾滞后考虑,服务器发送该数据飘飞纠正客户的信息。

有了这个系统极少的带宽用于处理运动。 然而,我的服务器和客户端的坐标和角度之间的差异太大。 如果我也许延长我的“算法”,也考虑到用户的等待时间? 或者有没有处理客户端<>服务器的多人游戏运动与出色的性能更好的办法?

Answer 1:

我最初的设计将类似于你的,但如果不工作,也许你可以允许客户端来完成所有的动作,只是让服务器做一些范围检查。

所以,如果你的最后报告的位置是X,下一个一定是从X半径,其中半径是基于从客户端发送与x时间戳,Y数据的差异中。

晴这只是需要检测作弊。

停止,打架,等需要的位置与攻击一同发送,客户端发送的更新后的那个位置,但将基于服务器的位置由触发的动作只会被触发。

不知道这会帮助太多,但它可能会停止颠簸重新同步,你会从你最初的算法见。

评论回应:

没有,客户仍然会告知其位置的服务器,但是服务器不会尝试计算下一个位置。 这将意味着,服务器(和所有其他客户端)将至少一个发送/位置后面接收循环。

我想我说的只是让客户端完成所有的工作,找出其中的字符,并告诉服务器,但包含足够的信息,该服务器可以选择性地检查的有效性,以确保任何人的作弊。

作弊检测甚至可以关闭对性能或设置为随机检查。

注:上行驶范围内的所有物体碰撞/位置信息需要被发送到客户端这个工作。



Answer 2:

有2种方法我能想到这样做的 - 在客户端发出命令到服务器和服务器将是最终的地图门将。

或者,保持客户端的地图,和客户端将建立与他们为了做运动“近”等客户端的连接,与记录保存由服务器完成与检查由几个同行(黑客警察)。

让我感兴趣的是监控等连接​​的可能性,并有超过一定阈值的延迟同行就不会在游戏中出现。



Answer 3:

是您的服务器很慢,它不能处理所有的运动? 尤其是在2-d游戏? 通常,当我做小的2D游戏服务器给我回我的所有动作,所以没有计算需要在客户端上。 如果服务器开始落后,我只是冻结了一下,这是一个通常会想到反正(尽管这几乎不会发生)。

在任何情况下,我肯定会看到的性能如何,而不在客户端进行任何实际计算本身。 如果性能不够好,看是否通过服务器上的玩家动作循环造成的延迟(并开始使用为每个客户不同的线程)。

如果确实存在带宽的限制,真正的(动作本身传递的数据非常少),那么肯定是你需要找到特定用户的平均延迟并计算入算法。 然而,持续不断寻找的平均(精密),你必须继续ping服务器找往返时间,这不应该是所有的昂贵。



文章来源: Movement “algorithm” in client-server Multiplayer (MMO) Games?