基本的多人对战实施

我目前正在为5vs5 UDK游戏写一个配对服务器应用程序。

这是我建立我的代码的情况:

  1. 玩家开始游戏并authentication
  2. 玩家点击一个巨大的“播放”button,并要求服务器开放的大堂
  3. 服务器search一个大厅,并将该玩家添加到find的大厅,并将大厅信息发送给玩家,以便相应地作出反应(大厅ID,大厅中的玩家)。 请注意,如果没有发现大厅(所有大厅已满,或根本没有大厅),则会创建一个新大厅。
  4. 玩家(现在在大厅里)select一个角色并点击“就绪”button。
  5. 一旦所有玩家都准备好了,服务器就会search一个对立的队伍
  6. 一旦find对手队伍,服务器会向所有相关玩家发送匹配信息(udk服务器ip和端口)

我用C#Web Api模板写了我的婚介服务器。 这个RESTful webservice现在可以在第1,第2和第3步处理,因为它们是前端(UDK游戏中的玩家)和后端(C#匹配服务器)之间的事务。 玩家要求什么,服务器回复JSON数据。 我这样做是因为有很多的HTTP请求似乎不是所有authentication的播放器在一个连续的TCP连接上的愚蠢。

然而,对于接下来的步骤( 特别是关于大厅内发生的事情的步骤 ),我不确定我应该采取什么方法。 服务器如何通知玩家新的事件(断开连接,新玩家,玩家select角色,玩家准备好…)? 玩家是否应该(非常)定期对新的事件进行轮询? 或者,为了播放新的事件,最好还是建立一个线程池,以保持TCP连接与播放器保持一致? 或者是其他东西? (UDP?)。 我有点失落

这是我的第一篇文章,所以我希望这不是很差的措辞。 谢谢。

有很多事情,你需要考虑。 首先,你在哪里托管你的服务器? 如果您使用自己的硬件,UDP工作得非常好,但是如果您使用的是AWS等,那么最终您会花费大量时间来获得一个可靠的解决scheme。 UDPstream量不能使用默认负载均衡器进行负载均衡,因此您必须将各个实例公开给用户。 Azure和Google服务也是如此。

另外,如果你的目标是移动,那么忘了UDP。 移动数据运营商对UDP有零星的支持。 有时会起作用,有时候则不会。 我知道你可以检查用户是否在他们的手机networking或使用Wifi,但限制用户只能在无线上玩,以使用UDP并不是一个好的解决scheme在我看来。

我发现支持游戏中事件的最好方法是通过客户端的TCP进行零星轮询,或者长轮询和TCP保持活动会话。

如果你的要求是轻量级和primefaces性的,零星轮询更好。 但是,如果您需要保证顺序,那么请使用长轮询保持连接。

请记住,您可以限制每个框可以创建多less个套接字/线程。 套接字仅限于1600万(确切的说是16777214),但是线程要差得多 。 使用线程,可能会有几百个,但这不可取。 线程为了分配堆栈需要一个连续的内存块,所以一旦你开始为每个连接创建/closures线程,你就会快速地进入内存的上限。

如果服务器使用线程池并自动处理保持活动的连接池,那么使用primefaces检查的轻量级轮询是您的最佳select。

哦,通过primefaces操作,我的意思是下面的定义:primefaces性是保证从并发进程(从维基百科 )隔离。 如何实现服务器端的primefaces操作是另一个主题,但为了快速参考,请看看CouchDB如何处理冲突解决scheme 。

一旦游戏开始,我会用同样的沟通方法。 你只是通过使用这些其他方法来拖延不可避免的。 我不知道你会在比赛中使用什么,但现在是时候了解。

对于我创建的多人游戏,我使用一个简单的端口系统。 特定的端口用于特定的stream量。 所以在我的游戏中,我使用了端口20551,20552,20553,20554等,每一个服务于不同的目的。

例如,端口20551等待接收来自播放器的包含其当前位置,旋转等的更新分组。将其分配给所有其他播放器,使得会话中的每个人都被同步。

在你的游戏中,你可以有一个join/离开服务器的端口。 发送JSON数据到这个端口,包含它是否join/离开以及信息。 如果是请假请求,您需要发送刚刚离开的玩家ID,以便他可以从会话中删除,并且在他离开后不会不断地将其数据(例如位置)发送给其他玩家。 与join请求类似,您必须发送有关已join玩家的信息,以便其他玩家可以使用新数据进行更新。

我建议查看UdpClient类。 您可能还会发现需要asynchronous运行方法,因为用于等待接收数据的UdpClient.Receive()方法将挂起您的线程并冻结应用程序,直到它接收到某个东西。

我会尝试明天为你获取一些源代码。