Разработка с помощью пакетов ресурсов и свертывания пакетов

Это важно

Если вы планируете отправить приложение в Магазин, обратитесь в службу поддержки разработчиков 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 и файлах уровня 2 в пакете MyGame_Level2 объединяться в папки аудио и видео во время свертывания пакетов. Таким образом, как правило, относительный путь, назначенный для упакованных файлов в файле сопоставления или макете упаковки для MakeAppx.exe, — это путь, который следует использовать для доступа к ним после свертывания пакетов.

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