アセット パッケージとパッケージ圧縮を使った開発Developing with asset packages and package folding

重要

Microsoft Store にアプリを提出する予定がある場合、Windows 開発者向けサポートに連絡してアセット パッケージとパッケージ圧縮を使う承認を得る必要があります。If you intend to submit your app to the Store, you need to contact Windows developer support and get approval to use asset packages and package folding.

アセット パッケージによってパッケージ全体のサイズを減らし、アプリが Microsoft Store で公開されるまでの時間を短縮できます。Asset packages can decrease the overall packaging size and publishing time for your apps to the Store. アセット パッケージと、開発サイクルを早める方法について詳しくは、「アセット パッケージの概要」をご覧ください。You can learn more about asset packages and how it can speed up your development iterations at Introduction to asset packages.

アプリにアセット パッケージを使うことを検討している場合や、使うことが既にわかっている場合、アセット パッケージによって開発プロセスがどのように変わるかに関心をお持ちかもしれません。If you are thinking about using asset packages for your app or already know that you want to use it, then you are probably wondering about how asset packages will change your development process. 簡単に言えば、アプリの開発は同じままです。これは、アセット パッケージのパッケージ圧縮によって可能になります。In short, app development for you stays the same - this is possible because of package folding for asset packages.

アプリの分割後のファイル アクセスFile access after splitting your app

パッケージ圧縮が開発プロセスに影響を与えないことを理解するため、まずアプリを複数のパッケージ (アセット パッケージまたはリソース パッケージを使用) に分割するとどうなるかをもう一度確認してみましょう。To understand how package folding doesn’t impact your development process, let’s step back first to understand what happens when you split your app into multiple packages (with either asset packages or resource packages).

大まかに言うと、アプリの一部のファイルを (アーキテクチャ パッケージではない) 他のパッケージに分割すると、コードが実行される場所から直接それらのファイルにアクセスすることができなくなります。At a high level, when you split some of your app’s files into other packages (that are not architecture packages), you will not be able to access those files directly relative to where your code runs. これは、パッケージがすべて、アーキテクチャ パッケージがインストールされている場所とは別のディレクトリにインストールされているためです。This is because these packages are all installed into different directories from where your architecture package is installed. たとえば、ゲームを作成し、ゲームをフランス語とドイツ語にローカライズし、x86 と x64 の両方のコンピューター用にビルドした場合、次のようなアプリパッケージファイルがゲームのアプリバンドルに含まれている必要があります。For example, if you’re making a game and your game is localized into French and German and you built for both x86 and x64 machines, then you should have these app package files within the app bundle of your game:

  • MyGame_1.0_x86.appxMyGame_1.0_x86.appx
  • MyGame_1.0_x64.appxMyGame_1.0_x64.appx
  • MyGame_1.0_language-fr.appxMyGame_1.0_language-fr.appx
  • MyGame_1.0_language-de.appxMyGame_1.0_language-de.appx

ゲームがユーザーのコンピューターにインストールされると、各アプリケーションパッケージファイルのフォルダーが Windowsapps ディレクトリに作成されます。When your game is installed to a user’s machine, each app package file will have its own folder in the WindowsApps directory. したがって、64 ビット Windows を実行するフランス語ユーザーの場合、ゲームは次のようになります。So for a French user running 64-bit Windows, your game will look like this:

C:\Program Files\WindowsApps\
|-- MyGame_1.0_x64
|   `-- …
|-- MyGame_1.0_language-fr
|   `-- …
`-- …(other apps)

ユーザーに適用できないアプリパッケージファイルはインストールされないことに注意してください (x86 およびドイツ語のパッケージ)。Note that the app package files that are not applicable to the user will not be installed (the x86 and German packages).

このユーザーの場合、ゲームの主な実行可能ファイルは MyGame_1.0_x64 フォルダーに置かれ、そこから実行されます。通常、このフォルダー内のファイルにのみアクセスできます。For this user, your game’s main executable will be within the MyGame_1.0_x64 folder and will run from there, and normally, it will only have access to the files within this folder. MyGame_1.0_language-fr フォルダーのファイルにアクセスするには、MRT API または PackageManager API を使う必要があります。In order to access the files in the MyGame_1.0_language-fr folder, you would have to use either the MRT APIs or the PackageManager APIs. MRT.DLL Api を使用すると、インストールされている言語から最も適切なファイルを自動的に選択できます。 MRT.DLL Api の詳細については、「」を参照してください。The MRT APIs can automatically select the most appropriate file from the languages installed, you can find out more about MRT APIs at Windows.ApplicationModel.Resources.Core. または、PackageManager クラスを使ってフランス語言語パッケージのインストール場所を見つけることもできます。Alternatively, you can find the installed location of the French language package using the PackageManager Class. アプリのパッケージのインストール場所は変わることがり、ユーザーごとに異なるため、思い込まないでください。You should never assume the installed location of the packages of your app since this can change and can vary between users.

アセット パッケージの圧縮Asset package folding

アセット パッケージのファイルにはどのようにアクセスできるでしょうか。So how can you access the files in your asset packages? この場合も、アーキテクチャ パッケージ内の他のファイルへのアクセスに使っているファイル アクセス API を使うことができます。Well, you can continue to use the file access APIs you are using to access any other file in your architecture package. これは、アセット パッケージ ファイルは、インストールされるときにパッケージ圧縮プロセスを通じてアーキテクチャ パッケージに圧縮されるためです。This is because asset package files will be folded into your architecture package when it is installed through the package folding process. さらに、アセット パッケージ ファイルはもともとアーキテクチャ パッケージ内のファイルであるため、開発プロセスをルーズ ファイル配置からパッケージ化配置に移行するときに API の使用方法を変更する必要はありません。Furthermore, since asset package files should originally be files within your architecture packages, this means that you would not have to change API usage when you move from loose files deployment to packaged deployment in your development process.

パッケージ圧縮のしくみについて理解を深めるため、例を見てみましょう。To understand more about how package folding works, let’s start with an example. 次のファイル構造のゲーム プロジェクトがあるとします。If you have a game project with the following file structure:

MyGame
|-- Audios
|   |-- Level1
|   |   `-- ...
|   `-- Level2
|       `-- ...
|-- Videos
|   |-- Level1
|   |   `-- ...
|   `-- Level2
|       `-- ...
|-- Engine
|   `-- ...
|-- XboxLive
|   `-- ...
`-- Game.exe

