Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Исправление проблем

В этом разделе описывается несколько проблем, которые обычно возникают в проектах, использующих AssetBundles.

Дублирование объекта

Система AssetBundle Unity 5 обнаружит все зависимости объекта, когда объект встроен в AssetBundle. Это делается с помощью базы данных активов. Эта зависимость
Информация See in Словарь
используется для определения набора объектов, которые будут включены в AssetBundle.

Объекты, явно назначенные AssetBundle, будут встроены только в этот AssetBundle. Объект является «явно назначенным», когда для свойства AssetImporter этого объекта установлено свойство assetsBundleName, равное непустой строке.

Любой объект, не назначенный явно в AssetBundle, будет включен во все AssetBundle, содержащие 1 или более объектов, ссылающихся на непомеченный объект.

Если два разных объекта назначены двум разным пакетам AssetBundle, но оба имеют ссылки на общий объект зависимости, то этот объект зависимости будет скопирован в оба пакета AssetBundle. Дублированная зависимость также будет экземпляром, а это означает, что две копии объекта зависимости будут считаться разными объектами с разными идентификаторами. Это увеличит общий размер AssetBundles приложения. Это также приведет к загрузке двух разных копий объекта в память, если приложение загружает обоих своих родителей.

Есть несколько способов решить эту проблему:

  1. Убедитесь, что объекты, встроенные в разные пакеты AssetBundle, не имеют общих зависимостей. Любые объекты, которые имеют общие зависимости, могут быть помещены в один и тот же AssetBundle без дублирования их зависимостей.

    • Этот метод обычно не подходит для проектов с большим количеством общих зависимостей. Он может создавать монолитные пакеты AssetBundles, которые необходимо пересобирать и повторно загружать слишком часто, чтобы они были удобными или эффективными.
  2. Сегментируйте AssetBundles таким образом, чтобы никакие два AssetBundle с общей зависимостью не загружались одновременно.

    • Этот метод может работать для определенных типов проектов, например для игр с уровнями. Однако это по-прежнему излишне увеличивает размер AssetBundles проекта и увеличивает как время сборки, так и время загрузки.
  3. Убедитесь, что все зависимые ресурсы встроены в свои собственные AssetBundles. Это полностью устраняет риск дублирования активов, но также усложняет процесс. Приложение должно отслеживать зависимости между пакетами AssetBundle и обеспечивать загрузку правильных пакетов AssetBundle перед вызовом любых API-интерфейсов AssetBundle.LoadAsset.

В Unity 5 зависимости объектов отслеживаются через API AssetDatabase, расположенный в пространстве имен UnityEditor. Как следует из пространства имен, этот API доступен только в редакторе Unity, а не во время выполнения. AssetDatabase.GetDependencies можно использовать для поиска всех непосредственных зависимостей определенного объекта или актива. Обратите внимание, что эти зависимости могут иметь свои собственные зависимости. Кроме того, API AssetImporter можно использовать для запроса AssetBundle, которому назначен какой-либо конкретный объект.

Объединяя API-интерфейсы AssetDatabase и AssetImporter, можно написать сценарий редактора, который гарантирует, что все прямые или косвенные зависимости AssetBundle будут назначены AssetBundle или что никакие два AssetBundle не будут иметь общих зависимостей, которые не были назначены AssetBundle. . Из-за затрат памяти на дублирование ресурсов рекомендуется, чтобы все проекты имели такой сценарий.

Дублирование Атласа спрайтов

В следующих разделах описывается особенность кода вычисления зависимостей ресурсов Unity 5 при использовании в сочетании с автоматически сгенерированным спрайтом2D-объектом. графические объекты. Если вы привыкли работать в 3D, спрайты — это, по сути, просто стандартные текстуры, но есть специальные приемы комбинирования текстур спрайтов и управления ими для повышения эффективности и удобства во время разработки. Подробнее
См. в Словарь
.

Любой автоматически сгенерированный атлас спрайтовТекстура, состоящая из нескольких меньших текстур. Также называется атласом текстуры, спрайтом изображения, листом спрайта или упакованной текстурой. Подробнее
См. в Словарь
будет присвоен AssetBundle, содержащему объекты Sprite, из которых был сгенерирован атлас спрайтов. Если объекты спрайтов назначены нескольким AssetBundle, то атлас спрайтов не будет назначен AssetBundle и будет дублироваться. Если объекты Sprite не назначены AssetBundle, то атлас спрайтов также не будет назначен AssetBundle.

