О Texture2D и памяти
Если погуглить на тему Unity Texture2D, memory leak, www.texture — то можно обнаружить кучу постов с вопросами о том, почему не освобождается память. И это на на самом деле так, если ничего не предпринимать.
Намучившись со всем этим, составил небольшой список мыслей/советов:
- Создавайте, как можно меньше Texture2D, в идеале использовать пул. И обязательно делать Destroy, когда объект уже не будет использоваться, иначе память не освободится.
- При использовании класса WWW, также нужно удалять www.texture и делать www.Dispose.
- Сжатие «на лету» не работает, т. е. если вы например загружаете изображение из интеренетов и потом вставляете в Image, способом ниже, то на мобильном устройстве, картинка полностью развернется в память, без сжатия. И это печально.
// data is downloaded byte[]
...
Texture2D texture = null;
#if UNITY_ANDROID
texture = new Texture2D(2, 2, TextureFormat.ETC2_RGBA8, false);
#elif UNITY_IOS
texture = new Texture2D(2, 2, TextureFormat.PVRTC_RGBA4, false);
#endif
texture.LoadImage(data);
Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(.5f, .5f)));
MyImage.sprite = sprite;
- Используйте сжатие предназначенное под конкретную платформу. Для iOS — это PVRTC4, для новых моделей подойдёт ASTC, начиная с iPhone 6. Для Android — ETC. Подробнее про это можно прочитать в мануале Unity.
- Кроме того, сжатие не будет работать в некоторых случаях, если размеры спрайтов и атласов не равны степени 2. Т. е. размеры должны быть 128x128, 2048x2048 и т. д.