На этот раз он на английском, так как я подумал, что кто-то может погуглить, и наткнулся на это. Обычно я пишу по-тайски.

РЕДАКТИРОВАТЬ: С грядущей системой адресных активов все это не будет иметь значения! У вас будет полный контроль над погрузкой и разгрузкой! Https://docs.unity3d.com/Packages/[email protected]/manual/index.html

Проблемы

В Unity есть несколько интересных и неоднозначных вопросов о том, когда будет занята память. На мобильном это особенно важно! Во-первых, это основы:

  • Когда сцена загружена, она сканирует все игровые объекты, а затем сразу же загружается все, что связано с компонентом. Одно исключение - AudioClip с preloadAudioData не отмеченным в инспекторе (добавлено в Unity 5.0)
  • Даже если вы подключите ScriptableObject актив, он все равно перейдет к этому активу и загрузит все.
  • Единственный способ не подключать объекты и загружать их позже по строковому пути - это поместить ваши ресурсы в Resources папку.
  • Есть Resources.UnloadUnusedAssets() и Resources.UnloadAsset() для использования. (Также эксклюзивный AudioClip.UnloadAudioData) Последний не может использоваться в GameObject или компонентах, он должен быть в «активе», например Sprite.

Теперь все может усложниться. У меня несколько вопросов:

  • Что считается «неиспользованным» для разгрузки Resources.UnloadUnusedAssets()?
  • Что произойдет, если я Resources.UnloadAsset() тот, который сейчас используется? Если не работает, как заставить работать?
  • Что делать, если префаб находится внутри папки Resources (создается путем строкового пути), но все ссылочные изображения, на которые они ссылаются, находятся за пределами папки Resources? А что насчет внутри-внутри? Снаружи внутри?
  • Если все ссылки на изображения находятся в AnimationClip, который находится в Animator, он все еще загружается сразу или загружается при воспроизведении?
  • Можно ли отложить загрузку, не активировав компонент, содержащий ссылки на изображения?
  • Можно выгрузить Sprite? Или надо выгрузить texture? Оба являются активами, так есть ли разница?
  • так далее…

Я много раз вспоминал об этом. Это исследование, чтобы я мог вернуться и сослаться на него в будущем. Unity2017 тоже только что вышел, думаю, это хорошая возможность.

Проект Единства

В этом проекте у меня есть 12 несжатых текстур 2048x2048 RGBA32. Как показано в инспекторе, это 16 МБ каждый. Половина из них находится в папке Resources. Я сделал их большими, чтобы можно было легко видеть различия в памяти. Серая шкала альфа-источника предназначена для принудительного использования альфа-канала.

Есть 8 различных префабов и 8 различных сцен. В каждой сцене я могу создать каждую из них и что-то с ней делать.

ImageOutside-PrefabOutside
ImageOutside-PrefabOutsideAni
ImageInside-PrefabOutside
ImageInside-PrefabOutsideAni
ImageOutside-PrefabInside
ImageOutside-PrefabInsideAni
ImageInside-PrefabInside
ImageInside-PrefabInsideAni

(Я должен был назвать их Prefab ___- Image___, но уже слишком поздно ... извините. Но в основном первые 4 находятся вне папки Resources)

Название показывает их отличия:

  • ImageInside / Outside = Упомянутые изображения находятся внутри / снаружи Resources
  • PrefabInside / Outside = Сам префаб находится внутри / снаружи Resources
  • Ani = Содержит Animator, который, в свою очередь, имеет AnimationClip ссылки на изображения. В противном случае это простой скрипт, который содержит массив изображений и вручную циклически переключает каждое изображение. Если нет «Ani» и указано «ImageInside», массив изображений будет изначально пустым. (Загрузка вручную с Resources позже)

Мы начнем со сцены -Start, у которой нет префаба и нечего делать. Нажатие кнопки Следующая сцена приведет к переходу к сцене 1 и так далее. Но на самом деле после каждого нажатия кнопки «Следующая сцена» он переходит к RestScene, который UnloadUnusedAssets будет очищать вещи перед переходом к следующей. RestScene почти ничего не содержит, поэтому UnloadUnusedAssets должен все убрать… или нет !?