Чтобы убедиться, что атласы спрайтов не дублируются, убедитесь, что все спрайты, помеченные в одном атласе спрайтов, назначены одному и тому же AssetBundle.

Unity 5.2.2p3 и старше

Автоматически созданные атласы спрайтов никогда не будут назначаться AssetBundle. По этой причине они будут включены в любые пакеты AssetBundle, содержащие составляющие их спрайты, а также в любые пакеты AssetBundles, ссылающиеся на составляющие их спрайты.

Из-за этой проблемы настоятельно рекомендуется, чтобы все проекты Unity 5 использовали упаковщик спрайтов Unityсредство, которое упаковывает графику из несколько текстур спрайтов, тесно связанных друг с другом в одной текстуре, известной как атлас. Unity предоставляет утилиту Sprite Packer для автоматизации процесса создания атласов из отдельных текстур спрайтов. Подробнее
См. в Словаре
обновление до Unity 5.2.2p4, 5.3 или любой более новой версии Единство.

Для проектов, которые нельзя обновить, есть два решения этой проблемы:

  1. Просто: не используйте встроенный в Unity упаковщик спрайтов. Атласы спрайтов, сгенерированные внешними инструментами, будут обычными активами и могут быть правильно назначены AssetBundle.

  2. Жестко: назначьте все объекты, использующие автоматически атласированные спрайты, тому же AssetBundle, что и спрайты.

    • Это гарантирует, что сгенерированный атлас спрайтов не будет рассматриваться как косвенная зависимость от любых других AssetBundles и не будет дублироваться.

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

Текстуры Android

Из-за сильной фрагментации устройств в экосистеме Android часто необходимо сжимать текстуры в несколько разных форматов. Хотя все устройства Android поддерживают ETC1, ETC1 не поддерживает текстуры с альфа-каналами. Если приложению не требуется поддержка OpenGL ES 2, самый простой способ решить проблему — использовать ETC2, который поддерживается всеми устройствами Android OpenGL ES 3.

Большинство приложений необходимо поставлять на старые устройства, где поддержка ETC2 недоступна. Один из способов решить эту проблему — использовать варианты AssetBundle в Unity 5. (Подробнее о других параметрах см. в руководстве по оптимизации Unity для Android.)

Чтобы использовать варианты AssetBundle, все текстуры, которые не могут быть полностью сжаты с помощью ETC1, должны быть изолированы в пакеты AssetBundle, содержащие только текстуры. Затем создайте достаточное количество вариантов этих пакетов AssetBundles для поддержки сегментов экосистемы Android, не поддерживающих ETC2, используя сжатиеМетод хранения данных, который уменьшает объем требуемого дискового пространства. См. Сжатие текстур, Сжатие анимации, Сжатие звука, Сжатие компоновки.
См. в форматах Словарь
, таких как DXT5, PVRTC и ATITC. Для каждого варианта AssetBundle измените настройки TextureImporter включенных текстур на формат сжатия, соответствующий варианту.

Во время выполнения поддержка различного сжатия текстуроборудования для 3D-графики требует, чтобы текстуры были сжаты в специализированные форматы, оптимизированные для быстрая выборка текстур. Подробнее
See in Словарь
могут быть обнаружены с помощью SystemInfo.SupportsTextureFormat API. Эта информация должна использоваться для выбора и загрузки варианта AssetBundle, содержащего текстуры, сжатые в поддерживаемом формате.

Дополнительную информацию о форматах сжатия текстур Android можно найти здесь.

Злоупотребление файловым дескриптором iOS

Проблема, описанная в следующем разделе, была исправлена ​​в Unity 5.3.2p2. Эта проблема не затрагивает текущие версии Unity.

В версиях, предшествующих Unity 5.3.2p2, Unity удерживает дескриптор открытого файла для AssetBundle все время загрузки AssetBundle. Это не проблема на большинстве платформ. Однако iOSмобильная операционная система Apple. Подробнее
См. в Словарь
ограничивает количество дескрипторов файлов, которые процесс может одновременно открыть для 255. Если загрузка AssetBundle приводит к превышению этого ограничения, вызов загрузки завершится ошибкой «Слишком много дескрипторов открытых файлов».

Это была обычная проблема для проектов, пытавшихся разделить свой контент на сотни или тысячи пакетов AssetBundle.

Для проектов, которые невозможно обновить до исправленной версии Unity, есть следующие временные решения:

  • Уменьшение количества используемых AssetBundles за счет объединения связанных AssetBundles
  • Использование AssetBundle.Unload(false) для закрытия дескриптора файла AssetBundle и управление жизненным циклом загруженных объектов вручную
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3