Страница 2 из 2

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

СообщениеДобавлено: 12 май 2020, 14:30
DbIMok
дело не только в куче. нативная память тоже очищается но не освобождается. на оф форуме об этом говорят уже 10 лет. юнитеки аргументируют тем, что если в одном кадре ты память почистил, то в следующем она снова может потребоваться. и требовать/отдавать ее туда сюда дорого. теоретически юнити может освобождать неиспользуемую память если прошло много времени. этому преданию уже много лет.
и перезагрузка пустой сцены не поможет, память только еще чуть подрастет. это примерно то же самое что UnloadUnusedAssets.
единственный способ с этим бороться - не уничтожать объекты/компоненты. отключать видимость/активность, задвигать за камеру. если нужен подобный объект то перенастраивать компоненты, если другой, а более подходящих нет, то удалять ненужные компоненты.
вероятно поведение не зависит от движка или используемого языка. единственное, что может где-то быть, это команда принудительной отдачи системе неиспользуемой памяти.

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

СообщениеДобавлено: 12 май 2020, 18:25
Alex5
Вы не забывайте ещё, что Unity - штука мультиплатформенная. И работа с памятью во всех системах разная. Как по мне, ковырять менеджер памяти там, где можно просто по-другому писать (я про архитектуру проектов) - вещь неблагодарная.

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

СообщениеДобавлено: 13 май 2020, 09:45
Iq51
Так Adressables же

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

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

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

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

СообщениеДобавлено: 13 май 2020, 11:04
Dewa1s
Вообще, вроде как, эта проблема должна уйти с приходом 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 есть

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

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

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

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


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

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

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

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

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

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


Неа, у меня не работает. В билде при попытке спаунить объекты, общая память приложения растет (будто объекты спаунятся), но на сцене не появляются. Хотя в редакторе все работает, как надо. Странно все это.

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

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

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

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

ECS это не только и не столько многопоток, сколько другая парадигма, в рамках которой работу с памятью можно организовать по-другому. Они просто эффективнее переиспользуют память