Есть код, который измеряет время, необходимое для загрузки сцены, а также Instantiate объект. Очевидно, это зависит от устройств. Я использую Nexus 5, он был выпущен много лет назад и должен работать достаточно медленно, чтобы показывать различия.

Вы можете получить проект и попробовать его на моем GitHub. Кто знает, может, в iOS все по-другому? Или другие платформы? (Если это действительно так, я был бы признателен, если бы вы связались со мной по вопросам GitHub)



Процедуры / План эксперимента

  • Выполните сборку этого проекта для Android и используйте удаленный профилировщик для отслеживания использования памяти. Это сделано для предотвращения профилирования памяти Unity из редактора.

  • 36 последовательностей действий соответствуют этой таблице. Он идет последовательно слева направо, и в каждой строке есть отдельный прогон сцены. Я нажимаю кнопку Restart Scene между запусками. Обратите внимание, что следующая сцена в конце предназначена для проверки эффекта очистки с помощью UnloadUnusedAssets на всякий случай.

Вы можете посмотреть в коде, что означает каждая ячейка. Но вот читаемый формат:

  • Создать: Instantiate GameObject, который уже подключен к инспектору.
  • Создание экземпляра из ресурсов: используйте строку для Resources.Load GameObject, а затем Instantiate
  • Toggle GO With Sprites: Изначально скрипт, который будет циклически воспроизводить изображения, отключен. Но в этом скрипте уже будут подключены изображения в случае ImageOutside. Имена этих спрайтов: 1,2,3,4,5,6. (.png)
  • Загрузка ресурсов спрайтов: в случае ImageInside нам нужно загрузить эти изображения из Resources, прежде чем переключать скрипт и дать ему возможность воспроизвести. Названия этих спрайтов 7,8,9,10,11,12. (.png)
  • Toggle Animator: Аниматор тоже отключен по умолчанию. Но у него уже есть AnimationClip со всеми подключенными изображениями. В Ani-test нет динамической загрузки изображений, все это встроено в клип.
  • Уничтожить / выгрузить Неиспользованные: Destroy(gameObject) и Resources.UnloadUnusedAssets().
  • Выгрузить подключено: вызов UnloadAsset на всех подключенных спрайтах. Я ожидаю, что это не сработает, поскольку в сцене есть кто-то, кто их использует.
  • Выгрузить Connected Inner: то же самое, но вместо того, чтобы делать это на Sprite, я продвинулся на шаг дальше в Sprite.texture
  • Удалить ссылку: удалить все ссылки на спрайты. Массив будет очищен, и image.sprite = null После этого я ожидаю, что UnloadUnusedAssets будет работать. Также после этого не должно работать Unload Connected, так как больше ничего не подключено.
  • Отображение выгрузки: имеет 2 значения (в коде есть if), если вы используете его перед удалением ссылки, он попытается выгрузить спрайт только тот, который использует Image компонент. Но если после, он может выгрузить то одно изображение, которое Image ранее использовало. (Код Remove Reference может запомнить последнее использованное изображение) Я ожидаю, что последний случай сработает, а первый - не сработает.
  • Unload Displaying Inner: то же самое, но вместо того, чтобы делать это на Sprite, я продвинулся на шаг дальше в Sprite.texture
  • Выгрузка, используемая в анимации: это странно, потому что я не мог погрузиться в AnimationClip. У меня нет возможности узнать, какую текстуру использовала анимация.
    В случае ImageOutside я создал новый Sprite[] просто для того, чтобы удерживать те текстуры, которые я использовал в анимации для Resources.UnloadAsset (Это не требует дополнительной памяти, поскольку Unity все равно загрузит текстуру в анимацию при запуске сцены ... упс! Я испортил некоторые результаты!)
    Но в случае ImageInside я не хочу связывать ссылки, чтобы еще больше запутать результаты. Вместо этого при выгрузке я использую строку, чтобы снова загрузить этот актив, просто чтобы получить ссылки для выгрузки. Предполагается, что часть загрузки будет происходить в мгновение ока, поскольку Unity в любом случае уже загружает эти спрайты из анимации.
    И снова, Unload Used In Animation Inner означает, что я выгружаю Sprite.texture вместо Sprite.

Полученные результаты

Вот! Я потратил на это с 8:00 до 22:00 !!

Память чистого состояния: 26,7 МБ

