XGameSaveSubmitUpdateAsync
将更新异步提交到 XGameSave 服务。 更新容器内的 blob。
语法
HRESULT XGameSaveSubmitUpdateAsync(
XGameSaveUpdateHandle updateContext,
XAsyncBlock* async
)
参数
updateContext _In_
类型:XGameSaveUpdateHandle
要更新的 XGameSaveUpdate 的句柄。
async _In_
类型:XAsyncBlock*
包含针对 XGameSaveSubmitUpdateAsync 调用的调用上下文和回调函数的 AsyncBlock。
返回值
类型:HRESULT
函数结果
备注
此函数作为 XGameSaveSubmitUpdateAsync 的 AsyncBlock 调用函数的一部分调用。 此函数将用于确定 XGameSaveSubmitUpdateAsync 的结果。
此 API 的存储部分旨在轻松地以安全、可靠和事务性的方式将数据从游戏传输到永久性存储器中。 我们希望确保容器的备份数据始终一致,因此我们希望整个操作自动成功或失败。 我们不希望容器内某些 blob 数据与其他数据不一致的情况下进行部分更新。 为了执行此操作,我们提供 blob 写入和删除提交到的更新上下文,并且在其就绪时提交整个上下文。 在实践中,这类似于以下内容:
XGameSaveUpdate 将用写入和删除操作填充,以便通过 XGameSaveSubmitBlobWrite 和 XGameSaveSubmitBlobDelete 对容器内的 blob 执行。 通过调用 XGameSaveSubmitUpdateAsync 完成更新。
在您使用 XGameSaveUpdate 完成后,使用 XGameSaveCloseUpdate 方法关闭它。
下面的 C++ 示例演示了异步 XGameSave 更新。
// ASYNC Write - can be kicked off from a time sensitive thread
// actual work and completion will be scheduled base upon
// the configuration of the async_queue tied to the XAsyncBlock.
void Sample::_SaveDataAsync(const char* containerName, const char* containerDisplayName)
{
struct SaveContext
{
SaveContext(Sample* s) : self(s), containerContext(nullptr), updateContext(nullptr) {}
~SaveContext()
{
if (updateContext)
{
XGameSaveCloseUpdate(updateContext);
}
if (containerContext)
{
XGameSaveCloseContainer(containerContext);
}
}
XAsyncBlock async;
XGameSaveContainerHandle containerContext;
XGameSaveUpdateHandle updateContext;
Sample* self;
};
HRESULT hr;
SaveContext* saveContext = new SaveContext(this);
if (saveContext == nullptr)
{
hr = E_OUTOFMEMORY;
}
if (SUCCEEDED(hr))
{
saveContext->async.context = saveContext;
saveContext->async.callback = [](XAsyncBlock* async)
{
auto ctx = reinterpret_cast<SaveContext*>(async->context);
auto self = ctx->self;
HRESULT hr = XGameSaveSubmitUpdateResult(async);
self->_HandleContainerUpdateErrors(hr);
delete ctx;
};
}
if (SUCCEEDED(hr))
{
hr = XGameSaveCreateContainer(_provider, containerName, &saveContext->containerContext);
}
if (SUCCEEDED(hr))
{
hr = XGameSaveCreateUpdate(saveContext->containerContext, containerDisplayName, &saveContext->updateContext);
}
if (SUCCEEDED(hr))
{
hr = XGameSaveSubmitBlobWrite(saveContext->updateContext, "WorldState", _worldState.data(), _worldState.size());
}
if (SUCCEEDED(hr))
{
hr = XGameSaveSubmitBlobWrite(saveContext->updateContext, "PlayerState", _playerState.data(), _playerState.size());
}
if (SUCCEEDED(hr))
{
hr = XGameSaveSubmitBlobWrite(saveContext->updateContext, "PlayerInventory", _playerInventory.data(), _playerInventory.size());
}
if (SUCCEEDED(hr))
{
if (_clearLevelProgress)
{
hr = XGameSaveSubmitBlobDelete(saveContext->updateContext, "LevelProgress");
}
}
if (SUCCEEDED(hr))
{
hr = XGameSaveSubmitUpdateAsync(saveContext->updateContext, &saveContext->async);
}
if (SUCCEEDED(hr))
{
// context is now owned by the async
saveContext = nullptr;
}
// if there was any error we need to cleanup the saveContext
if (saveContext)
{
delete saveContext;
}
}
要求
头文件:XGameSave.h
库:xgameruntime.lib
支持平台:Windows、Xbox One 系列主机和 Xbox Series 主机
另请参阅
XGameSave
XGameSaveCreateUpdate
XGameSaveSubmitBlobWrite
XGameSaveSubmitBlobDelete
游戏保存错误