事件管道教程

本文档是分步教程,介绍了如何在 PlayFab 服务 SDK 中使用事件管道功能。

步骤 1 - 初始化 PlayFab 服务 SDK

第一步:使用PFServicesInitializePFServiceConfigCreateHandle API 初始化 PF 服务 SDK。

PFServiceConfigCreateHandle API 接收可从 PlayFab Game Manager 的游戏中获取的连接字符串和游戏 ID。

第三个参数是PFServiceConfigHandle结构,表示正在创建的配置。 下一步将使用此服务配置句柄。

PFServiceConfigHandle serviceConfigHandle;

PFServicesInitialize(nullptr);

PFServiceConfigCreateHandle(
    "titleConnectionString",
    "titleId",
    &serviceConfigHandle
);

步骤 2 - 创建遥测事件管道

接下来,使用PFEventPipelineCreateTelemetryPipelineHandleWithKey API 创建具有遥测密钥的遥测事件管道。 遥测密钥通过 PlayFab Game Manager 创建和管理。

创建 PFEventPipelineTelemetryKeyConfig 结构时,我们会传递在 SDK 初始化期间获取的实际遥测密钥和服务配置句柄。

PFEventPipelineHandle handle;
XTaskQueueHandle taskQueueHandle;

XTaskQueueCreate(XTaskQueueDispatchMode::ThreadPool, XTaskQueueDispatchMode::Manual, &taskQueueHandle);

PFEventPipelineTelemetryKeyConfig telemetryKeyConfig
{
    "myTelemetryKey",
    serviceConfigHandle,
};

HRESULT hr = PFEventPipelineCreateTelemetryPipelineHandleWithKey(
    &telemetryKeyConfig,
    taskQueueHandle,
    nullptr,
    nullptr,
    nullptr,
    &handle
);

if (FAILED(hr))
{
    printf("Failed creating event pipeline: 0x%x\r\n", hr);
    return;
}

步骤 3 - 更新管道配置

让我们更新管道配置,在此示例中,我们希望发送最多 10 个事件(默认值为 5)的批处理。

此外,由于我们将 maxWaitTimeInSeconds 和 pollDelayInMs 作为 null 指针发送,因此它们使用相应管道类型的默认值。

我们还指定了“中等”压缩级别,设置此属性可压缩正文有效负载,并有助于优化网络资源利用率。

然后,我们继续调用PFEventPipelineUpdateConfiguration,传递从上一步获取的PFEventPipelineHandlePFEventPipelineConfig结构。

uint32_t maxEvents = 10;
PFHCCompressionLevel compressionLevel = PFHCCompressionLevel::Medium;

PFEventPipelineConfig eventPipelineConfig
{
    &maxEvents,         // maxEventsPerBatch
    nullptr,            // maxWaitTimeInSeconds
    nullptr,            // pollDelayInMs
    &compressionLevel   // compressionLevel
};

HRESULT hr = PFEventPipelineUpdateConfiguration(
    handle,
    eventPipelineConfig
);

if (FAILED(hr))
{
    printf("Failed updating event pipeline configuration: 0x%x\r\n", hr);
    return;
};

步骤 4 - 发出事件

在此步骤中,我们通过PFEventPipelineEmitEvent API 仅发出 1 个名为“TelemetryKeyEvent”的事件。

此事件未链接到任何实体,因为到目前为止,我们尚未提供实体身份验证。

PFEvent myEvent
{
    nullptr,
    "custom.playfab.events.PlayFab.Test.TelemetryEventPipelineTests",
    "TelemetryKeyEvent",
    nullptr,
    "{}"
};

HRESULT hr = PFEventPipelineEmitEvent(
    handle,
    &myEvent
);

if (FAILED(hr))
{
    printf("Failed emitting event: 0x%x\r\n", hr);
    return;
}

步骤 5 - 获取实体

在这里,我们希望获取可用于开始链接事件的实体。

在本教程中,我们会调用PFAuthenticationReLoginWithXUserAsync API 以获取有效的PFEntityHandle

注意

作为PFAuthenticationLoginWithXUserRequest的一部分传递的 userHandle 对象属于 XUserHandle 类型。 有关如何获取有效 XUserHandle 的步骤不在本教程的范围内。 有关本主题的详细信息,请参阅XUserAddAsync文档。

PFEntityHandle entityHandle;

PFAuthenticationLoginWithXUserRequest request{};
request.createAccount = true;
request.user = userHandle; // An XUserHandle obtained from XUserAddAsync

XAsyncBlock async{};

HRESULT hr = PFAuthenticationReLoginWithXUserAsync(entityHandle, &request, &async);

if (FAILED(hr))
{
    printf("Failed PFAuthenticationReLoginWithXUserAsync: 0x%x\r\n", hr);
    return;
}

hr = XAsyncGetStatus(&async, true); // This is doing a blocking wait for completion, but you can use the XAsyncBlock to set a callback instead for async style usage

if (FAILED(hr))
{
    printf("Failed XAsyncGetStatus: 0x%x\r\n", hr);
    return;
}

步骤 6 - 将实体添加到管道

由于我们已获得有效的实体,因此可以调用PFEventPipelineAddUploadingEntity,并传递上一步中的事件管道句柄和实体句柄。 此操作允许管道切换为使用实体身份验证。

HRESULT hr = PFEventPipelineAddUploadingEntity(
    handle,
    entityHandle
);

if (FAILED(hr))
{
    printf("Failed adding uploading entity: 0x%x\r\n", hr);
    return;
}

步骤 7 - 发出事件

此过程与上一个事件提交的过程相同。

唯一的两个区别是:

  • 我们会使用其他名称(“EntityEvent”)标记此事件,以使其更清晰。
  • 此事件会记录并链接到我们之前获取的实体。
PFEvent myEvent
{
    nullptr,
    "custom.playfab.events.PlayFab.Test.TelemetryEventPipelineTests",
    "EntityEvent",
    nullptr,
    "{}"
};

hr = PFEventPipelineEmitEvent(
    handle,
    &myEvent
);

if (FAILED(hr))
{
    printf("Failed emitting event: 0x%x\r\n", hr);
    return;
}

步骤 8 - 关闭事件管道句柄

最后,上传完事件后,唯一要做的就是调用PFEventPipelineCloseHandle,传递管道句柄。

PFEventPipelineCloseHandle(handle);

另请参阅