了解Edgegap的工作原理

了解Edgegap的工作原理

如何在MOBA中添加匹配机制

已发布

已发布

已发布

关键洞察

关键洞察

关键洞察

Edgegap的 matchmaking 是一个全托管、无限自定义的 matchmaking 系统,能够最佳地将全球玩家分组 - 在您开发 MOBA 游戏期间其使用是免费的。

它也是我们所知的唯一具备基于延迟的 matchmaking 规则的 matchmaking 系统,能够为您的游戏提供理想的在线多人体验,无论引擎(Unity、Unreal等)或游戏服务(EOS、UGS、PlayFab、Heroic Labs Nakama、Braincloud等)如何。

由于我们的 matchmaker 是基于参数的,因此无需编写代码。因此集成非常简单,如果需要,我们的入门指南会在每一步中帮助您。

当您的游戏上线时,由于我们的 matchmaking 系统是完全托管的,您无需处理基础设施、错误、停机、可扩展性或数据库管理。我们为您处理一切。将您的 DevOps 工作负载减少到几乎为零。

如何在您的 MOBA 中集成对局配对

-> 本文基于 對局配對文档。如果您遇到问题或差异,请务必参考 原始指南,因为它们更频繁地保持最新。

以下示例将帮助您测试核心对局配对玩家流程,具体如下:

  • 在共享托管集群上创建对局配对器实例,

  • 在对局配对器配置中定义规则和设置,

  • 最后,使用我们的玩家票证和API测试玩家流程和管理。

要将对局配对器实现到您的游戏中,有五个步骤:

  1. 第一步是创建一个帐户并使用我们的 MOBA 游戏示例。 Voilà,您(技术上)已经完成了一半!您只需将对局配对器集成到您的游戏中(参见步骤5)。

  2. 现在,您不应该盲目遵循在互联网上找到的 JSON 示例,因此强烈建议根据上面的规则调整到您的游戏中。步骤 2(“探索配置”)是我们的“如何阅读”,详细介绍了每个对局配对规则功能的作用(“探索配置”)。

  3. 步骤 3(“审查实例详情”)涵盖您的个人特定对局配对器,以确保它与您的游戏设计一起部署和运行。

  4. 步骤 4,顾名思义(“4. 测试票证 API”),就是测试从玩家发送的对局配对请求是否被对局配对器接收,称为票证。

  5. 步骤 5(“在您的游戏中集成对局配对”)强调如何在您的引擎项目中集成对局配对器。

如果您遇到故障排除问题,我们的深入学习中心有其他故障排除提示。

1. 设置免费套餐

注册您的免费 Edgegap 帐户,并导航到 对局配对仪表板页面。

从那里,首先点击 创建对局配对器 ,然后输入:

  • 对局配对器的名称 - 纯粹供您自己参考,例如 quickstart-dev,

  • 然后将以下简单示例作为您的 MOBA 游戏的 JSON 配置上传:

{
  "version": "1.0.0",
  "max_deployment_retry_count": 3,
  "ticket_expiration_period": "5m",
  "ticket_removal_period": "1m",
  "profiles": {
    "casual-example": {
      "application": {
        "name": "my-game-server=>CHANGE-THIS-NAME-HERE",
        "version": "2024.01.30-16.23.00-UTC=>CHANGE-THIS-HERE "
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 25,
              "max_latency": 100
            }
          },
          "league_rank": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 1
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "selected_beacons": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "10": {
            "beacons": {
              "difference": 40,
              "max_latency": 150
            }
          },
          "30": {
            "beacons": {
              "difference": 50
            }
          },
          "60": {
            "league_rank": {
              "max_difference": 2
            }
          },
          "180": {
            "beacons": {
              "difference": 100,
              "max_latency": 500
            }
          }
        }
      }
    },
    "competitive-example": {
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 25,
              "max_latency": 100
            }
          },
          "league_rank": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 0
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "selected_beacons": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 40,
              "max_latency": 150
            }
          },
          "60": {
            "beacons": {
              "difference": 50
            }
          },
          "180": {
            "beacons": {
              "max_latency": 250
            }
          }
        }
      }
    },
    "challenger-example": {
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 25,
              "max_latency": 100
            }
          },
          "league_rank": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 0
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "selected_beacons": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 40,
              "max_latency": 150
            }
          },
          "180": {
            "beacons": {
              "difference": 50
            }
          },
          "240": {
            "beacons": {
              "max_latency": 250
            }
          }
        }
      }
    }
  }
}

(温馨提醒,请确保更改应用程序 名称 和 版本 以匹配您的 应用程序和版本!)

如果没有显示验证错误,请点击 创建并开始 ,等待过程完成。这将启动一个新的免费集群,其中包含您的简单示例对局配对器。

您现在可以进入下一步。

2.探索配置​

独特的 MOBA 游戏规则

具体针对 MOBA 游戏,您可以为特定模式的游戏规则和设置定义多个 对局配对配置文件:

  • 限制两位玩家之间的等级差异以适应更休闲的游戏,

  • 限制等级差异,仅允许相同等级的对手参加排名比赛,

  • 让玩家提供他们的地图偏好,并选择适合所有人的地图,

  • 添加 中心选择用户界面 以限制对手到指定的 Ping 信标,

  • 将 对局配对延迟 限制为最大阈值,以防止匹配远处的玩家,

  • 将 对局配对延迟 限制为最大差异,以最大限度地提高 ping 公平性,

  • 使用不同的 应用版本 在允许更多玩家时分配更多 CPU 或内存,

  • 以小组方式加入 为预制大厅或填满团队而不超出团队规模。

从理想条件开始,扩展限制 以确保快速匹配:

  • 随着时间的推移缓慢放宽延迟限制以找到更多玩家,

  • 缓慢增加允许的等级差异以找到更多玩家,

  • 增加最高等级(挑战者)的扩展时间间隔,因为可用玩家较少。

为晋升比赛创建更高等级的票证,以匹配更强的对手。

定义单独的作弊者配置文件,以确保标记为作弊者或拥有大量管理报告的玩家不会对排名比赛中的合法玩家的体验产生负面影响。

语义版本控制

每个新版本使用 语义版本控制 通过解释格式 major.minor.patch来清晰地传达更改的影响:

  • major 版本包含重大变化,需要进行集成审查,

  • minor 版本包括重要的向后兼容改进,

  • patch 版本包含错误修复和小幅改进。

某些部署可能导致错误。我们尝试通过最多 max_deployment_retry_count 次自动重试部署(无需客户端确认)来解决此问题。

为了确保意外的客户端崩溃或遗留票证不会滞留并占用您的对局配对器资源,票证将在 ticket_expiration_period 后被取消,并导致其状态更改为 CANCELLED ,然后在 ticket_removal_period 后被永久删除。

我们对局配对逻辑的核心内容在 对局配对配置文件中配置。每个配置文件是一个完全隔离的对局配对队列,指向具有预定义所需 CPU 和内存(RAM)资源的应用版本。

