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

我正在写一个FPS XNA游戏。 这将是多人游戏,所以我想出了以下几点:

  1. 我正在制作两个不同的程序集 – 一个用于游戏逻辑,一个用于绘制游戏和游戏无关的东西(如火箭path)。
  2. 连接的types是客户端 – 服务器(而不是对等),所以每个客户端连接到服务器,然后游戏开始。
  3. 我已经决定使用XNA.Framework.Game类来让客户在窗口(或全屏)中运行游戏,并使用GameComponent / DrawableGameComponent类来存储游戏对象,更新并在每一帧上绘制它们。

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

  1. 在服务器上创建我自己的Game类,它将处理所有的游戏逻辑,没有graphics。 我不使用标准的Game类,因为当我调用Game.Run() ,出现了白色的窗口,我不知道如何摆脱它。
  2. 不知何故,使用原来的XNA Game类,它已经有GameComponent集合和更新事件(每秒60次,正是我所需要的)。

我还有其他问题:

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

其次,如果我要为服务器上存储和处理的游戏对象使用确切的GameComponent类,如何让它们在客户端上绘制? 我应该inheritance他们,而他们是组合在一个大会),还是别的?

我没有资格回答您的XNAnetworking特定问题。 不过,我可以推荐你这篇关于不是XNA特定游戏的TCP / UPD文章。

我将尽可能地在你的问题的背景下总结。

简而言之:

时序在FPS游戏中至关重要,您希望数据包能够尽快发送。 使用UDP ,它使您可以更好地控制单个数据包,并且比TCP平均速度快得多,从而将networking接口暴露为stream而不是数据包。

长解释:

TCP保证数据包的命令/到达,但是抽象出将数据分解成数据包的逻辑。 但是,如果您尝试发送less量数据,则会引入延迟,可能会被TCP合并为1个“合理”大小的数据包,然后发送。 另外对于丢包,TCP只是简单地等待/重新发送数据,这会阻止游戏的执行并造成滞后。 因此,您需要控制单个数据包,并使用更低级别的UDP; 它使您能够控制每个数据包的处理,并让您自己处理数据包/数据包丢失/sorting的大小(当然还有更多的工作要做)。

处理订单的一种方法是对发送的数据包打上时间标记,并在双方进行适当的检查。 欲了解更多信息,你可以参考他的系列文章的其余部分在上面关于networkingPhyiscs的文章的评论。 他写了一系列关于如何处理与UDP的networking游戏,包括如何实现你感兴趣的虚拟连接。

现在,他的文章不是特定于框架的,而是谈论你可能应该熟悉的基本概念。 不过,我相信有一些游戏特定的networking框架来帮助你(也许做一些Googlesearch)。 也许别人会给你一些建议。