本主题演示如何使用以下扁平 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();
}