代码之家  ›  专栏  ›  技术社区  ›  Ilja

火场中高效的配对玩家

  •  1
  • Ilja  · 技术社区  · 7 年前

    我正在进行一个需要玩家配对的游戏,即将两个玩家放入一个作战室。

    虽然游戏中的在线玩家很少,但这并不是一个问题,但是如果我们假设一次有1000000名在线玩家,他们都在尝试配对,那么画面就会变得更加复杂。

    假设以下流量

    enter image description here

    我的第一反应是

    1. 当玩家点击“播放”时,呼叫云功能,检查“打开”的战斗室是否存在。
    2. 如果有一个空位,将玩家放在里面并开始战斗,或者将战斗设置为激活状态。
    3. 如果没有开放的房间,我们创建一个新房间,等待其他玩家加入。

    然而,我在这里看到了很多问题,因为我们有1000000名球员将执行这个动作。例如,在执行第2步并将空间设置为“活动”时,我们可能会在这些请求解决期间将更多玩家推入其中?

    2 回复  |  直到 7 年前
        1
  •  2
  •   MichelDelpech    7 年前

    如果您想要处理并发性,我认为您应该使用事务来执行这个操作(向一个房间添加一个播放器)。这样,在添加玩家之前,您可以确保检查房间是否仍然打开。如果两个玩家同时开始配对并找到同一个房间,那么只有一个玩家会被添加到该房间 https://firebase.google.com/docs/firestore/manage-data/transactions

        2
  •  0
  •   Guru    7 年前

    据我所知,我可以建议一种更简单的方法,那就是拥有用户本身的状态,而不是调用云函数来创建空间。

    1. 使用户状态为“活动”、“联机”、“脱机”。当用户按“播放”时,将其状态设置为“活动”。

    2. 调用一个查询来获取用户,其中state==active,limit to 5(示例)。

    3. 如果成功,则启动一个事务以与第一个用户匹配。如果失败,则将状态更改为“为其他用户播放”(您与其他人或您尝试的玩家匹配,但与其他人匹配),然后检查下一个播放机。

    4. 如果在这期间,你应该一直观察你自己的状态,如果它变为玩,因为其他人匹配你,然后直接面对游戏。

    推荐文章