После удаления объектов память не освобождается

Общие вопросы о Unity3D

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

Сообщение DbIMok 12 май 2020, 14:30

дело не только в куче. нативная память тоже очищается но не освобождается. на оф форуме об этом говорят уже 10 лет. юнитеки аргументируют тем, что если в одном кадре ты память почистил, то в следующем она снова может потребоваться. и требовать/отдавать ее туда сюда дорого. теоретически юнити может освобождать неиспользуемую память если прошло много времени. этому преданию уже много лет.
и перезагрузка пустой сцены не поможет, память только еще чуть подрастет. это примерно то же самое что UnloadUnusedAssets.
единственный способ с этим бороться - не уничтожать объекты/компоненты. отключать видимость/активность, задвигать за камеру. если нужен подобный объект то перенастраивать компоненты, если другой, а более подходящих нет, то удалять ненужные компоненты.
вероятно поведение не зависит от движка или используемого языка. единственное, что может где-то быть, это команда принудительной отдачи системе неиспользуемой памяти.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

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

Сообщение Alex5 12 май 2020, 18:25

Вы не забывайте ещё, что Unity - штука мультиплатформенная. И работа с памятью во всех системах разная. Как по мне, ковырять менеджер памяти там, где можно просто по-другому писать (я про архитектуру проектов) - вещь неблагодарная.
Linux это просто
Экономика это просто
Forex это просто
Мой канал на YouTube
Аватара пользователя
Alex5
Старожил
 
Сообщения: 507
Зарегистрирован: 22 авг 2019, 17:37

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

Сообщение Iq51 13 май 2020, 09:45

Так Adressables же
Iq51
UNIт
 
Сообщения: 64
Зарегистрирован: 19 окт 2011, 02:34

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

Сообщение Инженер 13 май 2020, 10:18

Протестил еще 2 движка: Unreal и Unigine. Больше проводить тестирования не вижу смысла: в обоих происходит все идентично тому, что в Unity. Так что да, как сказал DbIMok, видимо максимум что может быть- это какая-нибудь команда принудительной отдачи системе неиспользуемой памяти. Само оно не очищается не только в Unity, но и в других движках.

Iq51, Addressables я тестировал, результат тот же. Правда, мне не удалось найти кнопку, как собрать addressables для билда (документация устарела, интерфейс изменился), но в едиторе профайлер все так же показывает увеличение Unity-памяти не зависимо от уничтожения объектов. Так что этот вариант я посчитал не рабочим.
Инженер
UNIт
 
Сообщения: 88
Зарегистрирован: 22 май 2016, 11:13

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

Сообщение Dewa1s 13 май 2020, 11:04

Вообще, вроде как, эта проблема должна уйти с приходом ECS
Memory Chunks
The archetype of an entity determines where ECS stores the components of that entity. ECS allocates memory in "chunks", each represented by an ArchetypeChunk object. A chunk always contains entities of a single archetype. When a chunk of memory becomes full, ECS allocates a new chunk of memory for any new entities created with the same archetype. If you add or remove components, which then changes an entity archetype, ECS moves the components for that entity to a different chunk.

https://docs.unity3d.com/Packages/com.u ... _core.html
Тобишь юнити выделяет память чанками, и всегда старается переиспользовать освобожденную память. В теории это должно избавить нас от вышеописанных проблем с дырами
Но стабильную версию они обещают только в 22 году, поэтому сейчас копаться в этом смысла как-то особо не вижу. Пока читал документацию к 0.8 вышла 0.9, а сейчас как вижу уже 0.10 есть
Аватара пользователя
Dewa1s
Старожил
 
Сообщения: 564
Зарегистрирован: 26 дек 2011, 02:12

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

Сообщение Tolking 13 май 2020, 13:18

Именно так и происходит сейчас везде. Память не возвращается системе, а реиспользуется . И разработчики подтвердили, что ЕСП не будет постоянно дрочить систему на предмет выделения памяти, а будет использовать ранее выделенную... Зафигачил ты 1000000 объектов, потом удалил и эта память будет использоваться для других объектов, а не вернется в систему... Это не баг - это оптимизация... Можете попробовать создать свое решение, которое не будет так работать, но в конце концов вы все равно придете к тому-же самому... Программирование развивается уже больше 50 лет. Все уже придумано до нас...
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2715
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

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

Сообщение Jarico 13 май 2020, 14:22

Инженер писал(а):Iq51, Addressables я тестировал, результат тот же. Правда, мне не удалось найти кнопку, как собрать addressables для билда (документация устарела, интерфейс изменился), но в едиторе профайлер все так же показывает увеличение Unity-памяти не зависимо от уничтожения объектов. Так что этот вариант я посчитал не рабочим.


Перенос ассетов в бандлы происходит автоматически при билде проекта...
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

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

Сообщение Инженер 15 май 2020, 14:29

Разрабы Юнити отчитываются по этой теме в ответ на претензии, просто интересно почитать: https://forum.unity.com/threads/force-editor-to-release-memory.884761/#post-5839237.

То есть иногда все таки память возвращается ОС, но для этого нужно, чтобы весь раздел кучи был очищен, а это случается довольно редко, т.к. в них могут попасть случайные распределения.

Интересно, можно ли управлять распределениями кучи, чтобы делать их менее случайными? Вспоминая слова Dewa1s, это оно и есть в ECS?

Jarico писал(а):Перенос ассетов в бандлы происходит автоматически при билде проекта...


Неа, у меня не работает. В билде при попытке спаунить объекты, общая память приложения растет (будто объекты спаунятся), но на сцене не появляются. Хотя в редакторе все работает, как надо. Странно все это.
Инженер
UNIт
 
Сообщения: 88
Зарегистрирован: 22 май 2016, 11:13

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

Сообщение Tolking 15 май 2020, 14:42

ESC - это многопоток. Памяти, наверняка больше требуется. Еще раз - память после удаления объектов освобождается и используется для других объектов. Нет никаких причин ее возвращать системе прям сразу...
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2715
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

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

Сообщение Dewa1s 18 май 2020, 10:14

Tolking писал(а):ESC - это многопоток. Памяти, наверняка больше требуется. Еще раз - память после удаления объектов освобождается и используется для других объектов. Нет никаких причин ее возвращать системе прям сразу...

ECS это не только и не столько многопоток, сколько другая парадигма, в рамках которой работу с памятью можно организовать по-другому. Они просто эффективнее переиспользуют память
Аватара пользователя
Dewa1s
Старожил
 
Сообщения: 564
Зарегистрирован: 26 дек 2011, 02:12

Пред.

Вернуться в Общие вопросы

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

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