异步操作与通知
对于可能较慢或计算量大的操作,PlayFab Lobby 和 Matchmaking SDK 提供了异步 API。异步 API 使你能够在主线程中启动昂贵或较慢的操作,并在你选择的线程上轮询这些操作的完成情况。此轮询机制也用于将 SDK 更新的异步通知传递到你的游戏代码。本页概述 PlayFab Lobby 和 Matchmaking SDK 的异步 API 模式以及针对它们进行编程的最佳实践。基本 API 模式
在 PlayFab Lobby 和 Matchmaking SDK 中,需要了解两种类型的异步 API 模式:异步操作
使用 SDK 的异步 API 很简单。启动和完成异步操作的一般模式如下:- 对你选择的适当异步 API 进行常规方法调用。你可能会用到的常见异步操作包括:
- 使用 SUCCEEDED() 或 FAILED() 宏检查 API 的 HRESULT 返回值。此同步返回的值将告诉你该操作是否已成功启动。
- 通过查找由 PFMultiplayerStartProcessingLobbyStateChanges() 或 PFMultiplayerStartProcessingMatchmakingStateChanges 提供的关联操作 “完成状态变更” 来轮询异步操作的完成情况。PFMultiplayerCreateAndJoinLobby() 关联的 “完成状态变更” 的一个示例是 PFLobbyCreateAndJoinLobbyCompletedStateChange。有关 “状态变更” 是什么以及它们的工作方式的更详细信息,请参见状态变更部分。
- 检查完成状态变更的 result 值,以确定操作是成功还是失败。有关这些错误值的更多详细信息,请参阅 SDK 的错误处理文档。
异步通知
某些功能会生成有关 Lobby 和 Matchmaking SDK 变更的异步通知。 常见通知包括: 这些异步通知将由 SDK 作为 “状态变更” 通过 PFMultiplayerStartProcessingLobbyStateChanges() 和 PFMultiplayerStartProcessingMatchmakingStateChanges 提供给你。 有关 “状态变更” 是什么以及它们的工作方式的更详细信息,请参见状态变更部分。状态变更
Lobby 和 Matchmaking SDK 的异步 API 模型是围绕 PFLobbyStateChange 和 PFMatchmakingStateChange 结构构建的。PFLobbyStateChange 通知你关于大厅子系统的变更,PFMatchmakingStateChange 通知你关于匹配子系统的变更。 这些 “状态变更” 是来自 SDK 事件的异步通知。这些通知在内部进行排队,你通过调用 PFMultiplayerStartProcessingLobbyStateChanges() 和 PFMultiplayerStartProcessingMatchmakingStateChanges 来处理它们。这些函数会以列表形式返回所有已排队的状态变更(对于各自的 API 子系统),你可以逐个进行迭代处理。每个状态变更都有一个对应的 stateChangeType 字段,可以检查该字段以确定所收到的是哪种具体的状态变更通知。一旦知道收到的是哪种状态变更,你就可以将通用的 PFLobbyStateChange 或 PFMatchmakingStateChange 结构强制转换为更具体类型的状态变更结构,以检查该事件的具体数据。 通常,状态变更处理是通过一个简单的 switch 语句实现的,该语句将每个状态变更委托给一个处理程序。 一旦通过 PFMultiplayerStartProcessingLobbyStateChanges 或 PFMultiplayerStartProcessingMatchmakingStateChanges 处理完状态变更列表,就必须分别将其返回到 PFMultiplayerFinishProcessingMatchmakingStateChanges() 或 PFMultiplayerFinishProcessingMatchmakingStateChanges()。异步操作上下文
每个异步 API 都包含一个void* asyncContext 参数。此值是一个透传参数,一旦通过 PFMultiplayerStartProcessingLobbyStateChanges() 或 PFMultiplayerStartProcessingMatchmakingStateChanges() 提供了该 API 调用的关联完成状态变更,此值就会设置在其上。
此值为你的异步 API 调用附加任意的指针大小上下文提供了一种机制。这些上下文可用于多种场景,包括:
- 将特定于游戏的数据与 SDK 调用相关联
- 通过共享标识符将多个异步操作绑定在一起
操作排队
在使用异步 API 时,经常需要将多个异步操作作为更大异步流的一部分按顺序运行。 在 Lobby 和 Matchmaking SDK 中,一个例子是创建大厅并向你的好友发送该大厅的邀请。序列化后,此流程如下所示:- 调用 PFMultiplayerCreateAndJoinLobby() 以创建并加入一个 PlayFab 大厅。
- 等待 PFLobbyCreateAndJoinLobbyCompletedStateChange 反映大厅已成功创建并加入。
- 为每位被邀请的好友调用 PFLobbySendInvite()。
- 等待 PFLobbySendInviteCompletedStateChange 反映邀请已成功发送。