ゲームを 3 つのパッケージ (x64 アーキテクチャ パッケージ、オーディオのアセット パッケージ、ビデオのアセット パッケージ) に分割する場合、ゲームは以下のパッケージに分割されます。If you want to split your game into 3 packages: an x64 architecture package, an asset package for audios, and an asset package for videos, your game will be divided into these packages:

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 パッケージがまず展開されます。When you install your game, the x64 package will be deployed first. 次に、2 つのアセット パッケージも独自のフォルダーに展開されます (前の例と同様に MyGame_1.0_language-fr)。Then the two asset packages will still be deployed to their own folders, just like MyGame_1.0_language-fr from our previous example. ただし、パッケージ圧縮のため、アセット パッケージ ファイルは MyGame_1.0_x64 フォルダーにも表れるようにハード リンクされます (したがって、ファイルは 2 か所に現れますが、ディスク領域を 2 倍消費するわけではありません)。However, because of package folding, the asset package files will also be hard linked to appear in the MyGame_1.0_x64 folder (so even though the files appear in two locations, they do not take up twice the disk space). アセット パッケージ ファイルが表示される場所は、パッケージのルートから見てそのファイルが存在する場所とまったく同じです。The location in which the asset package files will appear in is exactly the location that they are at relative to the root of the package. ですから、展開されたゲームの最終レイアウトは次のようになります。So here’s what the final layout of the deployed game will look like:

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)

アセット パッケージにパッケージ圧縮を使っても、同じ方法でアセット パッケージに分割したファイルにアクセスでき (アーキテクチャ フォルダーが元のプロジェクト フォルダーとまったく同じ構造である点に注目してください)、アセット パッケージを追加したり、コードに影響を与えずにアセット パッケージ間でファイルを移動したりすることができます。When using package folding for asset packages, you can still access the files you’ve split into asset packages the same way (notice that the architecture folder has the exact same structure as the original project folder), and you can add asset packages or move files between asset packages without impacting your code.

次に、より複雑なパッケージ圧縮の例を考えてみましょう。Now for a more complicated package folding example. ここでは、レベルに基づいてファイルを分割するとします。元のプロジェクト フォルダーと同じ構造を維持する場合、パッケージは次のようになります。Let’s say that you want to split your files based on level instead, and if you want to keep the same structure as the original project folder, your packages should look like this:

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 フォルダーおよびファイルを、パッケージ圧縮時に Audios および Videos フォルダーに結合できるようになります。This will allow the Level1 folders and files in the MyGame_Level1 package and Level2 folders and files in the MyGame_Level2 package to be merged into the Audios and Videos folders during package folding. したがって、一般的なルールとして、MakeAppx.exe のマッピング ファイルまたはパッケージ レイアウトでパッケージ化されたファイルに指定される相対パスは、パッケージ圧縮後にそれらのファイルへのアクセスに使うパスとなります。So as a general rule, the relative path designated for packaged files in the mapping file or packaging layout for MakeAppx.exe is the path you should use to access them after package folding.

最後に、同じ相対パスを持つ異なるアセット パッケージに 2 つのファイルがある場合、これによりパッケージ圧縮中に競合が発生します。Lastly, if there are two files in different asset packages that have the same relative paths, this will cause a collision during package folding. 競合が発生した場合、アプリの展開でエラーが発生して失敗します。If a collision occurs, the deployment of your app will result in an error and fail. さらに、パッケージ圧縮ではハード リンクが利用されるため、アセット パッケージを使う場合、アプリを NTFS 以外のドライブに展開できなくなります。Also, because package folding takes advantage of hard links, if you do use asset packages, your app will not be able to be deployed to non-NTFS drives. ユーザーによってアプリがリムーバブル ドライブに移動される可能性が高いことがわかっている場合、アセット パッケージを使わないでください。If you know your app will likely be moved to removable drives by your users, then you should not use asset packages.