XGameSaveReadBlobData
读取容器的 blob 数据。
语法
HRESULT XGameSaveReadBlobData(
XGameSaveContainerHandle container,
const char** blobNames,
uint32_t* countOfBlobs,
size_t blobsSize,
XGameSaveBlob* blobData
)
参数
container _In_
类型:XGameSaveContainerHandle
包含 XGameSaveBlob 数据的 XGameSaveContainer 的句柄。
blobNames _In_opt_z_count_(countOfBlobs)
类型:char*
指向表示 XGameSaveBlob 名称的字符串数组的指针。
countOfBlobs _Inout_
类型:uint32_t*
要读取的 blob 数。
blobsSize _In_
类型:size_t
已分配的 blob 数据的大小,可通过读取 blob 元数据来推断。
blobData _Out_writes_bytes_(blobsSize)
类型:XGameSaveBlob*
用于包含 blob 数据的 XGameSaveBlob 指针。 必须分配有内存,以便存储从容器请求的所有 blob。
返回值
类型:HRESULT
函数结果。
常见错误
- E_GS_INVALID_CONTAINER_NAME
- E_GS_PROVIDED_BUFFER_TOO_SMALL
- E_GS_BLOB_NOT_FOUND
- E_GS_CONTAINER_NOT_IN_SYNC
- E_GS_CONTAINER_SYNC_FAILED
- E_GS_HANDLE_EXPIRED
备注
注意
在时间敏感线程上调用此函数是不安全的。 有关详细信息,请参阅时间敏感线程。
使用此函数可读取游戏保存 blob 中的数据。 此函数将返回 blob 的数目以及 blob 容器内的数据。 您可以使用它们以便循环访问容器中的 blob,从而读取相应信息。 存在称为 XGameSaveReadBlobDataAsync 的此函数的异步版本。
// SYNC Read - should not be called on time sensitive thread
// as this will block until the operation is complete
void Sample::_ReadContainerBlobsSync(const XGameSaveContainerInfo* container)
{
const char* blobNames[] = {
"WorldState",
"PlayerState",
"PlayerInventory"
};
XGameSaveContainerHandle containerContext = nullptr;
size_t allocSize;
uint32_t countOfBlobs = _countof(blobNames);
XGameSaveBlob* blobs = nullptr;
HRESULT hr = XGameSaveCreateContainer(_provider, container->name, &containerContext);
if (SUCCEEDED(hr))
{
// this method finds the size for only the blobs in the container
// that we are requesting to read right now
hr = _GetContainerBlobsDataSize(container, blobNames, _countof(blobNames), &allocSize);
}
if (SUCCEEDED(hr))
{
blobs = reinterpret_cast<XGameSaveBlob*>(malloc(allocSize));
if (blobs == nullptr)
{
hr = E_OUTOFMEMORY;
}
}
if (SUCCEEDED(hr))
{
hr = XGameSaveReadBlobData(containerContext, blobNames, &countOfBlobs, allocSize, blobs);
}
if (SUCCEEDED(hr))
{
if (countOfBlobs == _countof(blobNames))
{
for (uint32_t i = 0; i < countOfBlobs; i++)
{
XGameSaveBlob* currentBlob = blobs + i;
if (strcmp(currentBlob->info.name, "WorldState") == 0)
{
hr = _LoadSaveBlob(currentBlob, _worldState);
}
else if (strcmp(currentBlob->info.name, "PlayerState") == 0)
{
hr = _LoadSaveBlob(currentBlob, _playerState);
}
else if (strcmp(currentBlob->info.name, "PlayerInventory") == 0)
{
hr = _LoadSaveBlob(currentBlob, _playerInventory);
}
if (FAILED(hr))
{
break;
}
}
}
else
{
hr = E_UNEXPECTED;
}
}
_HandleContainerBlobErrors(hr);
if (blobs != nullptr)
{
free(blobs);
}
if (containerContext != nullptr)
{
XGameSaveCloseContainer(containerContext);
}
}
void Sample::_HandleContainerBlobErrors(HRESULT hr)
{
// set some state
switch (hr)
{
case E_GS_INVALID_CONTAINER_NAME:
// tried to access a container with an invalid name
break;
case E_GS_PROVIDED_BUFFER_TOO_SMALL:
// shouldn't ever happen unless our math is wrong!!
break;
case E_GS_BLOB_NOT_FOUND:
// we asked for a blob that isn't in the container
break;
case E_GS_CONTAINER_NOT_IN_SYNC:
case E_GS_CONTAINER_SYNC_FAILED:
// need to sync and we are offline ?
break;
case E_GS_HANDLE_EXPIRED:
// need to re-initialize since another device has taken
// ownership while we were suspended and/or busy
break;
}
}
要求
头文件:XGameSave.h
库:xgameruntime.lib
支持平台:Windows、Xbox One 系列主机和 Xbox Series 主机
另请参阅
XGameSave
XGameSaveBlobInfo
XGameSaveReadBlobDataAsync
游戏保存错误