为FPS游戏编写XNA游戏服务器代码的最佳方法是什么?

时间:2012-03-24 10:13:51

标签: xna client-server

我正在写一部FPS XNA游戏。这将是多人游戏,所以我想出了以下内容:

  1. 我正在制作两个不同的组件 - 一个用于游戏逻辑,另一个用于绘制它和游戏无关的东西(如火箭轨迹)。
  2. 连接的类型是客户端 - 服务器(不是点对点),因此每个客户端首先连接到服务器然后开始游戏。
  3. 我完全决定使用XNA.Framework.Game课程让客户在窗口(或全屏)中运行游戏,使用GameComponent / DrawableGameComponent类来存储游戏对象并更新和放大;在每一帧上画出它们。
  4. 接下来,我想得到问题的答案:

    我应该在服务器端做什么?我有几个选择:

    1. 在服务器上创建我自己的Game类,它将处理所有游戏逻辑(仅限没有图形)。我没有使用标准Game类的原因是当我调用Game.Run()时出现白色窗口,我无法弄清楚如何摆脱它。
    2. 以某种方式使用原始XNA的Game类,它已经有GameComponent集合和更新事件(每秒60次,正是我需要的)。
    3. 更新:

      我有更多问题:

      首先,我应该使用什么套接字模式? TCP还是UDP?如何让客户知道数据包是否应该处理后

      其次,如果我要对在服务器上存储和处理的游戏对象使用exacly GameComponent类,如何将他们改为在客户端上画?继承它们(当它们组合成一个程序集时)?还有别的吗?

1 个答案:

答案 0 :(得分:1)

首先,你的游戏逻辑应该在服务器上。这不仅可以防止作弊,还可以保证一致性,尤其是随机操作。客户端应该只将其输入发送到服务器

我建议您保持服务器的窗口可见,使其成为调试控制台,您需要它,以了解您的服务器正在做什么。

对于FPS,建议使用UDP。您将发送大量数据,并不关心您的数据包是否全部收到或订购。虽然数据包无法保证到达订购,但您并不必担心它。大多数时候,他们无论如何都会按顺序到达。假设您每秒向您的客户发送60帧,并且您的一个数据包以错误的顺序到达:您的客户端将有1/60秒的错误信息,几乎看不到。

最后,您应该每秒多次向您的客户发送游戏状态的序列化表示。他们应该能够检索该信息并以与服务器相同的方式绘制它。您甚至可以序列化您的游戏组件并在您认为合适的情况下发送它。这取决于你决定。

希望这有帮助!