对局配对规则 在初始规则集中必须满足条件,以便将玩家分组在一起,每个规则由三个属性定义:

  • 任意名称,例如 - match size,

  • 规则类型,也称为操作符,例如 - player_count,

  • 最后是操作符属性, 例如 team_count 或 team_size。

玩家数量规则

这是定义要启动指派需要匹配多少玩家的特殊规则:

  • team_count 指的是团队数量,可以用于合作或全面比赛模式的一个团队,

  • team_size 指的是 每队玩家数量。

我们的简单示例展示了一个由2名玩家组成的合作游戏。

请注意,“玩家数量”规则在初始配置规则中是必需的并且只能定义一次。

延迟规则

使用此规则为所有玩家提供尽可能低的 ping。 一旦客户端测量并提交他们对所有可用信标的往返时间(ping),Gen2 将只考虑 ping 值在特定 difference 范围内的比赛,这些数据是针对Ping 信标衡量的。 这提供了一种“软”解决方案来划分您的玩家群体,使得与邻近地区的匹配尤其提升了对于人口较少区域的匹配速度。 使用 max_latency防止与远距离的玩家匹配。

您现在可以进行下一步。

我们的示例 beacons 规则上面使用了 "difference": 50, "max_latency": 200 初始化:

  • Alice 和 Bob 会匹配,因为北京被排除在外(>200),其余则在 | A-B | <50 范围内:

    • Alice {蒙特利尔: 12.3, 纽瓦克: 45.6, 达拉斯: 59.9, 北京: 264.4};和

    • Bob {蒙特利尔: 27.3, 纽瓦克: 32.4, 达拉斯: 23.1, 北京: 252.2}.

  • Charlie 和 Dave 不会匹配,因为对于达拉斯信标,| C-D | >50:

    • Alice {蒙特利尔: 5.7 纽瓦克: 44.2, 达拉斯: 59.5, 北京: 263.2};和

    • Bob {蒙特利尔: 57.8, 纽瓦克: 32.0, 达拉斯: 24.2, 北京: 272.3}.

请注意,“延迟规则”在初始配置规则中只能定义一次。

3. 审查实例详情​

初始化后,请在我们的仪表板中审查您的新对局配对器的详细信息:

状态 指示服务的健康状况,可为在线、离线或错误。

  • 标识符 有助于 Edgegap 员工快速找到您的对局配对器,以便您需要帮助进行故障排除。

  • 启动时间 可用于追踪最新更新时间。

  • 大小 对应我们的一个 定价套餐。

  • API URL 将由游戏客户端和游戏服务器用于与 Gen2 通信。

  • Swagger URL 是我们提供的一个方便的 openAPI 规范 GUI,用于探索 API 模式。

  • 授权令牌 是由游戏客户端和游戏服务器用于认证的唯一秘密令牌。

要使用 API 测试您的新对局配对器,您将需要 Swagger URL、API URL 和授权令牌。

您现在可以进行下一步。

4. 测试票证 API

首先,打开您的 Swagger URL 以检查您在 swagger GUI 中的 openAPI 模式

点击“对局配对器”标题下的 /...swagger.json URL 来打开原始 JSON 模式:

将此页面保存为文件到您的驱动器中(CTRL/CMD+S)。

打开您的 Postman 应用并登录到您的免费帐户。

从上一步中导入您的 swagger.json文件:

  • 保持 Postman 集合 选中,

  • 选择 查看导入设置 并更改设置 参数生成 为 示例。

确认导入,这将导致新集合出现在左侧列表中的集合列表中,标题为对局配对器。

查看更多操作,打开选项卡 授权 并选择:

  • 权限类型 - API 密钥,

  • 键 - “授权”

  • 值 - 在此处插入您的 授权令牌 值,

  • 添加到 - 标题。

按(CTRL/CMD+S)或保存图标进行 保存更改。Postman 选项卡中的橙色点应该消失。

在您的对局配对器集合中,选择 票证 和 创建对局配对票证,打开一个新选项卡。

选择选项卡 正文 以预览您的 玩家票证请求:

注意 player_ip 设置为 null-这将导致自动添加到您的请求的 IP 地址(请参阅 服务器对服务器集成 的替代方案),

  • profile 指的是您的 对局配对配置文件,

  • attributes 包括对局配对规则的值,在这种情况下是 latencies 规则,

    • 规则 player_count 是唯一不需要在玩家票证中包含任何属性的规则。

注意:请确保参考示例的Swagger 的导入配置。

点击 发送 并查看对您的玩家票证请求的响应:

  • id 是您的唯一对局配对票证 ID,请保存以便稍后查看您的票证,

  • profile 确认对局配对配置文件的选择,

  • group_id 是为每个票证发出的唯一组 ID,一个单独的玩家表示为 1 人的组,

  • player_ip 是玩家的公共 IP 地址,无论使用哪种识别方式,

  • assignment 设置为 null 表示票证尚未匹配或分配到服务器,

  • created_at 提供有关玩家票证创建时间的信息,用于游戏 UI 使用,

  • status 指示票证的当前状态,所有票证开始于 SEARCHING (详见对局配对过程)。

通过再次点击 发送 创建第二张票证,以便我们的两名玩家配对并启动一个服务器。

在您的对局配对器集合中,选择 {ticketId} 和 读取对局配对票证。

用上一步中的响应输入票证 ID 并点击 发送。

查看您的玩家票证的更新分配:

  • 状态首先更改为 MATCH_FOUND,同时保持 assignment 为 null,表示玩家已匹配并正在分配服务器。

再次点击 发送 以查看您的票证,并查看您的玩家票证的更新分配:

  • 状态更改为 HOST_ASSIGNED ,assignment包含已分配服务器的详细信息。

 在我们的仪表板中检查您的新部署:

  • 注意每次部署都标记有所有票证 ID 和配置文件以增加可追溯性。

尝试从您的游戏客户端连接到分配的服务器。

一旦您确认能够无故障连接到您的部署并完成测试,停止您的部署 以在您的帐户中释放下一个构建的容量。

您现在可以进行下一步。

5. 在您的游戏中集成对局配对器​

Edgegap 的对局配对集成:

  • 与 游戏客户端,以管理 玩家票证,

  • 与 游戏服务器集成,实现:

    • 处理通过其票证传递的玩家偏好,

    • 可选支持背填充以在开始后添加或替换玩家。

对于在 游戏客户端,我们建议通过在游戏中 UI 提供 对局配对过程的票证状态更新给玩家以获得最佳的玩家体验。请参阅:

在 游戏客户端中,确保您处理不可重试的错误:

  • HTTP 404 找不到 - 票证已被删除,

  • HTTP 500 内部服务器错误 - 临时服务中断。

在 游戏服务器中,处理玩家偏好和初始服务器上下文。无需 API 集成:

  1. 读取 注入环境变量(Gen2) 以检索初始玩家的对局配对数据。

  2. 读取 注入环境变量(应用版本) 以获取特定版本的参数、设置(玩家容量)和秘密。

  3. 读取 注入环境变量(部署) 以获取部署信息,如 IP 地址、位置或更多信息。

