스트리밍 설치: 상태
설치가 진행 중이고 사용자가 플레이하는 동안 타이틀은 게임 플레이를 지원하는 데 필요한 콘텐츠를 추적하고 필요한 콘텐츠가 설치되어 있는지 확인해야 합니다. 타이틀은 시스템 API를 사용하여 하드 드라이브에 있는 청크의 상태와 다운로드하는 콘텐츠의 진행 상황을 쿼리할 수 있습니다.
사용자가 아직 설치되지 않은 콘텐츠가 필요한 게임 플레이의 일부를 로드하려고 시도하면 타이틀이 대화 상자나 진행률 막대를 표시하여 사용자에게 알려야 하며 설치 진행 상황을 전달해야 합니다. 타이틀은 또한 항상 사용자가 진행률 화면을 나갈 수 있는 옵션을 제공해야 합니다. 설치하는 동안 사용자가 콘텐츠를 경험해 보도록 하는 것이 가장 좋습니다. 예를 들면 다음과 같습니다.
슈팅 게임 타이틀의 싱글 플레이어 캠페인을 플레이하는 동안 사용자가 캠페인의 다음 영역을 지원하는 콘텐츠가 아직 설치되지 않은 지점에 있습니다. 뛰어난 사용자 환경이라면 멀티 플레이어 게임에 참여하는 옵션과 함께 콘텐츠 획득 상태를 보여주는 진행률 표시줄이 표시될 것입니다. 이 옵션은 타이틀을 시작하는 데 필요한 데이터의 일부로 멀티 플레이어 콘텐츠를 포함하여 활성화할 수 있습니다.
타이틀은 설치를 모니터링하고 확인할 수 있으며 설치 완료 시 경고를 받을 수 있습니다. 전체 패키지나 패키지의 일부 청크에 대한 설치 상황을 모니터링할 수 있습니다. 설치 모니터를 만들려면 XPackageCreateInstallationMonitor를 사용합니다. 모니터 대상을 다음 중 하나로 지정합니다.
- 선택기를 매개 변수로 지정하여 선택한 특정 청크의 세트
- 선택기를 사용하지 않은 전체 패키지
설치 모니터를 만든 후 다음 중 하나를 위해 처리기를 등록합니다.
- XPackageRegisterInstallationProgressChanged를 사용한 설치 진행률 변경 이벤트
- XPackageRegisterPackageInstalled를 사용한 패키지 설치됨 이벤트
패키지 설치됨 이벤트는 전체 패키지의 설치가 완료되었음을 나타냅니다. 진행률 변경 이벤트는 설치 진행률을 모니터링하는 데 사용됩니다. 진행률 변경 이벤트도 설치가 완료되었을 때도 발생합니다. 따라서 진행률 변경 처리기를 이미 등록했다면 패키지 설치됨 처리기를 등록할 필요가 없습니다. 예를 들면 다음과 같습니다.
게임이 시작 마커를 구현했으므로 완전히 설치되기 전에 실행할 수 있습니다. 게임은 설치된 부분과 설치되지 않은 부분을 알고 있어야 합니다. 사용자에게 사용 가능한 트랙을 표시하려면 게임이 특정 트랙 이름을 가진 경주 트랙과 연결된 청크가 설치되는 시점을 알아야 합니다.
class GameTrackMonitor
{
public:
HRESULT StartMonitoring(XTaskQueueHandle queue, const char* trackName)
{
char id[PACKAGE_IDENTIFIER_MAX_LENGTH];
XPackageChunkSelector selector;
selector.type = XPackageChunkSelectorType::Tag;
selector.tag = trackName;
RETURN_IF_FAILED(XPackageGetCurrentProcessPackageIdentifier(_countof(id), id));
XPackageInstallationMonitorHandle monitor;
RETURN_IF_FAILED(XPackageCreateInstallationMonitor(
id, // Identity to monitor.
1, // Number of selectors.
&selector, // Selectors.
1000, // Resolution of monitor in ms.
queue, // Queue where updates are performed.
&monitor));
XTaskQueueRegistrationToken token;
HRESULT hr = XPackageRegisterInstallationProgressChanged(
monitor,
this,
[](void *context, XPackageInstallationMonitorHandle monitor)
{
GameTrackMonitor* pthis = static_cast<GameTrackMonitor*>(context);
XPackageInstallationProgress progress;
XPackageGetInstallationProgress(monitor, &progress);
pthis->DrawProgress(progress);
if (progress.completed)
{
pthis->TrackReady();
XPackageCloseInstallationMonitorHandle(monitor);
}
}, &token);
if (FAILED(hr))
{
XPackageCloseInstallationMonitorHandle(monitor);
}
return hr;
}
private:
void DrawProgress(const XPackageInstallationProgress& progress)
{
// ...
}
void TrackReady()
{
// ...
}
};