构建回合制多人游戏服务器

时间:2013-05-12 16:08:42

标签: ios mobile multiplayer high-load

我开始制作多人游戏,但由于我没有经验,我尝试了不同的方式,但对我来说感觉不对。 所以,我真的需要一个关于我应该最好使用哪些平台/工具/语言/技术的建议。 我必须说我不相信像Photon,AppWrap,Skiller,Gamooga等。我不相信他们会扩展得很好,也不会太昂贵,或者它们太大(我不是指大小,我的意思是他们拥有多少我不需要的东西)以满足我的需求。

首先,我将描述简化的游戏会话过程。

  1. 三位玩家开始游戏
  2. 每位玩家都会收到一个问题,并应在10秒内回答。
  3. 当玩家回答时,他应该能够看到任何其他玩家已经给出的任何答案(如果有的话),并且他应该能够在给出任何答案时立即看到。基本上,任何答案应该由其他客户实时接收,但只有在我们回答之后(以避免作弊)。如果时间已经结束,那么任何没有回答的人将不会得到任何分数,接下来的问题就会出现。
  4. 决定胜利者并转到下一个问题。 N轮后完成比赛。
  5. 其次,我将解释一些我考虑过的要求。

    • 游戏应该在iOS / Android / Web上运行。这让我别无选择,只能基于HTTP。
    • 我查找了我非常喜欢的Google Cloud Endpoints。它有iOS / Android / JS SDK,Google Cloud Platform有Google BigQuery,还有很多其他很棒的东西。 但是因为我需要实时答案传递我不知道是否合适(有渠道API但没有适用于iOS的客户端SDK,以及人们说它不那么好)。
    • 然后我查找了Node.js和长轮询(客户端的AFNetworking),但它很难管理。我需要向客户提供游戏状态更新(我需要发送增量)。这样我就需要为每个玩家单独跟踪所有更改。当玩家连接时,我应该检查是否有任何变化;如果它然后立即发送;如果不是那么听“改变”事件然后发送。最后代码看起来很笨拙,很难理解,我不知道如何使它正确。有socket.io应该在服务器端做得更好,但同样没有iOS SDK用于客户端。

    我不知道从哪里开始。任何帮助都将非常感激。

2 个答案:

答案 0 :(得分:4)

基于回合制的架构实际上并不太复杂,因为滞后实际上不是一个大问题,并且数据不会不断发送。

我会创建两个网络服务,一个用于配对,另一个用于处理实际游戏。

匹配将简单地排队玩家,当有足够的比赛时,该服务将挑选一组玩家并为他们分配一个sessionID并将玩家传递给游戏服务。

对于游戏服务,区分客户端和服务可以处理的内容非常重要。

游戏服务将存储包括客户在内的每个sessionID的所有游戏信息。这将允许单个服务一次轻松管理数百个游戏。当玩家回答问题时,它会在请求中使用sessionID将其发送给服务器。服务器将迭代会话中的客户端并将信息发送给它们。

客户端可以处理隐藏问题,直到用户回答。 (如果你担心黑客行为,你甚至可以加密其他问题信息。)

服务器还会跟踪会话的计时器,当计时器到期时,它会向所有客户端发送响应,并忽略任何后续的答案。圆整数可以存储在会话中,并与sessionID进行通信,以便将答案区分为过去的问题。你可以在客户端上有一个预测计时器,但服务器需要是计时器的权限,以避免作弊。

答案 1 :(得分:1)

使用您自己的身份验证令牌使用安全的ssl https协议来阻止骗子。

客户需要跟踪每个玩家的时间跨度而不是实际时间。每轮客户端结束后,各个时间跨度将被发送到服务器。

这样想。有3个客户端,所有客户端都在轮询服务器时进行轮询。因为三者可能具有不同的网络速度,所以您不知道谁将首先实际启动。因此,当每个客户端最终接收到绿灯时,则该设备启动定时器,此时该设备上接收该定时器。你等到所有3个人都用他们的时间跨度向服务器报告,以确定谁赢了这一轮。

在游戏的逻辑中存在一些令人担忧的主题。这里有些例子。 用户身份和授权。 (游戏中心) 游戏数据持久性和存储。 (像AWS DynamoDB这样的云数据库) 游戏比赛排队。 (AWS SQS)请勿使用悲观并发对数据库进行此尝试。 匹配播放器的通知已为睡眠客户端做好准备。 (AWS SNS到APNS到端点(此移动设备)) 下一轮移动的轮询或通知。 (AWS SQS或SNS)我不会轮询数据库。 这些服务只是示例推荐。我不为亚马逊工作,他们最容易起床和跑步,但可能有更好的服务。

基本上我得到的是在一些基本托管网站上需要的不仅仅是传统的MySQL数据库。与在专用服务器上自行创建所有基础架构相比,其中一些云服务变得非常实惠。 这也是指数级更具可扩展性。 您可以使用云服务以每月不到15美元的价格开始上面列出的所有操作。最好的办法是,如果您的想法起飞,只需通过管理门户轻弹一下,即可提高阈值。 这将是一个很好的问题。