Unity Resource.Load management - PullRequest
       1

Unity Resource.Load management

0 голосов
/ 05 января 2019

Из проведенных исследований мне было неясно, что стоит за функцией Unity Resources.Load.

Мне интересно, если Resources.Load ("file") каким-то образом хранит объекты, которые уже были загружены, или было бы оптимальным создать менеджер для обработки уже загруженных объектов? В некотором смысле, чтобы пропустить необходимость перезагрузить файлы, которые уже были загружены.

В моем случае у меня есть около 50 * 50 GameObjects, у всех из которых есть изображение, где в некоторых сценариях игровые объекты могут использовать одно и то же изображение. Все это вызывает Resources.Load и поэтому я предполагаю, что будет оптимизирована производительность, чтобы не перезагружать каждый файл, а вместо этого повторно использовать загруженный файл.

Я могу ошибаться в отношении оптимизированной производительности таким образом. Я ценю любую информацию и разъяснения этого.

1 Ответ

0 голосов
/ 06 января 2019

Resources.Load - это просто синтаксический сахар вокруг множества вещей

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

Тем не менее, условно говоря, ресурсы в папке «Ресурсы», к которым Resources.Load позволяет вам получить доступ, упакованы и отправлены в Unity.dll, который экспортируется при сборке вашего проекта (примечание: exe почти бессмысленен, он содержит достаточно кода для загрузки DLL-файлов из папки YourProjectName_Data).

Как это делает это, вероятно, варьируется от типа объекта к типу объекта. Недавно я опубликовал ответ с некоторым кодом, который показывает, как извлечь Texture2D из dll без использования Resources.Load (есть вызов Resources.Load, но это так, разработчик, использующий dll, этот код скомпилированный в может переопределить упакованную текстуру, если они желают). К сожалению, тот, кто задал этот вопрос, хотел загрузить вещи, которые не были текстурами, и нет удобного конвертера byte[] в GameObject, как для текстур.

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

Что я знаю или подозреваю:

  • Все расположения папок / Resource объединяются и обрабатываются как одно и то же местоположение, независимо от того, где вы находите их в каталоге / Assets.
  • Все элементы в папке / Resources будут включены в dll (а файлы содержатся в dll внутри папки _data)
  • Вызов Resources.Load() для какого-либо актива кэширует актив. Если в будущем вы снова сделаете тот же вызов загрузки, Unity распознает его и сможет намного быстрее передать собранный актив.
    • Неясно, задействован ли дисковый ввод-вывод или потоковые байты от оперативной памяти.
    • Моя собственная система кеширования около Resources.Load не была ни быстрее, ни медленнее, чем Resources.Load (незначительная разница при использовании по сравнению с неиспользованием моей Dictionary<String,Texture2d>).
    • Однако могут быть ограничения кэша, и Unity может выгружать вещи, которых некоторое время не было на сцене, и т. Д. Или, может быть, никогда не выгружать ресурсы, что приводит к возможным проблемам типа утечки памяти , Я не проверял в любом случае.
  • Если у вас есть загруженный актив в сцене, не имеет значения, что делает базовый Resources.Load: ваш активный объект все равно будет занимать память

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...