一旦玩家连接,游戏服务器和游戏客户端便开始加载场景以执行同步步骤(例如选择并加载地图/场景/关卡)。我们推荐使用一个完整功能的 3D 场景、社交界面的大厅式 UI 或具有进度条的加载屏幕,以指示初始化正在进行。

一旦游戏客户端完成加载,玩家将加载/转移到主要游戏场景。

可选的,游戏服务器 可以创建和管理 背填充 和玩家容量(添加或替换离开的玩家)。

确保您的 部署将被正确停止 使用 注入的 DELETE_URL,如果:

  • 没有玩家加入比赛,

  • 所有玩家均已离开比赛,

  • 比赛正确地结束。

恭喜,您已完成 Edgegap 对局配对器集成!如果您想了解更多信息,请在我们的学习中心中阅读所有相关资料。

如何在您的 MOBA 中集成对局配对

-> 本文基于 對局配對文档。如果您遇到问题或差异,请务必参考 原始指南,因为它们更频繁地保持最新。

以下示例将帮助您测试核心对局配对玩家流程,具体如下:

  • 在共享托管集群上创建对局配对器实例,

  • 在对局配对器配置中定义规则和设置,

  • 最后,使用我们的玩家票证和API测试玩家流程和管理。

要将对局配对器实现到您的游戏中,有五个步骤:

  1. 第一步是创建一个帐户并使用我们的 MOBA 游戏示例。 Voilà,您(技术上)已经完成了一半!您只需将对局配对器集成到您的游戏中(参见步骤5)。

  2. 现在,您不应该盲目遵循在互联网上找到的 JSON 示例,因此强烈建议根据上面的规则调整到您的游戏中。步骤 2(“探索配置”)是我们的“如何阅读”,详细介绍了每个对局配对规则功能的作用(“探索配置”)。

  3. 步骤 3(“审查实例详情”)涵盖您的个人特定对局配对器,以确保它与您的游戏设计一起部署和运行。

  4. 步骤 4,顾名思义(“4. 测试票证 API”),就是测试从玩家发送的对局配对请求是否被对局配对器接收,称为票证。

  5. 步骤 5(“在您的游戏中集成对局配对”)强调如何在您的引擎项目中集成对局配对器。

如果您遇到故障排除问题,我们的深入学习中心有其他故障排除提示。

1. 设置免费套餐

注册您的免费 Edgegap 帐户,并导航到 对局配对仪表板页面。

从那里,首先点击 创建对局配对器 ,然后输入:

  • 对局配对器的名称 - 纯粹供您自己参考,例如 quickstart-dev,

  • 然后将以下简单示例作为您的 MOBA 游戏的 JSON 配置上传:

{
  "version": "1.0.0",
  "max_deployment_retry_count": 3,
  "ticket_expiration_period": "5m",
  "ticket_removal_period": "1m",
  "profiles": {
    "casual-example": {
      "application": {
        "name": "my-game-server=>CHANGE-THIS-NAME-HERE",
        "version": "2024.01.30-16.23.00-UTC=>CHANGE-THIS-HERE "
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 25,
              "max_latency": 100
            }
          },
          "league_rank": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 1
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "selected_beacons": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "10": {
            "beacons": {
              "difference": 40,
              "max_latency": 150
            }
          },
          "30": {
            "beacons": {
              "difference": 50
            }
          },
          "60": {
            "league_rank": {
              "max_difference": 2
            }
          },
          "180": {
            "beacons": {
              "difference": 100,
              "max_latency": 500
            }
          }
        }
      }
    },
    "competitive-example": {
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 25,
              "max_latency": 100
            }
          },
          "league_rank": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 0
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "selected_beacons": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 40,
              "max_latency": 150
            }
          },
          "60": {
            "beacons": {
              "difference": 50
            }
          },
          "180": {
            "beacons": {
              "max_latency": 250
            }
          }
        }
      }
    },
    "challenger-example": {
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 25,
              "max_latency": 100
            }
          },
          "league_rank": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 0
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "selected_beacons": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 40,
              "max_latency": 150
            }
          },
          "180": {
            "beacons": {
              "difference": 50
            }
          },
          "240": {
            "beacons": {
              "max_latency": 250
            }
          }
        }
      }
    }
  }
}

(温馨提醒,请确保更改应用程序 名称 和 版本 以匹配您的 应用程序和版本!)

如果没有显示验证错误,请点击 创建并开始 ,等待过程完成。这将启动一个新的免费集群,其中包含您的简单示例对局配对器。

您现在可以进入下一步。

2.探索配置​

独特的 MOBA 游戏规则

具体针对 MOBA 游戏,您可以为特定模式的游戏规则和设置定义多个 对局配对配置文件:

  • 限制两位玩家之间的等级差异以适应更休闲的游戏,

  • 限制等级差异,仅允许相同等级的对手参加排名比赛,

  • 让玩家提供他们的地图偏好,并选择适合所有人的地图,

  • 添加 中心选择用户界面 以限制对手到指定的 Ping 信标,

  • 将 对局配对延迟 限制为最大阈值,以防止匹配远处的玩家,

  • 将 对局配对延迟 限制为最大差异,以最大限度地提高 ping 公平性,

  • 使用不同的 应用版本 在允许更多玩家时分配更多 CPU 或内存,

  • 以小组方式加入 为预制大厅或填满团队而不超出团队规模。

从理想条件开始,扩展限制 以确保快速匹配:

  • 随着时间的推移缓慢放宽延迟限制以找到更多玩家,

  • 缓慢增加允许的等级差异以找到更多玩家,

  • 增加最高等级(挑战者)的扩展时间间隔,因为可用玩家较少。

为晋升比赛创建更高等级的票证,以匹配更强的对手。

定义单独的作弊者配置文件,以确保标记为作弊者或拥有大量管理报告的玩家不会对排名比赛中的合法玩家的体验产生负面影响。

语义版本控制

每个新版本使用 语义版本控制 通过解释格式 major.minor.patch来清晰地传达更改的影响:

  • major 版本包含重大变化,需要进行集成审查,

  • minor 版本包括重要的向后兼容改进,

  • patch 版本包含错误修复和小幅改进。

某些部署可能导致错误。我们尝试通过最多 max_deployment_retry_count 次自动重试部署(无需客户端确认)来解决此问题。

为了确保意外的客户端崩溃或遗留票证不会滞留并占用您的对局配对器资源,票证将在 ticket_expiration_period 后被取消,并导致其状态更改为 CANCELLED ,然后在 ticket_removal_period 后被永久删除。

我们对局配对逻辑的核心内容在 对局配对配置文件中配置。每个配置文件是一个完全隔离的对局配对队列,指向具有预定义所需 CPU 和内存(RAM)资源的应用版本。

对局配对规则 在初始规则集中必须满足条件,以便将玩家分组在一起,每个规则由三个属性定义:

  • 任意名称,例如 - match size,

  • 规则类型,也称为操作符,例如 - player_count,

  • 最后是操作符属性, 例如 team_count 或 team_size。

玩家数量规则

这是定义要启动指派需要匹配多少玩家的特殊规则:

  • team_count 指的是团队数量,可以用于合作或全面比赛模式的一个团队,

  • team_size 指的是 每队玩家数量。

