ストリーミング インストール: 状態
インストールの進行中にユーザーがプレイしている場合、タイトルでは、ゲームプレイをサポートするために必要なコンテンツを追跡し、必要なコンテンツがインストールされているかどうかを確認する必要があります。 ハード ドライブ上のチャンクの状態やコンテンツのダウンロードの進行状況は、システム API を使用してクエリできます。
まだインストールされていないコンテンツを必要とする部分のゲームプレイをユーザーが始めようとした場合は、まだインストールされていないことをユーザーに知らせ、ダイアログ ボックスか進行状況バーを表示して、インストールの進行状況を伝える必要があります。 また、タイトルでは、進行状況を知らせる画面から移動するオブションをユーザーに必ず提供する必要があります。できれば、コンテンツのインストール中にも、そのコンテンツをユーザーが体験できるようにしましょう。 次に例を示します。
ユーザーがシューティング ゲーム タイトルのシングル プレイヤー キャンペーンをプレイしている間に、そのキャンペーンの次のエリアに対応するコンテンツがまだインストールされていない箇所に達したとします。 優れたユーザー エクスペリエンスを実現するには、コンテンツの取得の状態と、マルチプレイヤー ゲームに参加するためのオプションを表示する進行状況バーを表示する必要があります。 このオプションは、タイトルを起動するために必要なデータの一部としてマルチプレイヤー コンテンツのサブセットを含めることで有効になります。
タイトルでは、インストールを監視、検証することができます。また、インストールの完了時にアラートを受け取ることができます。 インストールの監視にあたっては、パッケージ全体を対象にすることもできますし、パッケージに含まれるチャンクのサブセットを対象にすることもできます。 インストール モニターを作成するには、XPackageCreateInstallationMonitor を使用します。 モニターの対象として、次のいずれか 1 つを指定します。
- 特定のチャンク セット (パラメーターとしてセレクターを指定する)
- パッケージ全体 (セレクターを指定しない)
インストール モニターを作成したら、次のいずれかに対してハンドラーを登録します。
- installation progress changed イベント (XPackageRegisterInstallationProgressChanged を使用します)
- package installed イベント (XPackageRegisterPackageInstalled を使用します)
package installed イベントは、パッケージ全体のインストールがいつ完了したかを示します。 progress changed イベントでは、インストールの進行状況を監視することができます。 progress changed イベントでは、インストールがいつ完了したかも示されます。したがって、既に progress changed ハンドラーを登録している場合は、package installed ハンドラーを登録する必要はありません。 次に例を示します。
ゲームは起動マーカーを実装しているため、完全にインストールされる前に実行できます。 ゲームは、インストールされているパーツと、インストールされていないパーツを把握する必要があります。 使用可能なトラックをユーザーに提示するために、ゲームは指定されたトラック名を持つトラックに関連付けられたチャンクがインストールされるタイミングを把握する必要があります。
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()
{
// ...
}
};