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
게임 저장 오류