我们的简单示例展示了一个由2名玩家组成的合作游戏。

请注意,“玩家数量”规则在初始配置规则中是必需的并且只能定义一次。

延迟规则

使用此规则为所有玩家提供尽可能低的 ping。 一旦客户端测量并提交他们对所有可用信标的往返时间(ping),Gen2 将只考虑 ping 值在特定 difference 范围内的比赛,这些数据是针对Ping 信标衡量的。 这提供了一种“软”解决方案来划分您的玩家群体,使得与邻近地区的匹配尤其提升了对于人口较少区域的匹配速度。 使用 max_latency防止与远距离的玩家匹配。

您现在可以进行下一步。

我们的示例 beacons 规则上面使用了 "difference": 50, "max_latency": 200 初始化:

  • Alice 和 Bob 会匹配,因为北京被排除在外(>200),其余则在 | A-B | <50 范围内:

    • Alice {蒙特利尔: 12.3, 纽瓦克: 45.6, 达拉斯: 59.9, 北京: 264.4};和

    • Bob {蒙特利尔: 27.3, 纽瓦克: 32.4, 达拉斯: 23.1, 北京: 252.2}.

  • Charlie 和 Dave 不会匹配,因为对于达拉斯信标,| C-D | >50:

    • Alice {蒙特利尔: 5.7 纽瓦克: 44.2, 达拉斯: 59.5, 北京: 263.2};和

    • Bob {蒙特利尔: 57.8, 纽瓦克: 32.0, 达拉斯: 24.2, 北京: 272.3}.

请注意,“延迟规则”在初始配置规则中只能定义一次。

3. 审查实例详情​

初始化后,请在我们的仪表板中审查您的新对局配对器的详细信息:

状态 指示服务的健康状况,可为在线、离线或错误。

  • 标识符 有助于 Edgegap 员工快速找到您的对局配对器,以便您需要帮助进行故障排除。

  • 启动时间 可用于追踪最新更新时间。

  • 大小 对应我们的一个 定价套餐。

  • API URL 将由游戏客户端和游戏服务器用于与 Gen2 通信。

  • Swagger URL 是我们提供的一个方便的 openAPI 规范 GUI,用于探索 API 模式。

  • 授权令牌 是由游戏客户端和游戏服务器用于认证的唯一秘密令牌。

要使用 API 测试您的新对局配对器,您将需要 Swagger URL、API URL 和授权令牌。

您现在可以进行下一步。

4. 测试票证 API

首先,打开您的 Swagger URL 以检查您在 swagger GUI 中的 openAPI 模式

点击“对局配对器”标题下的 /...swagger.json URL 来打开原始 JSON 模式:

将此页面保存为文件到您的驱动器中(CTRL/CMD+S)。

打开您的 Postman 应用并登录到您的免费帐户。

从上一步中导入您的 swagger.json文件:

  • 保持 Postman 集合 选中,

  • 选择 查看导入设置 并更改设置 参数生成 为 示例。

确认导入,这将导致新集合出现在左侧列表中的集合列表中,标题为对局配对器。

查看更多操作,打开选项卡 授权 并选择:

  • 权限类型 - API 密钥,

  • 键 - “授权”

  • 值 - 在此处插入您的 授权令牌 值,

  • 添加到 - 标题。

按(CTRL/CMD+S)或保存图标进行 保存更改。Postman 选项卡中的橙色点应该消失。

在您的对局配对器集合中,选择 票证 和 创建对局配对票证,打开一个新选项卡。

选择选项卡 正文 以预览您的 玩家票证请求:

注意 player_ip 设置为 null-这将导致自动添加到您的请求的 IP 地址(请参阅 服务器对服务器集成 的替代方案),

  • profile 指的是您的 对局配对配置文件,

  • attributes 包括对局配对规则的值,在这种情况下是 latencies 规则,

    • 规则 player_count 是唯一不需要在玩家票证中包含任何属性的规则。

注意:请确保参考示例的Swagger 的导入配置。

点击 发送 并查看对您的玩家票证请求的响应:

  • id 是您的唯一对局配对票证 ID,请保存以便稍后查看您的票证,

  • profile 确认对局配对配置文件的选择,

  • group_id 是为每个票证发出的唯一组 ID,一个单独的玩家表示为 1 人的组,

  • player_ip 是玩家的公共 IP 地址,无论使用哪种识别方式,

  • assignment 设置为 null 表示票证尚未匹配或分配到服务器,

  • created_at 提供有关玩家票证创建时间的信息,用于游戏 UI 使用,

  • status 指示票证的当前状态,所有票证开始于 SEARCHING (详见对局配对过程)。

通过再次点击 发送 创建第二张票证,以便我们的两名玩家配对并启动一个服务器。

在您的对局配对器集合中,选择 {ticketId} 和 读取对局配对票证。

用上一步中的响应输入票证 ID 并点击 发送。

查看您的玩家票证的更新分配:

  • 状态首先更改为 MATCH_FOUND,同时保持 assignment 为 null,表示玩家已匹配并正在分配服务器。

再次点击 发送 以查看您的票证,并查看您的玩家票证的更新分配:

  • 状态更改为 HOST_ASSIGNED ,assignment包含已分配服务器的详细信息。

 在我们的仪表板中检查您的新部署:

  • 注意每次部署都标记有所有票证 ID 和配置文件以增加可追溯性。

尝试从您的游戏客户端连接到分配的服务器。

一旦您确认能够无故障连接到您的部署并完成测试,停止您的部署 以在您的帐户中释放下一个构建的容量。

您现在可以进行下一步。

5. 在您的游戏中集成对局配对器​

Edgegap 的对局配对集成:

  • 与 游戏客户端,以管理 玩家票证,

  • 与 游戏服务器集成,实现:

    • 处理通过其票证传递的玩家偏好,

    • 可选支持背填充以在开始后添加或替换玩家。

对于在 游戏客户端,我们建议通过在游戏中 UI 提供 对局配对过程的票证状态更新给玩家以获得最佳的玩家体验。请参阅:

在 游戏客户端中,确保您处理不可重试的错误:

  • HTTP 404 找不到 - 票证已被删除,

  • HTTP 500 内部服务器错误 - 临时服务中断。

在 游戏服务器中,处理玩家偏好和初始服务器上下文。无需 API 集成:

  1. 读取 注入环境变量(Gen2) 以检索初始玩家的对局配对数据。

  2. 读取 注入环境变量(应用版本) 以获取特定版本的参数、设置(玩家容量)和秘密。

  3. 读取 注入环境变量(部署) 以获取部署信息,如 IP 地址、位置或更多信息。

一旦玩家连接,游戏服务器和游戏客户端便开始加载场景以执行同步步骤(例如选择并加载地图/场景/关卡)。我们推荐使用一个完整功能的 3D 场景、社交界面的大厅式 UI 或具有进度条的加载屏幕,以指示初始化正在进行。

一旦游戏客户端完成加载,玩家将加载/转移到主要游戏场景。

