Привет.
Это перевод моего поста.
Когда вы переносите проект с использования Resources на Addressables, вы определенно столкнётесь с проблемой фантомных (скрытых, устаревших, неиспользуемых) ссылок на ассеты, которые могут при работе игры привести к дублированию ассетов в памяти.
В этом посте вы найдете встретившиеся мне случаи и как я их разрешил
Анализ зависимостей ассета

Analyze — окно, которое идёт в комплекте с Addressables, открывается по нажатию Window / Asset Management / Addressables / Analyze, найдет разрешаемые зависимости, по нажатию кнопки их разрешит. и покажет неразрешимые — о них мы еще поговорим

AssetDatabase.GetDependencies(assetPath) вы можете написать собственный инструмент для осмотра зависимостей ассета. Функция имеет хорошую производительность, поэтому этот способ вполне имеет право на жизнь. Работает только в одну сторону

Experimental Dependecy Viewer — официальный upm-пекедж для просмотра зависимостей. медленный ( после изменений необходимо перестраивать индекс всего проекта, что занимает много времени в большой проекте). Работает в обе стороны
Частные случаи неразрешимых зависимостей
-
Material.savedProperties.TexEnvs

Материал хранит ссылки на текстуры, которые вы назначаете для текущего шейдера. Если позже вы переключитесь на другой шейдер, у которого другие поля для текстур, ссылки на старые текстуры останутся.
Решение:
MaterialPropertyCleaner — окно с открытым исходным кодом, для очистки не использующихся параметров

-
Выберите материалы
-
нажмите Remove Old Texture References
-
Asset.ExternalObjects
Ассет может иметь ссылки в виде ExternalObjects, например, в ассете-модели через инспектор вы можете назначить ссылку на материал. Позже вы переключаете ModelMaterialMode на «No», но ссылка останется
Решение:
-
AssetImporter.GetExternalObjectMap() получить ссылки
-
AssetImporter.RemoveRemap() удалить
-
Object defaultReferences
Вы можете назначить ссылки по умолчанию для MonoBehaviour, ScriptblaObject, Shader. Распространённая практика:

-
указать в шейдер текстуру, которая будет по умолчанию, но позже может быть заменена
-
указать в скрипте MonoBehaviour или ScirptableObject ссылку на существующий ScriptableObject или Prefab (GameObject)
Решение:
Выберите файл Shader / MonoBehaviour / ScriptableObject и занулите ссылку вручную, нажав «Delete»
-
«Built in extra»
Если объект из сцены или ресурсов ссылается на ассет из категории «Built in extra», Addressables.Analyze помечает это как неразрешимую зависимость
Ресурсы из Built in extra:

-
встроенные спрайты
-
встроенные шейдеры
-
дефолтные Спрайты, частицы, материал Skybox
-
примитивные меши: Cube, Plane, Capsule, Sphere

-
Удалённые ссылки в скриптах
Если вы:
-
создали ScriptableObject
-
добавили к нему поле ссылки
-
присвоили эту ссылку объекту
-
сохранили ассет
-
удалили ссылку из скрипта
Ссылка останется сериализованной. Окно Analyze пометит эту зависимость как неразрешимую
Решение:
ForceReserialzeAssets(assetPath) ресериализовать ассет, содержащий ссылку
Мы также активно использовали мой Asset Process Graph для массовой замены ссылок он доступен на GitHub

ссылка на оригинал статьи https://habr.com/ru/post/715810/
Добавить комментарий