Желтая ячейка означает, что все 6 изображений находятся в памяти, 137,3 МБ.

Зеленый - 106,5 МБ, что означает, что в памяти отсутствует одно изображение.

Если вы можете обосновать каждое изменение / отмену изменений каждой горизонтальной последовательной ячейки в таблице, просто взглянув на нее, вы являетесь мастером памяти Unity!

Интерпретации

Вы можете попробовать интерпретировать результат в соответствии с вашими требованиями, но вот мой.

Начальная загрузка зависит от того, когда Unity увидит эти ссылки.

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

Обратите внимание на значительное время загрузки сцены только для сцен 1, 2 и 4. (На компьютере это не заметно, а на мобильном телефоне.) Что это означает?

(1) (2) Потому что все изображения, подключенные в инспекторе, будут немедленно загружены при загрузке сцены. Это согласно основам.

(3) выполняется быстро, так как изображение находится в Resources, и мы загрузим его вручную позже. Префаб, подключенный к инспектору, не имеет значения, так как без этих ссылок на изображения он такой маленький. Таким образом, ваша игра может иметь быструю загрузку сцены с помощью сборного соединения для упрощения написания сценариев. Тогда у вас может быть какой-то счетчик, который подождет, пока префаб загрузит недостающие изображения.

(5) Имеет быстрое время загрузки, несмотря на то, что изображения находятся за пределами Resources, потому что нет ссылки на префаб, который Unity может знать об этих изображениях. На данный момент я использую строку для загрузки префаба, Unity заметит эти подключенные изображения и загрузит их, как вы можете видеть из длительного времени Создание экземпляра из ресурсов. (6) то же самое из-за следующей темы.

(7) В Resources есть и префаб, и изображения, поэтому даже после загрузки префаба Unity по-прежнему не может видеть эти изображения. Тогда рабочая нагрузка будет на Resources.Load. Поскольку префаб быстро загружается при запуске сцены, я предлагаю вам вместо этого сделать как в (3). (пропуская ручную загрузку на префабе, но делайте ручную загрузку на здоровенных изображениях)

(4) Внутри Resources тоже есть изображения, но почему у него долгое время загрузки сцены? Это потому что…

Использование изображений в AnimationClip ничем не отличается от подключения в инспекторе.

Вы не можете избежать сканирования нагрузки, поместив что-то в ключевой кадр. Unity все равно просканирует их все. Обратите внимание, что нет возможности самостоятельно перебирать ключевые кадры, чтобы найти все ссылки AFAIK.

И эти изображения могут быть как в папке Resources, так и вне ее. Это будет то же самое, что и во время Создание экземпляра из ресурсов (6) против (8). Он связан с помощью ключевых кадров в AnimationClip, и Unity их найдет. Если только вы не оставили AnimationClip и попытаетесь создать его из сценария + Resource.Load динамически вставляя изображение. Но это безумие, если не считать очень тривиальных анимаций.

Установка значения false для включения компонентов не может остановить автоматическую загрузку

Я попытался несколько раз отложить загрузку, установив по умолчанию .enable компонентов, использующих их, на false. (Вы ставите галочку рядом с именем компонента), но, как вы можете видеть, ячейка была желтой до того, как они были включены.

То же самое относится и к Animator. У меня они .enable = false по умолчанию, но Unity все еще сканирует и загружает все.

Destroy не помогает освободить память

Некоторые новички-разработчики Unity могут подумать, что Unity должна знать, что, поскольку объекта и ссылок больше нет, нужно выгрузить все вещи. Но это не так! Вам понадобится ручная выгрузка, а можно дождаться сборщика мусора. (не рекомендуется)

Есть Resources.UnloadAsset, чтобы определить, что выгружать, но это уже другая тема. Здесь я расскажу о Resources.UnloadUnusedAssets. Обратите внимание, что на каждом Destroy цвет ячейки не меняется по сравнению с предыдущим. Это не заботится о памяти.

Если он все еще в памяти, загрузка будет бесплатной.

Если вы просто уничтожите вещи и Instantiate этот объект снова, создание экземпляра будет быстрым, поскольку все изображения все еще находятся в ОЗУ.

