【发布时间】:2014-05-04 12:48:27
【问题描述】:
我正在开发一个使用 TCP 的小型多人 2D XNA 游戏。我的问题是,当超过 2 人连接时,每个人都开始滞后。目前,对于玩家拥有的每个新 x,y 位置,它都会将其作为数据包发送到服务器,以广播给网络上连接的所有其他玩家。这最终会发送大量数据包,我认为这会导致我遇到的问题。
向每个玩家发送每个 x,y 坐标是否正常,还是我做错了什么?
【问题讨论】:
标签: networking tcp xna
我正在开发一个使用 TCP 的小型多人 2D XNA 游戏。我的问题是,当超过 2 人连接时,每个人都开始滞后。目前,对于玩家拥有的每个新 x,y 位置,它都会将其作为数据包发送到服务器,以广播给网络上连接的所有其他玩家。这最终会发送大量数据包,我认为这会导致我遇到的问题。
向每个玩家发送每个 x,y 坐标是否正常,还是我做错了什么?
【问题讨论】:
标签: networking tcp xna
您应该只在玩家改变方向(通过跳跃或向左/向右移动)时发送数据包,而不是发送每个数据包。客户端应该正常处理重力和碰撞,而服务器会对其进行验证。
当他们移动时,发送一个包含:
他们的运动矢量(这应该是一个小的 Vector2 或 Point,每个轴上的 -1、0 或 1。-1 X 表示他们正在向左移动, 0 表示没有运动,1 表示右运动)
如果你还没有实现这个客户端,你应该已经实现(不要只是在移动时将 X 添加到速度,将其分配给移动变量以供以后使用。
例如:
if (KeyState.IsKeyDown(Keys.Left) { Movement.X = -1 }
...
Velocity += Movement * Speed
他们的当前位置。 将玩家当前位置(服务器端和经过验证的位置)发送给所有其他玩家,以确保他们的位置匹配(由于微小的变化可能会关闭)
他们当前的速度。当移动发生变化时,玩家的速度应该已经改变,因为他们现在正朝着不同的方向前进。发送速度和位置。
总体而言,仅当玩家移动时(例如:停止按住左键或按下跳转键)而不是每一帧,发送movement(您的前进方向基于键盘输入)、position 和velocity.
完成此操作后,您可能需要添加插值,这将平滑更新之间的移动并使其看起来不那么生涩。
【讨论】:
movement,因此它知道继续向那个方向移动,即使在数据包之后。