【问题标题】:TCP Movement LagTCP 运动滞后
【发布时间】:2014-05-04 12:48:27
【问题描述】:

我正在开发一个使用 TCP 的小型多人 2D XNA 游戏。我的问题是,当超过 2 人连接时,每个人都开始滞后。目前,对于玩家拥有的每个新 x,y 位置,它都会将其作为数据包发送到服务器,以广播给网络上连接的所有其他玩家。这最终会发送大量数据包,我认为这会导致我遇到的问题。

向每个玩家发送每个 x,y 坐标是否正常,还是我做错了什么?

【问题讨论】:

    标签: networking tcp xna


    【解决方案1】:

    您应该只在玩家改变方向(通过跳跃或向左/向右移动)时发送数据包,而不是发送每个数据包。客户端应该正常处理重力和碰撞,而服务器会对其进行验证。

    当他们移动时,发送一个包含:

    1. 他们的运动矢量(这应该是一个小的 Vector2 或 Point,每个轴上的 -101-1 X 表示他们正在向左移动, 0 表示没有运动,1 表示右运动)

      如果你还没有实现这个客户端,你应该已经实现(不要只是在移动时将 X 添加到速度,将其分配给移动变量以供以后使用。

      例如:

      if (KeyState.IsKeyDown(Keys.Left) { Movement.X = -1 } ... Velocity += Movement * Speed

    2. 他们的当前位置。 将玩家当前位置(服务器端和经过验证的位置)发送给所有其他玩家,以确保他们的位置匹配(由于微小的变化可能会关闭)

    3. 他们当前的速度。当移动发生变化时,玩家的速度应该已经改变,因为他们现在正朝着不同的方向前进。发送速度和位置。

    总体而言,仅当玩家移动时(例如:停止按住左键或按下跳转键)而不是每一帧,发送movement(您的前进方向基于键盘输入)、positionvelocity.

    完成此操作后,您可能需要添加插值,这将平滑更新之间的移动并使其看起来不那么生涩。

    【讨论】:

    • 所以只要有输入,我就应该让它持续发送包含该信息的数据包?
    • 不确定我是否理解,不是连续的,但只有当玩家改变方向或停止移动时。例如,如果我按左键向左移动,然后我停止按它,然后我发送一个数据包告诉服务器和其他客户端我已经停止移动。如果我按右向右移动,那么我告诉服务器和客户端我已经开始向右移动(当然是在服务器验证之后)
    • 哦,好吧,所以当你按住左键时,它不会在玩家每次在屏幕上移动 x , y 时发送一个数据包(这就是我正在做的现在),它只发送说 2 个数据包,一个说玩家已经开始朝这个方向移动,然后另一个数据包告诉服务器玩家停止移动。
    • 是的,完全正确。客户端将收到movement,因此它知道继续向那个方向移动,即使在数据包之后。
    • 干杯,我会去进行更改,希望它能解决我的问题。我会告诉你的:)
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2015-04-13
    • 2013-10-27
    相关资源
    最近更新 更多