Вы можете попробовать это самостоятельно в (5) и (6), где время создания экземпляра велико. Поочередно переключаясь между кнопками Instantiate и Destroy, вы увидите, что только первый раз занял ~ 1500 мс.

Если вы используете UnloadUnusedAssets до следующего Instantiate (и ему удастся очистить память), Instantiate снова будет медленным.

Но это не причина, по которой вам следует отказываться от «объединения игровых объектов». Наивное создание экземпляров 100 пуль может выиграть от сохранения изображения пули из первого экземпляра, но этот метод заключается в дальнейшем сокращении времени на создание экземпляра игрового объекта в самой сцене. (Это может быть узким местом, особенно если ваш экземпляр объекта имеет несколько компонентов с собственными кодами Awake или Start)

Resorces.UnloadUnusedAssets удаляет все, что не имеет ссылок как в сцене, так и в коде

Первая пунктирная область UnloadUnusedAssets не смогла очистить память! Игровой объект был уничтожен, так почему же! Это потому, что в сцене все еще есть этот игровой объект, связанный с основным логическим скриптом (который помогает легко создать экземпляр того, который вы только что уничтожили). Благодаря этому соединению Unity видит, что у него также есть все изображения, связанные. Unity не может их удалить. Вторая пунктирная область по той же причине. Помните, что AnimationClip то же самое, что и connected.

Третья пунктирная область успешно очищает память (белая ячейка означает около 26 МБ, начальное состояние). Это связано с тем, что даже несмотря на то, что сборная ссылка присутствует в сцене, она не имеет ссылки на изображения. (Вы динамически загружаете их через строки) Unity может их удалить.

Четвертая штриховая область (а также в (8)) успешно очищает память по сравнению со второй пунктирной областью, в которой также используется AnimationClip. Почему? Это связано с тем, что мы динамически загружаем сам префаб, поэтому в сцене больше нет префабов, ожидающих простого создания экземпляра. (Мы использовали строку для создания экземпляра). Тот, который вы уничтожили, является последней ссылкой на изображения, поэтому Unity может удалить их.

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

Веселая викторина! Здесь нет Destroy, но ссылка на префаб в сцене не содержит ссылки на изображения. Это означает, что единственная оставшаяся ссылка, которая мешает работе UnloadUnusedAssets, - это ссылка, на которую вы сейчас смотрите. Выполнив Удалить ссылки, я очистил Sprite[], который я заполнил ранее строкой и Resources.Load, а также очистил тот, который использует компонент Image (изображение теперь становится белым, как вы можете видеть из белого поля Я добавил).

Удалить ссылки, тем не менее, возвращает еще одну ссылку на ту, которая Sprite только что использовалась Image! (Я не хочу видеть изображение, но хочу поэкспериментировать с выгрузкой только этого изображения различными способами, которые я объясню далее в другом разделе.) Но Отображение выгрузки попытается выгрузить (и с треском провалился, поскольку вы можете видеть, что ячейка все еще желтая, 137 МБ, без изменений.Причины появляются, но вкратце я не должен выгружать на Sprite) ... затем установите эту ссылку на null. Теперь следующий UnloadUnusedAssets прекрасно работает.

Вопрос в том, сколько памяти будет выделено, если я пропустил команду Выгрузить отображение, зная, что она не работает и ничего не делает?

Ответ: 40 МБ. Объем памяти чистого состояния составляет 26,7 МБ, а максимальный - 137,3 МБ. У нас есть 6 изображений, поэтому каждое будет иметь размер (137,3–26,7) / 6 = около 20 МБ. Это означает, что после UnloadUnusedAssets осталось одно изображение, и это потому, что поведение Удалить ссылки по-прежнему сохраняет это еще одно изображение в коде без Выгрузки отображения null это. Урок не только в сцене, но если вы что-то забыли в коде, UnloadUnusedAssets не сможет это удалить.

Используйте Resources.UnloadAsset в Texture2D, а не в Sprite

Из таблицы видно много промахов! Использование UnloadAsset на Sprite было ошибкой.

У этих методов есть «внутренний» вариант, где я правильно выгружаю на sprite.texture.

Пунктирная область показывает не внутренний вариант. И вообще никаких изменений в памяти нет. Под всеми пунктирными ячейками показана внутренняя версия, вы можете видеть, что в этой ячейке что-то произошло.