可选的,游戏服务器 可以创建和管理 背填充 和玩家容量(添加或替换离开的玩家)。

确保您的 部署将被正确停止 使用 注入的 DELETE_URL,如果:

  • 没有玩家加入比赛,

  • 所有玩家均已离开比赛,

  • 比赛正确地结束。

恭喜,您已完成 Edgegap 对局配对器集成!如果您想了解更多信息,请在我们的学习中心中阅读所有相关资料。

如何在您的 MOBA 中集成对局配对

-> 本文基于 對局配對文档。如果您遇到问题或差异,请务必参考 原始指南,因为它们更频繁地保持最新。

以下示例将帮助您测试核心对局配对玩家流程,具体如下:

  • 在共享托管集群上创建对局配对器实例,

  • 在对局配对器配置中定义规则和设置,

  • 最后,使用我们的玩家票证和API测试玩家流程和管理。

要将对局配对器实现到您的游戏中,有五个步骤:

  1. 第一步是创建一个帐户并使用我们的 MOBA 游戏示例。 Voilà,您(技术上)已经完成了一半!您只需将对局配对器集成到您的游戏中(参见步骤5)。

  2. 现在,您不应该盲目遵循在互联网上找到的 JSON 示例,因此强烈建议根据上面的规则调整到您的游戏中。步骤 2(“探索配置”)是我们的“如何阅读”,详细介绍了每个对局配对规则功能的作用(“探索配置”)。

  3. 步骤 3(“审查实例详情”)涵盖您的个人特定对局配对器,以确保它与您的游戏设计一起部署和运行。

  4. 步骤 4,顾名思义(“4. 测试票证 API”),就是测试从玩家发送的对局配对请求是否被对局配对器接收,称为票证。

  5. 步骤 5(“在您的游戏中集成对局配对”)强调如何在您的引擎项目中集成对局配对器。

如果您遇到故障排除问题,我们的深入学习中心有其他故障排除提示。

1. 设置免费套餐

注册您的免费 Edgegap 帐户,并导航到 对局配对仪表板页面。

从那里,首先点击 创建对局配对器 ,然后输入:

  • 对局配对器的名称 - 纯粹供您自己参考,例如 quickstart-dev,

  • 然后将以下简单示例作为您的 MOBA 游戏的 JSON 配置上传:

{
  "version": "1.0.0",
  "max_deployment_retry_count": 3,
  "ticket_expiration_period": "5m",
  "ticket_removal_period": "1m",
  "profiles": {
    "casual-example": {
      "application": {
        "name": "my-game-server=>CHANGE-THIS-NAME-HERE",
        "version": "2024.01.30-16.23.00-UTC=>CHANGE-THIS-HERE "
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 25,
              "max_latency": 100
            }
          },
          "league_rank": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 1
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "selected_beacons": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "10": {
            "beacons": {
              "difference": 40,
              "max_latency": 150
            }
          },
          "30": {
            "beacons": {
              "difference": 50
            }
          },
          "60": {
            "league_rank": {
              "max_difference": 2
            }
          },
          "180": {
            "beacons": {
              "difference": 100,
              "max_latency": 500
            }
          }
        }
      }
    },
    "competitive-example": {
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 25,
              "max_latency": 100
            }
          },
          "league_rank": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 0
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "selected_beacons": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 40,
              "max_latency": 150
            }
          },
          "60": {
            "beacons": {
              "difference": 50
            }
          },
          "180": {
            "beacons": {
              "max_latency": 250
            }
          }
        }
      }
    },
    "challenger-example": {
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 25,
              "max_latency": 100
            }
          },
          "league_rank": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 0
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "selected_beacons": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 40,
              "max_latency": 150
            }
          },
          "180": {
            "beacons": {
              "difference": 50
            }
          },
          "240": {
            "beacons": {
              "max_latency": 250
            }
          }
        }
      }
    }
  }
}

(温馨提醒,请确保更改应用程序 名称 和 版本 以匹配您的 应用程序和版本!)

如果没有显示验证错误,请点击 创建并开始 ,等待过程完成。这将启动一个新的免费集群,其中包含您的简单示例对局配对器。

您现在可以进入下一步。

2.探索配置​

独特的 MOBA 游戏规则

具体针对 MOBA 游戏,您可以为特定模式的游戏规则和设置定义多个 对局配对配置文件:

  • 限制两位玩家之间的等级差异以适应更休闲的游戏,

  • 限制等级差异,仅允许相同等级的对手参加排名比赛,

  • 让玩家提供他们的地图偏好,并选择适合所有人的地图,

  • 添加 中心选择用户界面 以限制对手到指定的 Ping 信标,

  • 将 对局配对延迟 限制为最大阈值,以防止匹配远处的玩家,

  • 将 对局配对延迟 限制为最大差异,以最大限度地提高 ping 公平性,

  • 使用不同的 应用版本 在允许更多玩家时分配更多 CPU 或内存,

  • 以小组方式加入 为预制大厅或填满团队而不超出团队规模。

从理想条件开始,扩展限制 以确保快速匹配:

  • 随着时间的推移缓慢放宽延迟限制以找到更多玩家,

  • 缓慢增加允许的等级差异以找到更多玩家,

  • 增加最高等级(挑战者)的扩展时间间隔,因为可用玩家较少。

为晋升比赛创建更高等级的票证,以匹配更强的对手。

定义单独的作弊者配置文件,以确保标记为作弊者或拥有大量管理报告的玩家不会对排名比赛中的合法玩家的体验产生负面影响。

语义版本控制

每个新版本使用 语义版本控制 通过解释格式 major.minor.patch来清晰地传达更改的影响:

  • major 版本包含重大变化,需要进行集成审查,

  • minor 版本包括重要的向后兼容改进,

  • patch 版本包含错误修复和小幅改进。

某些部署可能导致错误。我们尝试通过最多 max_deployment_retry_count 次自动重试部署(无需客户端确认)来解决此问题。

为了确保意外的客户端崩溃或遗留票证不会滞留并占用您的对局配对器资源,票证将在 ticket_expiration_period 后被取消,并导致其状态更改为 CANCELLED ,然后在 ticket_removal_period 后被永久删除。

我们对局配对逻辑的核心内容在 对局配对配置文件中配置。每个配置文件是一个完全隔离的对局配对队列,指向具有预定义所需 CPU 和内存(RAM)资源的应用版本。

对局配对规则 在初始规则集中必须满足条件,以便将玩家分组在一起,每个规则由三个属性定义:

  • 任意名称,例如 - match size,

  • 规则类型,也称为操作符,例如 - player_count,

  • 最后是操作符属性, 例如 team_count 或 team_size。

玩家数量规则

这是定义要启动指派需要匹配多少玩家的特殊规则:

  • team_count 指的是团队数量,可以用于合作或全面比赛模式的一个团队,

  • team_size 指的是 每队玩家数量。

我们的简单示例展示了一个由2名玩家组成的合作游戏。

请注意,“玩家数量”规则在初始配置规则中是必需的并且只能定义一次。

延迟规则

使用此规则为所有玩家提供尽可能低的 ping。 一旦客户端测量并提交他们对所有可用信标的往返时间(ping),Gen2 将只考虑 ping 值在特定 difference 范围内的比赛,这些数据是针对Ping 信标衡量的。 这提供了一种“软”解决方案来划分您的玩家群体,使得与邻近地区的匹配尤其提升了对于人口较少区域的匹配速度。 使用 max_latency防止与远距离的玩家匹配。

您现在可以进行下一步。

我们的示例 beacons 规则上面使用了 "difference": 50, "max_latency": 200 初始化:

  • Alice 和 Bob 会匹配,因为北京被排除在外(>200),其余则在 | A-B | <50 范围内:

    • Alice {蒙特利尔: 12.3, 纽瓦克: 45.6, 达拉斯: 59.9, 北京: 264.4};和

    • Bob {蒙特利尔: 27.3, 纽瓦克: 32.4, 达拉斯: 23.1, 北京: 252.2}.

  • Charlie 和 Dave 不会匹配,因为对于达拉斯信标,| C-D | >50:

    • Alice {蒙特利尔: 5.7 纽瓦克: 44.2, 达拉斯: 59.5, 北京: 263.2};和

    • Bob {蒙特利尔: 57.8, 纽瓦克: 32.0, 达拉斯: 24.2, 北京: 272.3}.

请注意,“延迟规则”在初始配置规则中只能定义一次。

3. 审查实例详情​

初始化后,请在我们的仪表板中审查您的新对局配对器的详细信息:

状态 指示服务的健康状况,可为在线、离线或错误。

  • 标识符 有助于 Edgegap 员工快速找到您的对局配对器,以便您需要帮助进行故障排除。

  • 启动时间 可用于追踪最新更新时间。

  • 大小 对应我们的一个 定价套餐。

  • API URL 将由游戏客户端和游戏服务器用于与 Gen2 通信。

  • Swagger URL 是我们提供的一个方便的 openAPI 规范 GUI,用于探索 API 模式。

  • 授权令牌 是由游戏客户端和游戏服务器用于认证的唯一秘密令牌。

要使用 API 测试您的新对局配对器,您将需要 Swagger URL、API URL 和授权令牌。

您现在可以进行下一步。

4. 测试票证 API

首先,打开您的 Swagger URL 以检查您在 swagger GUI 中的 openAPI 模式

点击“对局配对器”标题下的 /...swagger.json URL 来打开原始 JSON 模式:

将此页面保存为文件到您的驱动器中(CTRL/CMD+S)。

打开您的 Postman 应用并登录到您的免费帐户。

从上一步中导入您的 swagger.json文件:

  • 保持 Postman 集合 选中,

  • 选择 查看导入设置 并更改设置 参数生成 为 示例。

确认导入,这将导致新集合出现在左侧列表中的集合列表中,标题为对局配对器。

查看更多操作,打开选项卡 授权 并选择:

  • 权限类型 - API 密钥,

  • 键 - “授权”

  • 值 - 在此处插入您的 授权令牌 值,

  • 添加到 - 标题。

按(CTRL/CMD+S)或保存图标进行 保存更改。Postman 选项卡中的橙色点应该消失。

在您的对局配对器集合中,选择 票证 和 创建对局配对票证,打开一个新选项卡。

选择选项卡 正文 以预览您的 玩家票证请求:

注意 player_ip 设置为 null-这将导致自动添加到您的请求的 IP 地址(请参阅 服务器对服务器集成 的替代方案),

  • profile 指的是您的 对局配对配置文件,

  • attributes 包括对局配对规则的值,在这种情况下是 latencies 规则,

    • 规则 player_count 是唯一不需要在玩家票证中包含任何属性的规则。

注意:请确保参考示例的Swagger 的导入配置。

点击 发送 并查看对您的玩家票证请求的响应:

  • id 是您的唯一对局配对票证 ID,请保存以便稍后查看您的票证,

  • profile 确认对局配对配置文件的选择,

  • group_id 是为每个票证发出的唯一组 ID,一个单独的玩家表示为 1 人的组,

  • player_ip 是玩家的公共 IP 地址,无论使用哪种识别方式,

  • assignment 设置为 null 表示票证尚未匹配或分配到服务器,

  • created_at 提供有关玩家票证创建时间的信息,用于游戏 UI 使用,

  • status 指示票证的当前状态,所有票证开始于 SEARCHING (详见对局配对过程)。

通过再次点击 发送 创建第二张票证,以便我们的两名玩家配对并启动一个服务器。

在您的对局配对器集合中,选择 {ticketId} 和 读取对局配对票证。

用上一步中的响应输入票证 ID 并点击 发送。

查看您的玩家票证的更新分配:

  • 状态首先更改为 MATCH_FOUND,同时保持 assignment 为 null,表示玩家已匹配并正在分配服务器。

再次点击 发送 以查看您的票证,并查看您的玩家票证的更新分配:

  • 状态更改为 HOST_ASSIGNED ,assignment包含已分配服务器的详细信息。

 在我们的仪表板中检查您的新部署:

  • 注意每次部署都标记有所有票证 ID 和配置文件以增加可追溯性。

尝试从您的游戏客户端连接到分配的服务器。

一旦您确认能够无故障连接到您的部署并完成测试,停止您的部署 以在您的帐户中释放下一个构建的容量。

您现在可以进行下一步。

5. 在您的游戏中集成对局配对器​

Edgegap 的对局配对集成:

  • 与 游戏客户端,以管理 玩家票证,

  • 与 游戏服务器集成,实现:

    • 处理通过其票证传递的玩家偏好,

    • 可选支持背填充以在开始后添加或替换玩家。

对于在 游戏客户端,我们建议通过在游戏中 UI 提供 对局配对过程的票证状态更新给玩家以获得最佳的玩家体验。请参阅:

在 游戏客户端中,确保您处理不可重试的错误:

  • HTTP 404 找不到 - 票证已被删除,

  • HTTP 500 内部服务器错误 - 临时服务中断。

在 游戏服务器中,处理玩家偏好和初始服务器上下文。无需 API 集成:

  1. 读取 注入环境变量(Gen2) 以检索初始玩家的对局配对数据。

  2. 读取 注入环境变量(应用版本) 以获取特定版本的参数、设置(玩家容量)和秘密。

  3. 读取 注入环境变量(部署) 以获取部署信息,如 IP 地址、位置或更多信息。

一旦玩家连接,游戏服务器和游戏客户端便开始加载场景以执行同步步骤(例如选择并加载地图/场景/关卡)。我们推荐使用一个完整功能的 3D 场景、社交界面的大厅式 UI 或具有进度条的加载屏幕,以指示初始化正在进行。

一旦游戏客户端完成加载,玩家将加载/转移到主要游戏场景。

可选的,游戏服务器 可以创建和管理 背填充 和玩家容量(添加或替换离开的玩家)。

确保您的 部署将被正确停止 使用 注入的 DELETE_URL,如果:

  • 没有玩家加入比赛,

  • 所有玩家均已离开比赛,

  • 比赛正确地结束。

恭喜,您已完成 Edgegap 对局配对器集成!如果您想了解更多信息,请在我们的学习中心中阅读所有相关资料。

如何在您的 MOBA 中集成对局配对

-> 本文基于 對局配對文档。如果您遇到问题或差异,请务必参考 原始指南,因为它们更频繁地保持最新。

以下示例将帮助您测试核心对局配对玩家流程,具体如下:

  • 在共享托管集群上创建对局配对器实例,

  • 在对局配对器配置中定义规则和设置,

  • 最后,使用我们的玩家票证和API测试玩家流程和管理。

要将对局配对器实现到您的游戏中,有五个步骤:

  1. 第一步是创建一个帐户并使用我们的 MOBA 游戏示例。 Voilà,您(技术上)已经完成了一半!您只需将对局配对器集成到您的游戏中(参见步骤5)。

  2. 现在,您不应该盲目遵循在互联网上找到的 JSON 示例,因此强烈建议根据上面的规则调整到您的游戏中。步骤 2(“探索配置”)是我们的“如何阅读”,详细介绍了每个对局配对规则功能的作用(“探索配置”)。

  3. 步骤 3(“审查实例详情”)涵盖您的个人特定对局配对器,以确保它与您的游戏设计一起部署和运行。

  4. 步骤 4,顾名思义(“4. 测试票证 API”),就是测试从玩家发送的对局配对请求是否被对局配对器接收,称为票证。

  5. 步骤 5(“在您的游戏中集成对局配对”)强调如何在您的引擎项目中集成对局配对器。

如果您遇到故障排除问题,我们的深入学习中心有其他故障排除提示。

1. 设置免费套餐

注册您的免费 Edgegap 帐户,并导航到 对局配对仪表板页面。

从那里,首先点击 创建对局配对器 ,然后输入:

  • 对局配对器的名称 - 纯粹供您自己参考,例如 quickstart-dev,

  • 然后将以下简单示例作为您的 MOBA 游戏的 JSON 配置上传:

{
  "version": "1.0.0",
  "max_deployment_retry_count": 3,
  "ticket_expiration_period": "5m",
  "ticket_removal_period": "1m",
  "profiles": {
    "casual-example": {
      "application": {
        "name": "my-game-server=>CHANGE-THIS-NAME-HERE",
        "version": "2024.01.30-16.23.00-UTC=>CHANGE-THIS-HERE "
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 25,
              "max_latency": 100
            }
          },
          "league_rank": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 1
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "selected_beacons": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "10": {
            "beacons": {
              "difference": 40,
              "max_latency": 150
            }
          },
          "30": {
            "beacons": {
              "difference": 50
            }
          },
          "60": {
            "league_rank": {
              "max_difference": 2
            }
          },
          "180": {
            "beacons": {
              "difference": 100,
              "max_latency": 500
            }
          }
        }
      }
    },
    "competitive-example": {
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 25,
              "max_latency": 100
            }
          },
          "league_rank": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 0
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "selected_beacons": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 40,
              "max_latency": 150
            }
          },
          "60": {
            "beacons": {
              "difference": 50
            }
          },
          "180": {
            "beacons": {
              "max_latency": 250
            }
          }
        }
      }
    },
    "challenger-example": {
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 25,
              "max_latency": 100
            }
          },
          "league_rank": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 0
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "selected_beacons": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 40,
              "max_latency": 150
            }
          },
          "180": {
            "beacons": {
              "difference": 50
            }
          },
          "240": {
            "beacons": {
              "max_latency": 250
            }
          }
        }
      }
    }
  }
}

(温馨提醒,请确保更改应用程序 名称 和 版本 以匹配您的 应用程序和版本!)

如果没有显示验证错误,请点击 创建并开始 ,等待过程完成。这将启动一个新的免费集群,其中包含您的简单示例对局配对器。

您现在可以进入下一步。

2.探索配置​

独特的 MOBA 游戏规则

具体针对 MOBA 游戏,您可以为特定模式的游戏规则和设置定义多个 对局配对配置文件:

  • 限制两位玩家之间的等级差异以适应更休闲的游戏,

  • 限制等级差异,仅允许相同等级的对手参加排名比赛,

  • 让玩家提供他们的地图偏好,并选择适合所有人的地图,

  • 添加 中心选择用户界面 以限制对手到指定的 Ping 信标,

  • 将 对局配对延迟 限制为最大阈值,以防止匹配远处的玩家,

  • 将 对局配对延迟 限制为最大差异,以最大限度地提高 ping 公平性,

  • 使用不同的 应用版本 在允许更多玩家时分配更多 CPU 或内存,

  • 以小组方式加入 为预制大厅或填满团队而不超出团队规模。

从理想条件开始,扩展限制 以确保快速匹配:

  • 随着时间的推移缓慢放宽延迟限制以找到更多玩家,

  • 缓慢增加允许的等级差异以找到更多玩家,

  • 增加最高等级(挑战者)的扩展时间间隔,因为可用玩家较少。

为晋升比赛创建更高等级的票证,以匹配更强的对手。

定义单独的作弊者配置文件,以确保标记为作弊者或拥有大量管理报告的玩家不会对排名比赛中的合法玩家的体验产生负面影响。

语义版本控制

每个新版本使用 语义版本控制 通过解释格式 major.minor.patch来清晰地传达更改的影响:

  • major 版本包含重大变化,需要进行集成审查,

  • minor 版本包括重要的向后兼容改进,

  • patch 版本包含错误修复和小幅改进。

某些部署可能导致错误。我们尝试通过最多 max_deployment_retry_count 次自动重试部署(无需客户端确认)来解决此问题。

为了确保意外的客户端崩溃或遗留票证不会滞留并占用您的对局配对器资源,票证将在 ticket_expiration_period 后被取消,并导致其状态更改为 CANCELLED ,然后在 ticket_removal_period 后被永久删除。

我们对局配对逻辑的核心内容在 对局配对配置文件中配置。每个配置文件是一个完全隔离的对局配对队列,指向具有预定义所需 CPU 和内存(RAM)资源的应用版本。

对局配对规则 在初始规则集中必须满足条件,以便将玩家分组在一起,每个规则由三个属性定义:

  • 任意名称,例如 - match size,

  • 规则类型,也称为操作符,例如 - player_count,

  • 最后是操作符属性, 例如 team_count 或 team_size。

玩家数量规则

这是定义要启动指派需要匹配多少玩家的特殊规则:

  • team_count 指的是团队数量,可以用于合作或全面比赛模式的一个团队,

  • team_size 指的是 每队玩家数量。

我们的简单示例展示了一个由2名玩家组成的合作游戏。

请注意,“玩家数量”规则在初始配置规则中是必需的并且只能定义一次。

延迟规则

使用此规则为所有玩家提供尽可能低的 ping。 一旦客户端测量并提交他们对所有可用信标的往返时间(ping),Gen2 将只考虑 ping 值在特定 difference 范围内的比赛,这些数据是针对Ping 信标衡量的。 这提供了一种“软”解决方案来划分您的玩家群体,使得与邻近地区的匹配尤其提升了对于人口较少区域的匹配速度。 使用 max_latency防止与远距离的玩家匹配。

