Проблема с освобождением памяти при загрузке текстур[РЕШЕНО]

Раздел, посвящённый самому важному - скорости.

Проблема с освобождением памяти при загрузке текстур[РЕШЕНО]

Сообщение Mikhail 08 авг 2011, 21:38

Всем доброго времени суток. У меня следующая проблема: загрузка текстур для GUI занимает слишком много памяти, что приводит к вылету из игры. Теперь конкретнее. Имеется рабочий массив типа Texture2D ну скажем на 20 элементов. В определённый момент (конкретно при заходе пользователя в определённую категорию) в этот массив с помощью вот такой конструкции подгружаются текстуры:
levelImg = new Texture2D[20];
for(int j = 0; j < 20; j++) {
levelImg[j] = (Texture2D) Resources.Load(base[j], typeof(Texture2D));
}
При этом происходит загрузка текстур не в графическую память, а в оперативную. Каждая текстурка где-то по 200 кб, и использованная оперативная память при это увеличивается где-то мб на 15 а графическая всего на 1 мб. Так вот, если пользователь выходит из данной категории, то я делаю следующее levelImg = new Texture2D[0]. При этом использованная графическая память освобождается, но оперативная нет. В принципе 15 метров не критично, но если представить, что таких категорий порядка 10, как-то не очень хорошо, тем более если учесть, что это гуи. Для айфона такая схема вообще приводит к вылету из приложения при последовательном заходе в несколько категорий. Я привык к программирования на С++, где выделение и освобождение памяти осуществляется в ручную, в С# я новичок. Но, как я понял, он автоматически делает переменные ссылками и сам выделяет память в динамической кучи и также освобождает эту память, когда на неё не остаётся ссылок. По логике вещей levelImg = new Texture2D[0] должна уничтожить все ранее созданные ссылки, а следовательно память должна освободиться. Вообщем надеюсь проблема понятна. Кто что может подсказать или посоветовать.
Последний раз редактировалось Mikhail 08 авг 2011, 22:18, всего редактировалось 1 раз.
Mikhail
UNец
 
Сообщения: 24
Зарегистрирован: 03 мар 2011, 11:57

Re: Проблема с освобождением памяти при загрузке текстур

Сообщение DbIMok 08 авг 2011, 21:42

совет: читать справку. например, если открыть описание класса Resources (мы же его используем, верно?), то можно увидеть следующее:
Some loaded assets, most notably textures, can use up memory even when no instance exists in the scene. To reclaim this memory when the asset is no longer needed, you can use Resources.UnloadUnusedAssets.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Проблема с освобождением памяти при загрузке текстур

Сообщение Mikhail 08 авг 2011, 22:01

Дело в том, что данная проблема возникала и при прямой инициализации массива текстур в инспекторе без использования класса Resources, конкретно данную функцию видел и описание читал, но как то скептически отнёсся к описанию (скорее всего из-за недопонимания). Сейчас вставил данную функцию после обнуления ссылок и память освобождается, огромное спасибо за помощь. Проблема решена.
Mikhail
UNец
 
Сообщения: 24
Зарегистрирован: 03 мар 2011, 11:57

Re: Проблема с освобождением памяти при загрузке текстур

Сообщение gnoblin 08 авг 2011, 22:03

Может будет полезно:
Если текстуры NPOT это увеличивает потребление памяти,
а если текстуры NPOT\неквадратные на ios, тогда не получится сжимать текстуры в pvrtc.
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Проблема с освобождением памяти при загрузке текстур

Сообщение Mikhail 08 авг 2011, 22:13

Мда, текстуры и в правду NPOT. Учтём, спасибо.
Mikhail
UNец
 
Сообщения: 24
Зарегистрирован: 03 мар 2011, 11:57

Re: Проблема с освобождением памяти при загрузке текстур[РЕШЕНО]

Сообщение WhiteDevil 25 фев 2012, 18:57

Привет! Вопрос по примерной теме :)
Проект под iOS, тестовая платформа - первый ипад.
Имею несколько текстур 2к х 2к, но используемые в разных сценах. Сцены создаю префабами, а не через LoadScene.
Где-то я вычитал, что айпад выдержит в пямяти максимум 3 текстуры 2048x2048 (или 2 + тексы других размеров). Все текстуры некомпрессованные и RGBA32.
И вобщем загрузив одну сцену, где есть такая текса - все пока что нормально. Но перейдя в другую сцену (при этом использую: полное очищение нынешней сцены, System.CGCollect, Resources.UnloadUnusedAssets), где есть еще такая большая текстура, игра крашится. Так думаю, что текстуры сохраняются в памяти, хоть и не используются. Пока не нашел решения.
Спасибо
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: Проблема с освобождением памяти при загрузке текстур[РЕШЕНО]

Сообщение VBProgr 27 фев 2012, 21:59

Что если загружать новую сцену не сразу после вызова "очистки", а на следующем кадре?
skype: vbprogr
Добавить vbprogr в Skype
VBProgr
UNITрон
 
Сообщения: 319
Зарегистрирован: 24 сен 2011, 14:11

Re: Проблема с освобождением памяти при загрузке текстур[РЕШЕНО]

Сообщение WhiteDevil 01 мар 2012, 16:02

Вообще у меня более точный вопрос сформировался:
Если я инициализировал в инспекторе несколько переменных текстурами, как мне освобождать эту занятую память?

peremennaia = null; + гарбэйдж коллектор

не помогает вообще. По крайней мере в профайлере, во вкладке Memory, юнити сообщает что я использую более тысячи загруженных текстур. В то время, как в статистике пишет что я реально использую 15 текстур.
Дело в том, что я формирую атлас из массива проинициализированных в инспекторе текстур. И соответственно, сформировав такой атлас, я хочу от этих текстур избавиться.
Так что крашилось не изза текстуры 2х2, а изза переполнения предела RAM
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55


Вернуться в Оптимизация

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3