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
ゲームのセーブ エラー