Зеленая кнопка Unload Displaying Inner под пунктирной областью имеет смысл, поскольку успешно выгружает только одно изображение.

Белый Выгрузить подключенное внутреннее под пунктирной областью имеет смысл, поскольку он успешно выгружает все изображения. (Все «подключены» к инспектору) Технически после разгрузки все они все еще подключены, но UnloadAsset имеет право выгружать вещи, сохраняя при этом ссылку. Но Unity уже загрузит их автоматически с первого раза, когда Unity увидит их. (Аудио имеет preloadAudioData = false, чтобы помочь предотвратить эту проблему.)

Ячейка эмодзи будет объяснена позже.

Resources.UnloadAsset может принудительно выгрузить актив, даже если кто-то его использует

В разделе дизайна у меня есть несколько предположений, что UnloadAsset не сработает, если я использую их на чем-то вроде изображения, которое Image компонент в настоящее время использует.

Оказывается, это неправда. Он будет работать нормально, если я сделаю это на texture, а не наSprite, и сразу же сделаю отображаемое изображение черным. Image не пытается загрузить обратно то texture. (пока что)

Resources.UnloadUnusedAssets действительно может выгружать то, что в настоящее время используется

Сюрпризы! Использование Resources.UnloadAsset на Sprite не было напрасным! Вы можете наблюдать некоторые эффекты разгрузки в Sprite. На самом деле он что-то делает.

На каждой паре ячеек в пунктирной области с левой стороны ничего не происходит. Но с правой стороны UnloadUnusedAssets имеет некоторую степень успеха.

Сначала я попытаюсь объяснить желто-белые. С левой стороны Unity успешно выгружает Sprite. Вы не видите изменений в памяти, поскольку Sprite мала. Мясо в sprite.texture. Вы не выгружали это.

Вот что заставляет UnloadUnusedAssets работать. Потому что обычно (я полагаю) он следует за ссылкой любыми объектами - ›Sprite -› Texture2D, чтобы увидеть, что он все еще не может выгрузить мясистое texture.

У меня есть ссылки только на Sprite во всем моем коде. Unity должен начать следовать от них, чтобы добраться до текстур. Это единственный способ.

Теперь, когда ссылок на Sprite больше нет, UnloadUnusedAssets выгружает, казалось бы, болтающиеся texture.

UnloadUnusedAssets допустил ошибку, так как «Никто не использует текстуру» не соответствует действительности. Фактически компонент Image может отображать это texture. Но помните, что Image компонент принимает Sprite актив, а не texture. Внутри он, вероятно, откопает texture для использования, а затем перестанет заботиться о Sprite.

У меня вручную UnloadAsset все Sprite, но компонент Image все еще отображался нормально. В тот момент, когда UnloadUnusedAssets уберу texture изображение становится черным. Все было бы иначе, если бы я использовал RawImage, я полагаю, этот компонент может удерживать сам texture и действительно может помешать работе UnloadUnusedAssets. (непроверено)

Побочный эффект заключается в том, что теперь даже UnloadUnusedAssets может принудительно выгружать вещи, которые в настоящее время используются, например UnloadAsset (несмотря на иронию его названия).

Что касается желто-зеленой пары, она становится зеленой по той же причине. А вот желтую ячейку раньше просто выгружали одну Sprite из всех имеющихся 6 Sprites. В результате UnloadUnusedAssets вырывает тот болтающийся texture, что приводит к небольшому сокращению используемой памяти.

Черный цвет текстуры не найден

Если я удалю ссылку на изображение из Image компонента (null он), он станет белым. Это цвет «без изменений» Image компонента, который вы установили в инспекторе. Это может быть любой цвет, который вы хотите подкрашивать.

Но если я успешно выгружаю texture, который использует компонент, в результате получается черное изображение.

В идеале вам следует прекратить использовать их перед разгрузкой, но хорошо знать, что вы также можете выгружать во время использования. (В отличие от UnloadUnusedAssets, как следует из названия)

Для тех, кому интересно, как выглядит редактор, когда изображение было выгружено и стало черным, он выглядит как обычно. Это исходное изображение в настоящее время выгружено.

Нажатие клавиши удаления превращает изображение из черного в белое, перетащите ту же 6.png текстуру в слот, и она перезагрузит текстуру.

