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

Важно!

Если вы планируете отправить приложение в Магазин, обратитесь в службу поддержки разработчиков 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 , необходимо использовать 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
        `-- ...

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

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