Разработка пакетов ресурсов и сворачивание пакета ресурсовDeveloping with asset packages and package folding

Важно!

Если вы планируете отправить приложение в 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.

Пакеты активов могут уменьшать общий размер пакета и время публикации для приложений в 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

При установке игры на компьютер пользователя каждый файл пакета приложения будет иметь собственную папку в каталоге виндовсаппс .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, потребуется использовать либо API MRT, либо API PackageManager.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. API-интерфейсы MRT могут автоматически выбирать наиболее подходящий файл из установленных языков. Дополнительные сведения об API-интерфейсах MRT см. в Windows. ApplicationModel. Resources. Core.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. Затем два пакета активов будут развернуты в свои папки, точно так же как 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 посредством жесткой связи (даже если файлы отображаются в двух местоположениях, они не займут в два раза больше дискового пространства).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
        `-- ...

Это позволит во время сворачивания пакета объединить папки и файлы Level1 в пакете MyGame_Level1 и файлы и папки Level2 в пакете MyGame_Level2 в папки Аудио и Видео.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.

Наконец, если существуют два файла в разных пакетах активов с одинаковыми относительными путями, при сворачивании пакетов это станет причиной конфликта.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.