XUserGetGamerPictureAsync
특정 사용자에 대한 게이머 사진을 비동기적으로 검색합니다.
구문
HRESULT XUserGetGamerPictureAsync(
XUserHandle user,
XUserGamerPictureSize pictureSize,
XAsyncBlock* async
)
매개 변수
user _In_
형식: XUserHandle
게이머 사진을 검색할 사용자입니다.
pictureSize _In_
형식: XUserGamerPictureSize
검색할 게이머 사진의 크기입니다.
async _Inout_
형식: XAsyncBlock*
호출의 상태를 폴링하고 호출 결과를 검색하기 위해 사용할 수 있는 XAsyncBlock입니다.
반환 값
형식: HRESULT
HRESULT 성공 또는 오류 코드입니다.
오류 코드 목록은 오류 코드를 참조하세요.
비고
"Display Name and Gamerpic" XR은 사용자 이름과 아바타 이미지 표시의 특정 요구사항을 나열합니다. Xbox One 게임 및 허드 앱에 대한 Xbox 요구 사항 (Xbox 개발자 다운로드->파트너, 퍼블리싱 및 릴리스 관리 정보->XGD 파트너 문서)에서 자세한 내용을 확인하세요.
XUserGetGamerPictureAsync에 대한 호출 결과를 검색하려면 XUserGetGamerPictureResult를 호출합니다.
{XUserGetGamerPictureResult](xusergetgamerpictureresult.md)가 요구하는 버퍼 크기를 검색해 XUserGetGamerPictureAsync가 반환하는 게이머 사진을 검색하려면, XUserGetGamerPictureResultSize를 호출합니다.
반환되는 게이머 사진은 .PNG 형식 이미지입니다. 사진 최대 크기는 2^32바이트입니다.
다음 예제에서는 게이머 사진을 로드하는 방법을 보여줍니다.
HRESULT LoadGamerPicComplete(XAsyncBlock* abResult)
{
try
{
struct CreateTextureContext
{
User* This;
ImTextureID TextureId;
std::vector<unsigned char> GamerpicBuffer;
};
auto context = std::make_unique<CreateTextureContext>();
context->This = this;
context->TextureId = IMTEXTUREID_INVALID;
// Get the buffer size and set up a buffer to contain it
size_t bufferSize;
RETURN_IF_FAILED(XUserGetGamerPictureResultSize(abResult, &bufferSize));
context->GamerpicBuffer.resize(bufferSize);
size_t bufferUsed;
RETURN_IF_FAILED(XUserGetGamerPictureResult(
abResult,
context->GamerpicBuffer.size(),
context->GamerpicBuffer.data(),
&bufferUsed));
FAIL_FAST_HR_IF(E_UNEXPECTED, bufferSize != bufferUsed);
// Create some async work to create a dx texture off the UI thread
// and then set the texture id back on the UI thread
auto abCreateTexture = std::make_unique<XAsyncBlock>();
ZeroMemory(abCreateTexture.get(), sizeof(*abCreateTexture));
abCreateTexture->queue = abResult->queue;
abCreateTexture->context = context.get();
// Set the texture id in the completion on the UI thread
abCreateTexture->callback = [](XAsyncBlock* ab)
{
auto context = static_cast<CreateTextureContext*>(ab->context);
context->This->_textureId = context->TextureId;
delete context;
delete ab;
};
// Worker will create the texture on a work thread
auto createTextureWorker = [](XAsyncBlock* ab) -> HRESULT
{
auto context = static_cast<CreateTextureContext*>(ab->context);
auto dimension = GetDimensionFromSize(GamerPicSize);
RETURN_IF_FAILED(CreateTextureFromPng(context->GamerpicBuffer.data(), context->GamerpicBuffer.size(), &context->TextureId));
return S_OK;
};
// Create the texture on a work thread
if (SUCCEEDED_LOG(XAsyncRun(abCreateTexture.get(), createTextureWorker)))
{
context.release();
abCreateTexture.release();
}
}
CATCH_RETURN();
return S_OK;
}
HRESULT LoadGamerPicAsync(XTaskQueueHandle queue, uint32_t cancelTime = 0)
{
auto asyncBlock = std::make_shared<XAsyncBlock>();
ZeroMemory(asyncBlock.get(), sizeof(*asyncBlock));
asyncBlock->queue = queue;
struct GamerPicContext
{
User* User;
std::shared_ptr<XAsyncBlock> AsyncBlock;
};
auto context = std::make_unique<GamerPicContext>();
context->User = this;
context->AsyncBlock = asyncBlock;
asyncBlock->context = context.get();
asyncBlock->callback = [](XAsyncBlock* ab)
{
std::unique_ptr<GamerPicContext> context(reinterpret_cast<GamerPicContext*>(ab->context));
LOG_IF_FAILED(context->User->LoadGamerPicComplete(ab));
};
if (cancelTime != 0)
{
std::thread cancelThread(
[asyncBlock]()
{
std::this_thread::sleep_for(std::chrono::milliseconds(5000));
XAsyncCancel(asyncBlock.get());
});
cancelThread.detach();
}
if (SUCCEEDED_LOG(XUserGetGamerPictureAsync(_handle.get(), GamerPicSize, asyncBlock.get())))
{
context.release();
}
return S_OK;
}
요구 사항
헤더: XUser.h
라이브러리: xgameruntime.lib
지원되는 플랫폼: Windows, Xbox One 패밀리 콘솔 및 Xbox Series 콘솔