Нарезка приложения – это новая фича, которая появилась в iOS и tvOS версии 9.0. Теперь разработчики могут загружать на App Store несколько вариантов ресурсов для разных типов устройств. Это существенно уменьшает размер приложения, поскольку пользователь загружает пакет данных только для своего конкретного устройства.



Нарезка приложения пользуется популярностью у разработчиков, потому что позволяет упаковать больше ассетов в исходное приложение и при этом оставаться в пределах ограничения в 100 MБ на загрузку через мобильный интернет. Для достижения такого результата разработчики также могут обращаться к аналогичному методу использования ресурсов по запросу, о котором мы писали ранее. Однако этот метод не всегда удобен и оптимален: приложение должно быть предварительно адаптировано для того, чтобы динамически загружать необходимые ресурсы. Использование ресурсов по запросу сложнее по всем параметрам, а при нарезке приложения эти сложности отсутствуют.

Нарезка приложения бывает двух типов: нарезка исполняемых файлов и нарезка ресурсов. Нарезка исполняемых файлов – это удаление неиспользуемого исполняемого кода из приложения. Этот тип применяется автоматически ко всем приложениям App Store для iOS/tvOS версии 9.0 и выше. Метод нарезки ресурсов, в свою очередь, требует больших усилий от разработчика, так как предполагает удаление неиспользуемых ассетов. Именно этот метод мы рассмотрим в данной статье.

Основная цель нарезки ресурсов приложения – задействовать неиспользуемую пропускную полосу и объем памяти при нескольких вариантах одного ассета. Зачастую необходимо применять различные варианты ассета, потому что возможности более старых, но всё еще широко используемых iOS-устройств сильно отличаются от новых версий. До выхода iOS 9.0 все ассеты должны были находиться в основном пакете приложения, что приводило к потере пропускной полосы и объема памяти на устройствах, поскольку из всех вариантов использовался только один. Применение метода нарезки ресурсов позволило исключить неиспользуемые ассеты из основного пакета приложения.

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

Чтобы нарезать ресурсы, разработчику необходимо указать, какие устройства подходят для всех вариантов ассетов, и загрузить необходимые ассеты при запуске приложения. В разработке приложений для оригинальной iOS нарезка ресурсов происходит так: внутри каталога ассетов создаются объекты данных или изображений и настраиваются варианты ресурсов для устройств, после чего ресурсы присваиваются плейсхолдерам в UI. В Unity разработчик сам настраивает варианты ресурсов, которые, по сути, являются пакетами с потенциально разным набором ассетов. Все варианты пакетов, задействованные в нарезке ресурсов приложения, должны быть зафиксированы в коде при помощи функции обратного вызова API: UnityEditor.iOS.BuildPipeline.collectResources. Затем точные требования к устройствам указываются в игровых настройках UI. И наконец разработчик должен вручную загрузить пакеты ассетов через AssetBundle.CreateFromFile API при запуске приложения.



Примеры кода, которые демонстрируют основные принципы использования нарезки ресурсов приложения:

Скрипт регистрации ресурсов, участвующих в нарезке приложения:

using UnityEditor.iOS;
#if ENABLE_IOS_APP_SLICING
public class BuildResources
{
 [InitializeOnLoadMethod]
 static void SetupResourcesBuild()
 {
   UnityEditor.iOS.BuildPipeline.collectResources += CollectResources;
 }
 static UnityEditor.iOS.Resource[] CollectResources()
 {
  return new Resource[] {
    new Resource("asset-bundle-name").BindVariant("path/to/asset-bundle.hd"), "hd")
                                     .BindVariant("path/to/asset-bundle.md"), "md")
                                     .BindVariant("path/to/asset-bundle.sd"), "sd"),
  };
 }


Загрузка пакетов ассетов при запуске:

< ...>
var bundle = AssetBundle.LoadFromFile("res://asset-bundle-name");

// now use AssetBundle APIs to load assets
// or Application.LoadLevel to load scenes

var asset = bundle.LoadAsset("Asset");
< ...>


Изучение пакетов ассетов и нарезки ресурсов приложения лучше всего начать с нашего демопроекта Asset Bundle Manager («Менеджер пакетов ассетов») на BitBucket. По ссылке вы найдете подробное описание, как использовать и настраивать демопроект.

Комментарии (2)


  1. Adnako
    28.01.2016 19:55
    +2

    задействовать неиспользуемую пропускную полосу

    Чего?


  1. InstaRobot
    28.01.2016 21:42

    Нарезка исполняемых файлов – это удаление неиспользуемого исполняемого кода из приложения. Этот тип применяется автоматически ко всем приложениям App Store для iOS/tvOS версии 9.0 и выше.


    А вот и нет. Не автоматически он применяется. Многие библиотеки до сих пишутся без оптимизации при использовании bitcode.