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
: ваш активный объект все равно будет занимать память
Все это говорит о том, что пакеты активов очищают вещи и включают в себя открытые методы управления памятью для выгрузки активов, которые, как вы знаете, вам больше не нужны, и только часть пакета, на которую есть ссылки, должна быть загружена в память в любое время. данное время. Поддерживаются связи между прототипным активом и активом в сцене, чтобы не возникало дублирования (кроме случаев, когда разработчик велит выгрузить пакет актива и намеренно разрывает эту ссылку).