アセット パッケージとパッケージ圧縮を使った開発
重要
アプリをストアに提出する場合は、Windows 開発者サポートに連絡し、アセット パッケージとパッケージ フォールディングを使用するための承認を得る必要があります。
アセット パッケージを使用すると、アプリのパッケージ全体のサイズとストアへの公開時間を短縮できます。 アセット パッケージの詳細と、開発イテレーション を高速化する方法については、「資産パッケージの概要」を参照してください。
アプリにアセット パッケージを使用することを検討している場合、またはアプリを使用することが既にわかっている場合は、アセット パッケージによって開発プロセスがどのように変わるのか疑問に思うでしょう。 つまり、アプリの開発は同じままです。これは、アセット パッケージのパッケージ フォールディングが原因で可能です。
アプリを分割した後のファイル アクセス
パッケージ の折りたたみが開発プロセスに与える影響を理解するために、まず、アプリを複数のパッケージ (アセット パッケージまたはリソース パッケージ) に分割したときの動作を理解しましょう。
大まかに言えば、アプリのファイルの一部を (アーキテクチャ パッケージではない) 他のパッケージに分割すると、コードの実行場所に対して直接これらのファイルにアクセスすることはできません。 これは、これらのパッケージはすべて、アーキテクチャ パッケージがインストールされている場所とは異なるディレクトリにインストールされるためです。 たとえば、フランス語とドイツ語にローカライズされるゲームを作成しており、x86 コンピューターと x64 コンピューターの両方向けにビルドする場合、ゲームのアプリ バンドル内に以下のアプリ パッケージ ファイルが必要です。
- MyGame_1.0_x86.appx
- MyGame_1.0_x64.appx
- MyGame_1.0_language-fr.appx
- MyGame_1.0_language-de.appx
ゲームがユーザーのコンピューターにインストールされると、アプリ パッケージ ファイルごとに独自のフォルダーが WindowsApps ディレクトリに作成されます。 そのため、64 ビット Windows を実行しているフランス語ユーザーの場合、ゲームは次のようになります。
C:\Program Files\WindowsApps\
|-- MyGame_1.0_x64
| `-- …
|-- MyGame_1.0_language-fr
| `-- …
`-- …(other apps)
このユーザーに該当しないアプリ パッケージ ファイルはインストールされない点にご注意ください (x86 およびドイツ語のパッケージ)。
このユーザーの場合、ゲームのメイン実行可能ファイルは MyGame_1.0_x64 フォルダー内にあり、そこから実行されます。通常、このフォルダー内のファイルにのみアクセスできます。 MyGame_1.0_language-fr フォルダー内のファイルにアクセスするには、MRT API または PackageManager API を使用する必要があります。 MRT API は、インストールされている言語から最適なファイルを自動的に選択できます。MRT API の詳細については、Windows.ApplicationModel.Resources.Core に関する記事を参照してください。 または、PackageManager クラスを使用して、フランス語パッケージのインストールされている場所を 見つけることができます。 アプリのパッケージがインストールされている場所を想定しないでください。これは変更される可能性があり、ユーザーによって異なる可能性があるためです。
アセット パッケージの折りたたみ
では、アセット パッケージ内のファイルにアクセスするにはどうすればよいですか? さて、アーキテクチャ パッケージ内の他のファイルにアクセスするために使用しているファイル アクセス API を引き続き使用できます。 これは、アセット パッケージ ファイルがパッケージ フォールディング プロセスを通じてインストールされると、アーキテクチャ パッケージに折りたたまれるためです。 さらに、アセット パッケージ ファイルはもともとアーキテクチャ パッケージ内のファイルである必要があるため、これは、開発プロセスでルース ファイルの展開からパッケージ化されたデプロイに移行するときに API の使用を変更する必要がないことを意味します。
パッケージの折りたたみのしくみの詳細については、例から始めましょう。 次のファイル構造のゲーム プロジェクトがある場合:
MyGame
|-- Audios
| |-- Level1
| | `-- ...
| `-- Level2
| `-- ...
|-- Videos
| |-- Level1
| | `-- ...
| `-- Level2
| `-- ...
|-- Engine
| `-- ...
|-- XboxLive
| `-- ...
`-- Game.exe
ゲームを 3 つのパッケージ (x64 アーキテクチャ パッケージ、オーディオ用アセット パッケージ、ビデオ用アセット パッケージ) に分割する場合、ゲームは次のパッケージに分割されます。
MyGame_1.0_x64.appx
|-- Engine
| `-- ...
|-- XboxLive
| `-- ...
`-- Game.exe
MyGame_1.0_Audios.appx
`-- Audios
|-- Level1
| `-- ...
`-- Level2
`-- ...
MyGame_1.0_Videos.appx
`-- Videos
|-- Level1
| `-- ...
`-- Level2
`-- ...
ゲームをインストールすると、最初に x64 パッケージがデプロイされます。 その後、前の例の MyGame_1.0_language-fr と同様に、2 つのアセット パッケージは引き続き独自のフォルダーに展開されます。 ただし、パッケージ の折りたたみのため、アセット パッケージ ファイルは、MyGame_1.0_x64 フォルダーに表示されるようにハード リンクされます (そのため、ファイルが 2 つの場所に表示されても、ディスク領域の 2 倍は占有されません)。 アセット パッケージ ファイルが表示される場所は、パッケージのルートに対する相対位置です。 そのため、デプロイされたゲームの最終的なレイアウトは次のようになります。
C:\Program Files\WindowsApps\
|-- MyGame_1.0_x64
| |-- Audios
| | |-- Level1
| | | `-- ...
| | `-- Level2
| | `-- ...
| |-- Videos
| | |-- Level1
| | | `-- ...
| | `-- Level2
| | `-- ...
| |-- Engine
| | `-- ...
| |-- XboxLive
| | `-- ...
| `-- Game.exe
|-- MyGame_1.0_Audios
| `-- Audios
| |-- Level1
| | `-- ...
| `-- Level2
| `-- ...
|-- MyGame_1.0_Videos
| `-- Videos
| |-- Level1
| | `-- ...
| `-- Level2
| `-- ...
`-- …(other apps)
アセット パッケージにパッケージ フォールディングを使用する場合でも、アセット パッケージに分割したファイルに同じ方法でアクセスできます (アーキテクチャ フォルダーの構造は元のプロジェクト フォルダーとまったく同じであることに注意してください)。また、コードに影響を与えずにアセット パッケージを追加したり、アセット パッケージ間でファイルを移動したりできます。
次に、より複雑なパッケージ 折りたたみの例を示します。 代わりにレベルに基づいてファイルを分割し、元のプロジェクト フォルダーと同じ構造を維持する場合、パッケージは次のようになります。
MyGame_1.0_x64.appx
|-- Engine
| `-- ...
|-- XboxLive
| `-- ...
`-- Game.exe
MyGame_Level1.appx
|-- Audios
| `-- Level1
| `-- ...
`-- Videos
`-- Level1
`-- ...
MyGame_Level2.appx
|-- Audios
| `-- Level2
| `-- ...
`-- Videos
`-- Level2
`-- ...
これにより、MyGame_Level1 パッケージ内の Level1 フォルダーとファイル、および MyGame_Level2 パッケージ内の Level2 フォルダーとファイルを、パッケージの折りたたみ中にオーディオおよびビデオ フォルダーにマージできるようになります。 したがって、一般的なルールとして、MakeAppx.exe のマッピング ファイルまたは パッケージ レイアウト のパッケージ ファイルに指定された相対パスは、パッケージの折りたたみ後にアクセスするために使用する必要があるパスです。
最後に、異なるアセット パッケージに同じ相対パスを持つ 2 つのファイルがある場合、パッケージの折りたたみ中に競合が発生します。 競合が発生した場合、アプリのデプロイによってエラーが発生し、失敗します。 また、パッケージ フォールディングではハード リンクが利用されるため、アセット パッケージを使用する場合、アプリを NTFS 以外のドライブに展開することはできません。 アプリがユーザーによってリムーバブル ドライブに移動される可能性が高いことがわかっている場合は、アセット パッケージを使用しないでください。