@ReWire_92

Нужно ли выгружать ресурсы, загруженные Resources.Load()? Это затратная операция?

Есть канвас, на нем Image. В него из скрипта грузятся спрайты из папки Resources:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SpriteController : MonoBehaviour {

	public int level = 0;
	public Image Picture; 

	void Start () {
		Picture.sprite = Resources.Load<Sprite>(level.ToString());
	}

	void NextLevel(){
		level++;
		Picture.sprite = Resources.Load<Sprite>(level.ToString());
	}
}


В папке около 50 спрайтов. Функция NextLevel вызывается довольно часто. Правильно ли я понимаю, что при переходе на следующий уровень (level++) и загрузке следующих спрайтов, все загруженные до этого не удаляются и продолжают висеть в памяти, занимая место?
Если да, то нужно ли делать их выгрузку при каждой загрузке нового спрайта, учитывая, что предыдущие спрайты в игре точно уже не будут использоваться? (Спрайты - изображения весом по 1,5 Мб каждый, 800х600) Для выгрузки метод Resources.UnloadUnusedAssets() не подойдёт? Я так понимаю, он выгружает только ассеты? Как тогда правильно выгрузить мои спрайты? Таким образом?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SpriteController : MonoBehaviour {

	public int level = 0;
	public Image Picture;
	Sprite mySprite;

	void Start () {
		mySprite = Resources.Load<Sprite>(level.ToString());
		Picture.sprite = mySprite;
	}

	void NextLevel(){
		level++;
		Destroy (mySprite);
		mySprite = Resources.Load<Sprite>(level.ToString());
		Picture.sprite = mySprite;
	}
}


Я правильно всё понимаю или что-то не так/можно реализовать лучше?
  • Вопрос задан
  • 585 просмотров
Решения вопроса 1
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
Загруженные спрайты не удаляются, если вы сидите на одной сцене, если вы меняете сцену, то всё должно выгрузиться автоматически при условии, что у вас в каком-нибудь синглтоне не осталась висеть ссылка. UnloadUnusedAssets может помочь в ситуации, когда вы нагрузили кучу разных ресурсов, использовали их, потом обнулили все ссылки и хотите всё вычистить. Если это одиночные большие картинки, то лучше выгружать более явным образом через Resources.UnloadAsset. В этот метод нужно передавать то, что вы загрузили из ресурсов, например, если вы загрузили текстуру и создали из неё спрайт с помощью Sprite.Create, то передавать нужно текстуру, а не спрайт. С Destroy нужно работать аккуратно, он тоже может освободить память, но в некоторых ситуациях он может удалить объект так, что вы потом без перезапуска приложения не сможете его повторно загрузить. Ещё настоятельно рекомендую подобный код тестировать изолированно на отдельной сцене на целевом устройстве, в редакторе правильность выгрузки не проверить.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы