多人游戏会话高级主题

使用本主题了解多人游戏会话中的高级概念。

本主题涵盖以下内容:

会话概述

多人游戏会话目录 (MPSD) 中的会话有一个会话名称,并被标识为会话模板的实例。 会话模板是为会话提供默认设置的 JSON 文档。

会话模板是服务配置的一部分,包含服务配置标识符 (SCID),它是一个 GUID。 会话模板位于 合作伙伴中心上。

服务配置是面向开发者的资源,用于引入、管理和安全策略。 当通过 MPSD 访问会话时,主要授权根据开发者通过合作伙伴中心设置的访问策略对服务配置执行。 当会话在授予了服务配置的访问权限后加载时,辅助访问检查(如会话成员身份验证)在会话级别执行。

重要

通过模板设置的功能不能通过写入到 MPSD 进行更改。 要更改这些值,您必须创建并提交包含必要更改的新模板。 未通过模板设置的任何项目均可以通过写入到 MPSD 进行更改。

协定版本号

本主题假设你的模板使用协定版本 107,即当前的 MPSD 为 Xbox One 使用的版本。

会话引用

每个 MPSD 会话对应于一个会话引用,在多人游戏 API 中,由 XblMultiplayerSessionReference 结构表示。 会话引用包含以下字符串值。

  • 服务配置标识符 (SCID)
  • 会话模板名称
  • 会话名称

会话引用映射到用于标识会话的 URI 中,如下所示。 在下面的示例映射中,sessiondirectory.xboxlive.com authority

https://{authority}/serviceconfigs/{service-config-id}/sessiontemplates/{session-template-name}/sessions/{session-name}

会话的元素

每个会话都包含强制实施可变性和安全规则的元素组。 它们因会话元素以及只读家务信息(元数据)而异。 本部分介绍 JSON 文件中包含的用于配置会话以及 JSON 文件中用于您选择的模板的各组会话元素。

注意

如果将自定义包装器用于 HTTP/REST 实现,则会话和模板必须定义精确反映实现功能的 JSON 对象。

每个元素组中都有两个内部对象。

  • 系统对象: 这些对象具有 MPSD 强制和解释的固定架构。 它们已验证并合并。 由于 MPSD 定义并知道它们的含义,因此它可以对它们执行操作。 有关每个系统对象的完整定义,请参阅 XblMultiplayerSession 前缀和会话目录 URI 的引用。

  • 自定义对象: 这些对象是可选的,没有架构。 它们用于存储与多人游戏相关的元数据。 由于 MPSD 无法解释此数据,因此不会对其执行操作。 游戏数据或保存的信息应存储在游戏管理的存储 (TMS) 中。 有关 TMS 的详细信息,请参阅 Xbox 服务游戏存储概述

下面是自定义 JSON 对象的示例。

    "custom": {
      "myField1": true,
      "myField2": "string",
      "myField3": 5.5,
      "myField4": { "myObject": null },
      "myField5": [ "my", "array" ]
    }

会话常量

会话常量 仅在创建时由创建者或会话模板设置。 /constants/system 对象用于定义多人游戏系统的常量,因为它通过 MPSD 已知。 与此对象关联的包装器由 XblMultiplayerSessionConstants 结构表示。

/constants/system 对象可以定义多个项。 其中包括capabilities 对象、metrics 对象, managedInitialization(模板协定版本 104 或 105)或 memberInitialization(协定版本 107)对象, peerToPeerRequirements 对象, peerToHostRequirements 对象,measurementsServerAddresses 对象。

会话属性

使用 /properties/system 对象定义 MPSD 的会话属性。 与此对象关联的包装器是 XblMultiplayerSessionProperties 结构。 会话成员随时可以写入会话属性。

JSON 格式的会话属性示例包括joinRestrictioninitializationSucceeded,以及 matchmaking 对象。 有关此元素组的使用示例,请参阅目标会话初始化和 QoS

成员常量

在加入时为每个会话成员设置成员常量。 JSON 对象 /members/{index}/constants/system。 表示会话成员的包装类是 XblMultiplayerSessionMember 结构。

返回到本主题顶部。

成员属性

成员属性仅可由会话成员写入。 它们在 /members/{index}/properties/system 对象中设置,并反映 XblMultiplayerSessionMember 结构的元素。

下面是一个示例。

    {
      // These flags control the member status and "activeTitle" and are mutually exclusive (it's an error to set both to true).
      // For each, false is the same as not present. The default status is "inactive"; that is, neither present.
      "ready": true,
      "active": false,

      // Base-64 blob, or not present. An empty string is the same as not present.
      "secureDeviceAddress": "ryY=",

      // During member initialization, if any members in the list fail, this member will also fail.
      // Can't be set on large sessions.
      "initializationGroup": [ 5 ],

      // List of the groups I'm in and the encounters I just had.
      // An encounter is a brief interaction with a group. When an encounter is reported, it counts as retroactively joining the group 30 seconds ago and just now leaving.
      // Group names use the session name validation rules (like case-insensitive).
      // On large sessions, groups are used to report who played with whom (rather than just session membership). Members
      // who are active in at least one group together at the same time are counted as playing together.
      // Empty lists are the same as no value specified.
      // The set of encounters is a point-in-time property, so it's immediately consumed and will never appear on a response.
      "groups": [ "team-buzz", "posse.99" ],
      "encounters": [ "CoffeeShop-757093D8-E41F-49D0-BB13-17A49B20C6B9" ],

      // Optional list of role preferences that the player has specified for role-based game modes.
      // All role names have to match across all members in the session. Role weights are
      // defined from 0-100.
      "RolePreference": { "medic": 75, "sniper": 25, "assault": 50, "support": 100 },

      // Quality of Service (QoS) measurements by lowercase device token.
      // Like all fields, "measurements" must be updated as a whole. It should be set once when measurement is complete, not incrementally.
      // Metrics can be omitted if they weren't successfully measured; that is, the peer is unreachable.
      // If a "measurements" object is set, it can't contain an entry for the member's own address.
      "measurements": {
        "e69c43a8": {
          "bandwidthDown": 19342,  // Kilobits per second.
          "bandwidthUp": 944,  // Kilobits per second.
          "custom": { }
        }

      // QoS measurements by game-server connection string. Like all fields, "serverMeasurements" must be updated as a whole, so it should be set once when measurement is complete.
      // If empty, it means that none of the measurements were completed within the "serverMeasurementTimeout".
      "serverMeasurements": {
        "server farm a": {
          "latency": 233  // Milliseconds.
        }
      },

      // Subscriptions for shoulder taps on session changes. The "profile" indicates which session changes to tap and other properties of the registration like the minimum time between taps.
      // The subscription is named with a title-generated GUID that's also sent back with the tap as a context ID.
      // Subscriptions can be added and removed individually, without affecting other subscriptions in the "subscriptions" object.
      // To remove a subscription, set its context ID to null.
      // (Like the "ready" and "active" flags, the "subscriptions" data is copied out and maintained internally, so the normal replace-all rule on system fields doesn't apply to "subscriptions".)
      // Can't be set on large sessions.
      "subscriptions": {
        "961dc162-3a8c-4982-b58b-0347ed086bc9": {
          "profile": "party",  // Or "matchmaking", "initialization", "roster", "queuehost", or "queue".
          "onBehalfOfTitleId": "3948320593",  // Optional decimal title ID of the registered channel. If not set, the title ID is taken from the token.
        },
        "709fef70-4638-4b94-905b-24cb02706eb5": null
      }
    }

服务器元素

服务器 是已加入或受邀加入会话的非用户。 关联的 JSON 对象/servers/{server-name}/constants/system/servers/{server-name}/properties/system。 这些对象只能由服务器写入。

注意

当前未使用 /servers/{server-name}/constants/system 对象。

会话配置

可以通过以下方式控制会话的配置。

  • 使用通过合作伙伴中心引入的会话模板。
  • 使用对多人游戏和匹配 API 或 REST API 的调用。 仍必须使用模板,但不一定包含要配置的值。 请注意,您的游戏无法重写模板中已设置的常量。

提供了单独的 JSON 文档来定义会话本身。 此外,还必须实现特定游戏所需的任何包装功能。 JSON 文档的内容和任何包装代码必须精确地相互反映,并且必须反映最新的模板协定版本。

使用会话版本(主要版本)和协议修订(次要版本)对会话架构进行版本控制。 这些版本将合并到 X-Xbl-Contract-Version 标头中,显示为“100 * major + minor”。 例如,v1.7 游戏在每个 REST 请求中包括以下标头,假设最新模板协定版本为 107:X-Xbl-Contract-Version: 107。

注意

建议大多数游戏(使用 Xbox 服务 API [XSAPI])使用协定版本 105 和会话模板版本 107。

会话模板

每个会话模板都是一个 JSON 文档,是服务配置的一部分,定义正在创建的会话的框架并为新会话提供常量。 有关详细信息,请参阅 多人游戏会话模板

返回到本主题顶部。

会话功能

功能是 MPSD 会话中的常量,该会话配置 MPSD 应该对其应用的行为。 您最常使用合作伙伴中心来设置会话模板中的功能。

功能在 /constants/system/capabilities 对象中设置。 如果不需要任何功能,请使用空的 capabilities 对象。

注意

游戏几乎从不通过使用多人游戏 API 或匹配 API 更改或访问会话功能。

会话功能由 XblMultiplayerSessionCapabilities 结构表示。 它们是布尔值,指示会话可以支持的内容。

  • Connectivity
  • 游戏玩法
  • 大尺寸
  • 活动成员所需的连接

XblMultiplayerSessionConstants 结构包含一个SessionCapabilities成员(属于 XblMultiplayerSessionCapabilities 类型),该成员定义与会话功能相关的以下属性。

  • CapabilitiesConnectivity
  • CapabilitiesGameplay
  • CapabilitiesLarge

注意

如果游戏定义了动态会话功能,则会话常量的相应属性将设置为 true

返回到本主题顶部。

会话大小

MPSD 会话的大小由该会话中的成员数量确定。

最大会话大小

会话的最大大小即会话可容纳成员的最大数量。 它由 XblMultiplayerSessionConstants::MaxMembersInSession 属性表示。 最大成员大小在 /constants/system 对象中设置。

最大会话大小介于 1 到 100 个会话成员之间,如果创建时未设置,则默认为 100。 如果所需大小超过 100,会话被称为“大”会话,并以特殊方式设置。

断开连接

设置会话的最大大小可能会导致空位在某些断开连接场景中显示为已满。 例如,如果玩家由于网络或电源故障而断开连接,则延迟不会立即反映在会话中。 使用断开连接检测功能将成员设置为"非活动"。 有关详细信息,请参阅多人游戏会话目录概述主题中的 MPSD 更改通知处理和断开连接检测 部分。

相比之下,使用检测信号检测断开连接的对等网格通常能在两到三秒内得知断开连接,因此可以立即打开玩家空位。 但是,仲裁程序无法删除其他成员。

大型会话

大型 MPSD 会话最多可以有 1,000 个成员,但它禁用了一些会话功能,例如获取所有成员的列表。 会话较大性由 XblMultiplayerSessionCapabilities::Large 属性表示。

此属性设置为 true以指示大型会话。 "大型"功能在 /constants/system/capabilities 对象中指示。 有关详细信息,请参阅会话功能

返回到本主题顶部。

会话用户状态

MPSD 将 用户状态 定义为已添加到会话的用户的状态。 可能的用户状态由 XblMultiplayerSessionStatus 枚举定义。 将用户添加到会话前,也将其状态视为“空闲”。

可以使用 XblMultiplayerSessionCurrentUserSetStatus 更改会话用户状态。 通过在游戏会话 JSON 文档中正确设置 /members/{index}/properties/system进行此更改。

保留的用户状态

当仲裁程序已选择某用户来填充会话内的空位时,该用户将被置于保留的用户状态。 在这种状态下,用户尚未正式接受会话邀请或未加入会话以开始与对等方连接。

活动用户状态

当用户处于活动状态时,游戏已代表用户加入了会话,而且用户正在积极参与会话。 只要用户玩游戏,用户就会继续处于此状态。

当游戏首次启动时,它应查看用户是否已是某个会话的成员,通常通过检查会话状态来查看。 如果用户是会话成员,则游戏可以直接进入游戏并将任何参与的本地成员设置为活动用户状态。

处于游戏会话中时,用户应保持“活动”状态。 如果用户使用游戏内 UI 离开会话,则应通过调用 XblMultiplayerSessionLeave 将其从会话中删除。 如果用户只是暂时离开游戏,当游戏受限时,游戏应在合理的时间长度内将用户保留为活动状态。

如果用户在游戏指定的时间段后未返回,则应将用户状态更改为"非活动"。

非活动用户状态

在非活动状态下,用户当前未参与游戏,但在会话中仍有保存的空位。 换言之,用户是“不活动”的。

用户自己的控制台负责将其设置为会话中的非活动用户状态。 仲裁程序无法执行此操作。

将用户置于非活动状态的示例方案包括:

  • 游戏收到“正在挂起”事件。

  • 用户在游戏定义的时间段内处于非活动状态(无输入或控制器响应)。 对于有竞争力的多人游戏,我们建议使用两分钟。

  • 游戏已处于约束模式超过两分钟或游戏定义的时间段。 此受约束的模式超时期限是用户可能因使用与游戏相关的应用或其他体验而离开游戏的预期时间。

  • 用户已从会话非正常断开。 有关详细信息,请参阅多人游戏会话目录概述主题中的 MPSD 更改通知处理和断开连接检测 部分。

如果游戏启动且特定会话成员的用户状态设置为非活动,则表明游戏已挂起或用户在会话中处于非活动状态的时间太长。 由于游戏正在重新启动,则指示用户想要继续进行他或她所属的游戏会话。

如果用户状态在游戏启动后是活动的,此状态很可能是由于网络断开连接或另一个场景:游戏无法在中断之前将用户设置为非活动状态。 在这两种情况下,您的游戏都应尝试将用户与游戏及其他用户重新连接以继续游戏,或从会话中删除该用户。

会话结束时的用户状态

当会话结束时,将停止游戏。 游戏必须允许所有用户使用 XblMultiplayerSessionLeave 删除其自身。 当用户离开会话时,将自动清除与这些用户关联的会话活动。

返回到本主题顶部。

可见性和可加入性

会话访问在 MPSD 级别通过两个设置控制:会话可见性和会话可加入性。 我们在本主题中做出的可见性和可加入性建议适用于最常见的游戏方案。 游戏应遵循这些设置(如果可能)。 他们应使用游戏内逻辑来最终确定是否允许新玩家加入会话。

会话可见性

会话可见性 由创建会话时设置的常量表示。 它通常在会话模板中定义,并确定哪类用户具有对会话的读写访问权限。

会话可见性可能的值由 XblMultiplayerSearchHandleGetVisibility 定义。 JSON 文件中的可见性常量允许的设置为openvisibleprivate

开放游戏会话不需要玩家保留,这简化了邀请流程。

仲裁程序不在邀请发送后将玩家保留在 MPSD 中,而只是在本地跟踪受邀请的玩家。 因此,玩家可以立即连接到仲裁程序,并确定他们是应该加入会话、被拒绝,还是应该等待(如果支持等待玩家)。

仲裁程序是最终授权。 他们响应并指示新成员留在会话中或离开会话。

使用开放游戏会话可见性需要受邀请的玩家启动游戏并在进行最终决定前连接到仲裁程序。 如果会话已满或已拒绝邀请,则可以向用户显示错误消息。

要建立与仲裁者的连接,需要安全设备地址。 XblMultiplayerSessionProperties::HostDeviceToken属性用于查明哪个会话成员是会话的当前仲裁者,以及受邀请的玩家应该使用哪个安全设备地址进行连接。

会话可加入性

会话可加入性 确定哪些类型的用户可以加入会话。 它可以在会话期间动态设置。

会话可联接性的可能值如下所示。

  • 无(默认值): 对谁可以加入会话没有限制。
  • 本地: 仅本地用户可以加入会话。
  • 已关注: 仅本地用户和其他会话成员关注的用户可以在不保留的情况下加入会话。

会话仲裁程序可以通过可加入性设置创建私人会话。 将可加入性设置为“本地”或“已关注”将限制对会话的访问,并使其成为私人会话。

仲裁程序还应跟踪会话可加入性,以便在需要时在主机级别拒绝较旧的会话邀请。 例如,如果任何受邀的玩家在会话已满之前尚未加入会话,仲裁程序可以指示加入的玩家会话已锁定,他们需要自动离开会话。

返回到本主题顶部。

会话超时

会话可以由计时器和其他外部事件更改。 会话超时 定义会话成员在自动处于非活动状态或从会话中删除之前可以保持特定状态的时段。 MPSD 还支持超时来管理会话生存期。

注意

在模板协定版本 104 或 105 的 /constants/system/timeouts 或托管初始化对象中进行超时设置。 对于版本 107 或更高版本,设置在 /constants/system 或托管初始化对象中单独进行。

当计时器到期后,MPSD 不会自动更新会话,也不会在进行任何更改时通知仲裁程序。 会话和超时状态仅在发送读或写请求的前一刻更新。 立即更新可确保返回的数据是最新的。

注意

不会堆叠会话超时。 仅对更新中的每个会话成员应用一个状态转换。

当前定义的超时

本部分介绍当前由 MPSD 定义的超时。

  • 所有超时均以毫秒为单位指定。
  • 允许值 0,其表示立即超时。
  • 没有值的超时被视为无限。

由于超时具有默认值,因此应为无限超时显式指定null

evaluationTimeout

此超时表示会话成员做出和上传评估决策的时间量。 如果未收到任何决定,则将决定计作失败。 此超时放置在托管初始化对象中。

inactiveRemovalTimeout

此超时是为已加入会话但当前未参与游戏的会话成员设置的。 默认情况下,会在两小时后从会话中删除该成员。

注意

此超时被指定为模板协定版本 104 或 105 的非活动超时。

在许多情况下,建议将非活动超时设置为 0。 这会导致将设置为非活动状态的任何用户立即从会话中删除,并清除相应的槽。 这是大多数多人竞技游戏所需要的行为,这样,如果用户已进入或已到达非活动状态,新玩家可以快速补位。

对于合作或其他多人游戏设计,如果用户断开连接或一段时间内未参与游戏,您可能需要您的游戏留给用户更多重新连接的时间。 请注意,没有哪一种解决方案能够适合所有设计场景。

joinTimeout

此超时指示用户必须加入会话的毫秒数。 对于无法加入会话的用户,将删除预留。 此超时放置在托管初始化对象中。

measurementTimeout

此超时指示会话成员必须上传度量的时间量。 无法上传度量值的成员标记有失败原因“超时”。 此超时放置在托管初始化对象中。

注意

匹配期间,强制执行针对 QoS 度量的 45 秒超时。 因此,我们建议您在匹配期间使用小于或等于 30 秒的度量超时。

readyRemovalTimeout

此超时为已加入会话且正在尝试加入游戏的会话成员设置。 这通常意味着 shell 已代表游戏加入用户,并且正在启动它。 默认情况下,成员将从会话中删除,并在三分钟后处于非活动状态。

注意

此超时被指定为合同版本 104 或 105 的就绪超时。

reservedRemovalTimeout

此超时设置为已由其他人添加到会话但尚未加入会话的会话成员。 当超时到期时,保留被删除、成员被视为处于非活动状态。 默认值为 30 秒。

注意

此超时被指定为协定版本 104 或 105 的保留超时。

sessionEmptyTimeout

此超时指示删除会话时会话变为空后的毫秒数。 默认值为 0。

注意

此超时被指定为协定版本 104 或 105 的 sessionEmpty 超时。

会话超时示例

  1. 会话从四个玩家开始。

  2. 两个玩家 A 和 B 由于电源故障断开连接。 其在游戏中的状态仍为“活动”。

  3. 另外两个玩家 C 和 D 将使用 XblMultiplayerSessionLeave 正常退出。

  4. 会话保持打开状态。 玩家 A 和 B 已断开连接,但仍处于活动状态。

  5. 几天之后,玩家 A 返回并启动游戏。

  6. 玩家 A 的游戏查找 A 所属的会话(执行读取),并从几天前查找孤立的会话。

  7. 会话对仍在会话中的两个玩家(A 和 B)进行状态检查。

    1. 由于玩家 A 正在运行游戏,因此针对玩家 A 的状态检查成功。 玩家在匹配中的活动状态保持不变。
    2. 玩家 B 未运行游戏。 因此,播放器 B 的状态检查失败。 该服务将玩家 B 的状态设置为"非活动"。 此时,玩家 B 的非活动超时开始。
  8. 玩家 A 使用 XblMultiplayerSessionLeave 方法正确退出会话。

  9. 对于玩家 B,非活动超时将过期,该玩家在下次读取或写入操作时会从会话中删除。

  10. 会话现在有零个成员,并被从服务中删除。

如果示例会话的非活动超时设置为 0,则玩家 B 会在步骤 7.1 中检查状态后立即超时,并且可能会被会话写入删除。 在此情况下,会话关闭,无需对会话执行额外的读取或写入。

返回到本主题顶部。

单个主机上多个登录的用户

当多个用户被登录到同一个主机时,有可能有些用户处于游戏会话中,而其他用户未在会话中或未在当前游戏中处于活动状态。 游戏邀请还可以针对多个用户接收和接受,这会影响游戏会话的成员身份。 请考虑您的游戏的此信息,以便它可以正确处理所有会话成员身份方案。

在常见场景中,新玩家登录,在游戏中进入活动状态,并需要被添加到现有的游戏会话中。 与创建新的游戏会话一样,游戏应仅在游戏期间适当时添加用户。

有多个登录的用户时,一个或多个用户还可以收到另一个游戏会话的邀请。 游戏无需以任何特定方式处理这些方案。 会话状态和成员事件会将游戏会话和用户成员身份的任何更新告知游戏。

为了为联机会话处理多个登录的用户,游戏为每个用户使用单独的 XboxLiveContext Class对象来为所有用户订阅“即时点击”。 游戏使用 XblMultiplayerSessionInfo::ChangeNumber 属性来确定会话中的特定更改,并忽略重复的肩部点击。

返回到本主题顶部。

进程周期管理

就像非多人游戏,多人游戏会话中的游戏可能会遇到进程周期事件的游戏挂起和终止。 因此,会话仲裁程序应定期保存会话状态。

如果仲裁程序被挂起,游戏应尝试仲裁程序迁移并根据需要保存游戏状态。 然后,新的仲裁程序可以还原会话状态。 然后,如果会话在 MPSD 中仍然有效,则可以暂停并稍后恢复完整的多人游戏会话。

只有一个指定的对等项(通常为游戏主机)应更新全球游戏的状态。

游戏元数据的存储

游戏在 MPSD 会话中存储游戏元数据。 游戏元数据是显示会话数据并使游戏可以查找并加入游戏会话所需的信息。

游戏在会话成员的自定义属性部分中存储特定于玩家的元数据。 例如,会话的玩家颜色和首选玩家武器。 会话范围的元数据(如当前映射)存储在 MPSD 会话的全局自定义属性部分中。

游戏元状态的存储

游戏状态通过使用 标题存储 服务存储在 TMS 中。 使用此位置的存储允许游戏迁移仲裁程序,无需担心权限。 有关详细信息,请参阅 迁移仲裁程序

注意

除非处于暂停状态,否则游戏不应尝试超过每五分钟一次将游戏状态保存到 TMS。

返回到本主题顶部。

清理非活动会话

如果 sessionEmptyTimeout 设置为 0,则在最后一个玩家离开会话时会自动删除 MPSD 会话。 若要了解如何防止未使用的会话在崩溃或断开连接后包含玩家,请参阅多人游戏会话目录概述主题中的 MPSD 更改通知处理和断开连接检测 部分。 当游戏查询玩家的会话时,崩溃或断开连接后未使用的会话的处理不正确可能会导致问题。

我们建议你通过调用 XblMultiplayerGetSessionAsync 然后评估会话,让游戏查询特定用户的所有会话来清理非活动会话。 当游戏遇到过时的会话时,游戏会为会话中的所有本地玩家调用 XblMultiplayerSessionLeave。 此调用最终会将成员计数降至 0,并清理会话。

返回到本主题顶部。

会话仲裁程序

某些多人游戏方法在游戏会话内应仅由一个客户端调用。 此客户端是参与会话的控制台之一,称为 仲裁程序或主机。 如果游戏中至少有一个会话成员,会话应使用仲裁程序来监控进行中的加入。

设置仲裁程序

当客户端创建会话时,它会将一个控制台指定为仲裁程序。 有关详细信息,请参阅多人游戏任务主题中的为 MPSD 会话设置仲裁程序部分。

保存会话状态

进程生命周期管理部分中所述,仲裁程序应定期保存会话状态。 新仲裁程序必须能够在游戏迁移仲裁程序时还原会话状态。 有关详细信息,请参阅 迁移仲裁程序

管理游戏会话成员和进行中的加入

会话仲裁程序最重要的角色是管理正在进入要玩的游戏会话的用户。 这包括处理游戏邀请、通知等待玩家,以及处理退出游戏的玩家。

接收通知

仲裁程序必须侦听想要使用 XblMultiplayerSessionChangedHandler 加入游戏会话的新玩家。

查找玩家以填充空游戏会话槽

仲裁程序使用以下操作之一查找用于填充空游戏会话槽位的玩家。

  • 如果游戏使用大厅会话或其他机制来允许延迟加入,请使用该机制查找新的会话成员。
  • 创建另一个匹配票证会话。

有关详细信息,请参阅多人游戏任务主题中的在匹配期间填充打开的会话槽部分。

处理受邀请的会话成员

仲裁程序必须监视受邀请的会话成员,并在对单个用户的邀请之间应用最短间隔。 有关详细信息,请参阅多人游戏任务主题中的结束游戏邀请部分。