您现在可以进行下一步。

我们的示例 beacons 规则上面使用了 "difference": 50, "max_latency": 200 初始化:

  • Alice 和 Bob 会匹配,因为北京被排除在外(>200),其余则在 | A-B | <50 范围内:

    • Alice {蒙特利尔: 12.3, 纽瓦克: 45.6, 达拉斯: 59.9, 北京: 264.4};和

    • Bob {蒙特利尔: 27.3, 纽瓦克: 32.4, 达拉斯: 23.1, 北京: 252.2}.

  • Charlie 和 Dave 不会匹配,因为对于达拉斯信标,| C-D | >50:

    • Alice {蒙特利尔: 5.7 纽瓦克: 44.2, 达拉斯: 59.5, 北京: 263.2};和

    • Bob {蒙特利尔: 57.8, 纽瓦克: 32.0, 达拉斯: 24.2, 北京: 272.3}.

请注意,“延迟规则”在初始配置规则中只能定义一次。

3. 审查实例详情​

初始化后,请在我们的仪表板中审查您的新对局配对器的详细信息:

状态 指示服务的健康状况,可为在线、离线或错误。

  • 标识符 有助于 Edgegap 员工快速找到您的对局配对器,以便您需要帮助进行故障排除。

  • 启动时间 可用于追踪最新更新时间。

  • 大小 对应我们的一个 定价套餐。

  • API URL 将由游戏客户端和游戏服务器用于与 Gen2 通信。

  • Swagger URL 是我们提供的一个方便的 openAPI 规范 GUI,用于探索 API 模式。

  • 授权令牌 是由游戏客户端和游戏服务器用于认证的唯一秘密令牌。

要使用 API 测试您的新对局配对器,您将需要 Swagger URL、API URL 和授权令牌。

您现在可以进行下一步。

4. 测试票证 API

首先,打开您的 Swagger URL 以检查您在 swagger GUI 中的 openAPI 模式

点击“对局配对器”标题下的 /...swagger.json URL 来打开原始 JSON 模式:

将此页面保存为文件到您的驱动器中(CTRL/CMD+S)。

打开您的 Postman 应用并登录到您的免费帐户。

从上一步中导入您的 swagger.json文件:

  • 保持 Postman 集合 选中,

  • 选择 查看导入设置 并更改设置 参数生成 为 示例。

确认导入,这将导致新集合出现在左侧列表中的集合列表中,标题为对局配对器。

查看更多操作,打开选项卡 授权 并选择:

  • 权限类型 - API 密钥,

  • 键 - “授权”

  • 值 - 在此处插入您的 授权令牌 值,

  • 添加到 - 标题。

按(CTRL/CMD+S)或保存图标进行 保存更改。Postman 选项卡中的橙色点应该消失。

在您的对局配对器集合中,选择 票证 和 创建对局配对票证,打开一个新选项卡。

选择选项卡 正文 以预览您的 玩家票证请求:

注意 player_ip 设置为 null-这将导致自动添加到您的请求的 IP 地址(请参阅 服务器对服务器集成 的替代方案),

  • profile 指的是您的 对局配对配置文件,

  • attributes 包括对局配对规则的值,在这种情况下是 latencies 规则,

    • 规则 player_count 是唯一不需要在玩家票证中包含任何属性的规则。

注意:请确保参考示例的Swagger 的导入配置。

点击 发送 并查看对您的玩家票证请求的响应:

  • id 是您的唯一对局配对票证 ID,请保存以便稍后查看您的票证,

  • profile 确认对局配对配置文件的选择,

  • group_id 是为每个票证发出的唯一组 ID,一个单独的玩家表示为 1 人的组,

  • player_ip 是玩家的公共 IP 地址,无论使用哪种识别方式,

  • assignment 设置为 null 表示票证尚未匹配或分配到服务器,

  • created_at 提供有关玩家票证创建时间的信息,用于游戏 UI 使用,

  • status 指示票证的当前状态,所有票证开始于 SEARCHING (详见对局配对过程)。

通过再次点击 发送 创建第二张票证,以便我们的两名玩家配对并启动一个服务器。

在您的对局配对器集合中,选择 {ticketId} 和 读取对局配对票证。

用上一步中的响应输入票证 ID 并点击 发送。

查看您的玩家票证的更新分配:

  • 状态首先更改为 MATCH_FOUND,同时保持 assignment 为 null,表示玩家已匹配并正在分配服务器。

再次点击 发送 以查看您的票证,并查看您的玩家票证的更新分配:

  • 状态更改为 HOST_ASSIGNED ,assignment包含已分配服务器的详细信息。

 在我们的仪表板中检查您的新部署:

  • 注意每次部署都标记有所有票证 ID 和配置文件以增加可追溯性。

尝试从您的游戏客户端连接到分配的服务器。

一旦您确认能够无故障连接到您的部署并完成测试,停止您的部署 以在您的帐户中释放下一个构建的容量。

您现在可以进行下一步。

5. 在您的游戏中集成对局配对器​

Edgegap 的对局配对集成:

  • 与 游戏客户端,以管理 玩家票证,

  • 与 游戏服务器集成,实现:

    • 处理通过其票证传递的玩家偏好,

    • 可选支持背填充以在开始后添加或替换玩家。

对于在 游戏客户端,我们建议通过在游戏中 UI 提供 对局配对过程的票证状态更新给玩家以获得最佳的玩家体验。请参阅:

在 游戏客户端中,确保您处理不可重试的错误:

  • HTTP 404 找不到 - 票证已被删除,

  • HTTP 500 内部服务器错误 - 临时服务中断。

在 游戏服务器中,处理玩家偏好和初始服务器上下文。无需 API 集成:

  1. 读取 注入环境变量(Gen2) 以检索初始玩家的对局配对数据。

  2. 读取 注入环境变量(应用版本) 以获取特定版本的参数、设置(玩家容量)和秘密。

  3. 读取 注入环境变量(部署) 以获取部署信息,如 IP 地址、位置或更多信息。

一旦玩家连接,游戏服务器和游戏客户端便开始加载场景以执行同步步骤(例如选择并加载地图/场景/关卡)。我们推荐使用一个完整功能的 3D 场景、社交界面的大厅式 UI 或具有进度条的加载屏幕,以指示初始化正在进行。

一旦游戏客户端完成加载,玩家将加载/转移到主要游戏场景。

可选的,游戏服务器 可以创建和管理 背填充 和玩家容量(添加或替换离开的玩家)。

确保您的 部署将被正确停止 使用 注入的 DELETE_URL,如果:

  • 没有玩家加入比赛,

  • 所有玩家均已离开比赛,

  • 比赛正确地结束。

恭喜,您已完成 Edgegap 对局配对器集成!如果您想了解更多信息,请在我们的学习中心中阅读所有相关资料。

书写者

Edgegap团队

Get your Game Online Easily & in Minutes

立即开始集成!

轻松在线游戏
且在几分钟内

Get your Game Online Easily & in Minutes