将 blob 上传到游戏存储

本主题演示如何使用以下扁平 C 代码示例向 Xbox 服务游戏存储中上传 blob。

Notes about XblTitleStorageUploadBlobAsync parameters

  • 在异步操作期间,包含要上传的 blob 数据的缓冲区必须可用。 不应在上传正在进行时修改缓冲区。

  • 如果不提供 preferredUploadBlockSize 或默认大小不在可接受范围之内,则此方法会使用默认大小。 最小大小为 1024 字节。 最大大小为 4194304 字节。 默认大小为 262144 个字节。

  • 如果二进制 blob 超过大小限制,它们将被分为多个 preferredUploadBlockSize 的块上传。 在这种情况下,我们建议使用较大的大小。 如果出现超时,应使用较小的大小重试上传。

扁平 C

auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->queue = queue;
asyncBlock->context = blobBuffer.get();
asyncBlock->callback = [](XAsyncBlock* asyncBlock)
{
    std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock };    // Take over ownership of XAsyncBlock*.
    std::unique_ptr<std::vector<uint8_t>> blobBuffer{ static_cast<std::vector<uint8_t>*>(asyncBlock->context) };
    HRESULT hr = XblTitleStorageUploadBlobResult(asyncBlock, &blobMetadata);
};

XblTitleStorageBlobMetadata blobMetadata{};
pal::strcpy(blobMetadata.displayName, displayName.size() + 1, displayName.c_str());
pal::strcpy(blobMetadata.serviceConfigurationId, XBL_SCID_LENGTH, scid);
pal::strcpy(blobMetadata.blobPath, blobPath.size() + 1, blobPath.c_str());
blobMetadata.storageType = storageType;
blobMetadata.blobType = blobType;
time(&blobMetadata.clientTimestamp);

HRESULT hr = XblTitleStorageUploadBlobAsync(
    xboxLiveContext,
    blobMetadata,
    reinterpret_cast<const uint8_t*>(blobBuffer->data()),
    blobBufferSize,
    eTagMatchCondition,
    preferredUploadBlockSize, //    Optional .
    asyncBlock.get()
);

if (SUCCEEDED(hr))
{
    // The call succeeded, so release std::unique_ptr ownership of XAsyncBlock* because
    // the callback takes over ownership. If the call fails, however, std::unique_ptr keeps
    // ownership and deletes XAsyncBlock*.
    asyncBlock.release();
    blobBuffer.release();
}

另请参阅

XAsyncBlock

XblTitleStorageBlobMetadata

XblTitleStorageUploadBlobAsync

XblTitleStorageUploadBlobResult