Есть способы выгрузки изображений, используемых в AnimationClip

Вы не можете помешать Unity помещать все изображения, используемые в ключевых кадрах, в ОЗУ, потому что Unity уже отсканировала их.

Но зная, что UnloadAsset может точно определить выгрузку, что произойдет, если я каким-то образом сохраню ссылки на те изображения, которые используются в AnimationClip, и передам их UnloadAsset?

Результат - да! Вы можете их разгрузить! Даже если вы не можете остановить загрузку, вы можете быстро выгрузить его, если не хотите, чтобы автоматическая загрузка, как в Unity. Если они используются в анимации, отображаемый спрайт станет черным.

Я расскажу о смайликах в следующем разделе, но в более длинной пунктирной области они становятся черными. Обратите внимание, что перед более длинной пунктирной областью есть 2 Toggle Animations. Это останавливает анимацию на определенном кадре. Смайлы выгружаются во время воспроизведения.

Теперь вам может быть интересно, как мне удалось получить ссылки на эти текстуры для использования в UnloadAsset? Я искал, как перебирать ключевые кадры для извлечения справочных данных, но не нашел никакого способа. Я обманул, сделав вручную additionalpublic Sprite[], которые я знаю, что они в настоящее время используются в анимации. Это делает код хрупким, поскольку, если я помещаю новые спрайты в AnimationClip, я должен не забыть добавить и их в этот массив. А использование этого массива означает, что UnloadUnusedAssets не может о них позаботиться. В конце концов, у вас все еще есть ссылки.

Другой способ обмануть, если ваши изображения, которые вы используете в AnimationClip, находятся в Resources папке (и у вас есть причины, по которым вы не хотите подключать их к инспектору), заключается в том, что вы можете Resources.Load их только для этого вы можете получить ссылку на UnloadAsset их. Load будут бесплатными, поскольку в Unity они уже воспроизводятся в анимации. (Просто убедитесь, что вы загрузили правильные, которые действительно используются) Теперь у вас есть ссылки, не углубляясь в клип.

Аниматор может автоматически загружать выгруженные изображения, если он воспроизводится.

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

Память медленно восстанавливается до полного состояния вскоре после того, как я пытаюсь выгрузить (эффективно, на texture) образ, используемый в AnimationClip.

В последнем разделе изображение становится черным, потому что оно в данный момент не воспроизводится. Теперь, когда я выгружаю все, пока оно воспроизводится, он будет принудительно загружать последовательно во время воспроизведения. На всякий случай выгружайте, когда анимация остановлена, иначе игра будет отставать без каких-либо выигрышей.

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

Использование UnloadUnusedAssets в пустой сцене приведет к удалению ВСЕХ воспоминаний об активах.

Команда Следующая сцена всегда успешно возвращает новое состояние, поскольку:

  • Сцена отдыха была загружена с LoadSceneMode.Single, все будет очищено.
  • Сцена содержит не что иное, как простой скрипт для перехода к следующей сцене, конечно, UnloadUnusedAssets должен работать оптимально в этой сцене. (Если только вы не поместите тяжелые вещи в static переменные)

Может показаться банальным, но вы можете сделать это, чтобы «освежить» свою игру. Вы бы сделали это в сцене «сейчас загружается». Все, что осталось после очистки, это некоторые танцующие персонажи, которые могут быть у вас в сцене загрузки.

Также обратите внимание, что это может быть не лучшим решением. Если следующая сцена будет загружать те же самые большие объекты, что и предыдущая сцена, возможно, вы захотите быть более избирательным в разгрузке, сохраняя что-то в ОЗУ.

Как насчет того, чтобы целенаправленно удерживать что-то с помощью новых переменных или уничтожить все, что вам не нужно в сцене, кроме определенных игровых объектов, а затем вызвать UnloadUnusedAssets? Эта команда может затем стать мощной выборочной выгрузкой, если вы знаете, как она работает.

Обновлять

Дополнительная информация об использовании папки Resources вместе с SpriteAtlas, а также ручной загрузке / выгрузке находится внизу этой статьи.



Надеюсь, вы что-то поняли из моих исследований! Обычно в этот момент я могу рекламировать свою игру, но, к сожалению, это еще далеко не конец. (так что я не собираюсь)