Разработка пакетов ресурсов и сворачивание пакета ресурсов

Важно!

Если вы планируете отправить приложение в Store, необходимо обратиться в службу поддержки разработчиков Windows и получить разрешение на использование пакетов активов и сворачивания пакетов.

Пакеты активов могут уменьшать общий размер пакета и время публикации для приложений в Store. Дополнительные сведения о пакетах активов и о том, как они могут ускорить циклы разработки, см. в разделе Вводные сведения о пакетах активов.

Если вы задумываетесь об использовании пакетов активов для своего приложения или уже знаете, что их потребуется использовать, вы наверняка захотите узнать, как пакеты активов изменят ваш процесс разработки. На разработку приложений это не повлияет — это возможно благодаря сворачиванию пакетов активов.

Доступ к файлам после разделения приложения

Чтобы понять, почему сворачивание пакетов не влияет на процесс разработки, давайте сначала разберемся, что происходит при разделении приложения на несколько пакетов (с пакетами активов или пакетами ресурсов).

В общем и целом можно сказать следующее: при разделении файлов приложения в другие пакеты (не являющиеся пакетами архитектуры) вы не сможете осуществлять доступ к тем файлам непосредственно там, где выполняется ваш код. Это объясняется тем, что все эти пакеты устанавливаются не в те каталоги, где установлен пакет архитектуры. Например, если вы делаете игру, а ваша игра переведена на французский и немецкий языки и создана для компьютеров x86 и x64, эти файлы пакета приложения должны находиться в пакете приложений для вашей игры:

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

При установке игры на компьютер пользователя каждый файл пакета приложения будет иметь собственную папку в каталоге виндовсаппс . Так, для французского пользователя с 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, потребуется использовать либо API MRT, либо API PackageManager. API-интерфейсы MRT могут автоматически выбрать наиболее подходящий файл из установленных языков. Дополнительные сведения об API-интерфейсах MRT можно найти по адресу 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 в предыдущем примере. Из-за сворачивания пакетов файлы пакета активов также будут отображаться в папке MyGame_1.0_x64 посредством жесткой связи (даже если файлы отображаются в двух местоположениях, они не займут в два раза больше дискового пространства). Местоположение, в котором отобразятся файлы пакета активов, — это их местоположение относительно корня пакета. Итак, окончательная структура развернутой игры будет выглядеть следующим образом:

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
        `-- ...

Это позволит во время сворачивания пакета объединить папки и файлы Level1 в пакете MyGame_Level1 и файлы и папки Level2 в пакете MyGame_Level2 в папки Аудио и Видео. Как правило, относительный путь, предусмотренный для упакованных файлов в файле сопоставления или структуры упаковки для MakeAppx.exe, — это путь, который требуется использовать для доступа к этим файлам после сворачивания пакета.

Наконец, если существуют два файла в разных пакетах активов с одинаковыми относительными путями, при сворачивании пакетов это станет причиной конфликта. В случае конфликта развертывание приложения завершится ошибкой и сбоем. Кроме того, поскольку при сворачивании пакетов используются жесткие связи, при использовании пакетов активов приложение будет невозможно развернуть на дисках, отличных от NTFS. Если вы знаете, что ваше приложение наверняка будет перенесено пользователями на съемные носители, использовать пакеты активов не следует.