1max1 писал(а):Пора сваливать с этой юнити на анрил
Уверен на анриале еще больше проблем с памятью
к тому же дестрой не так часто используется последнее время... уже какое время продвигается идея переиспользования объектов(они не удаляются, они просто кэшируются).
p.s. лет дцать назад, когда юнити была еще с лицензией, находил заметку, что тип Destroy высвобождает ссылки на GO или компонент, от объектов юнити. и если мы создаем какой-нибудь контроллер, извольте расширить дестрой, и добавить очистку ссылок в ваших контролерах... т.к. GC не может высвободить объект, на который есть ссылка активная.
Вы говорите о пулах, которые не всегда целесообразно применять. Если объект используется 1-2 раза за весь цикл игры, использование пула в этом случае будет означать дурной тон, нежели оптимизацию и оправданное кеширование в памяти. Это становится модно, только лишь потому, что это достаточно просто. Не нужно ни за чем следить, когда пул менеджер управляет вашими объектами. Нагромождение объектов в пул, означает переиспользование памяти, в ряде случаев память выделяется зря.
Поэтому Destroy все еще остается актуален.
По поводу ...
современные компы имеют столько памяти, что порой не видны эти утечки до поры до времени...
вы же не подгружаете каждый раз картинку, или музыку...
Вы ошибаетесь, утечки очень сильно заметны, пример тому куча современных игр, которые жрут по 8-12 гигов, при этом реально используют для быстрой работы 30% от этого массива.
После этих утечек часто бывают ситуации когда сложно определить из за чего просадка по фпс идет через каждый кадр рандомно, потому что GC начинает собирать все эти утечки в какой то момент, когда это становится уже критично.
Это если мы не затрагиваем мобильные приложения. Где ситуации еще сложнее.
По поводу метода расширения Destroy, это хорошая идея, чтобы гарантированно убить объект. Нужно будет подумать над реализацией. Мне больше странно, что юнитеки об этом не пишут на странице с функцией, что она работает не так, как большинство ожидает. Там написано скорее даже противоположность тому, что фактический происходит, получается?
The object obj is destroyed immediately after the current Update loop, or t seconds from now if a time is specified. If obj is a Component, this method removes the component from the GameObject and destroys it. If obj is a GameObject, it destroys the GameObject, all its components and all transform children of the GameObject. Actual object destruction is always delayed until after the current Update loop, but is always done before rendering.
Note: When destroying MonoBehaviour scripts, OnDisable and OnDestroy are called before the script is removed.
https://docs.unity3d.com/ScriptReference/Object.Destroy.htmlОни что, сами себе противоречат?))
Кто то реально проверял существование ссылок не после Update а гораздо позже, или это домыслы?
If obj is a GameObject, it destroys the GameObject, all its components and all transform children of the GameObject. Actual object destruction is always delayed until after the current Update loop, but is always done before rendering.
Тут дословно написано, что при удалении объекта, удаляются и любые компоненты, как тогда можно получить доступ к ссылке которая находится "внутри компонента", если компонента не существует, ссылка автономно в памяти сосуществует от компонента с которым связана поэтому не удаляется? Но, каким образом тогда данные по этой ссылке можно было получить? Это реально попахивает бредом, как написали выше.
Это отсылка к видео которое продемонстрировал 1max1
Я ни разу такой информации не читал до сегодняшнего дня, и ни от кого не слышал, что Destroy не уничтожает ссылки и компоненты.
Может все-таки не в Update нужно производить удаление?
Как я до этого писал, в примере 1max1 мог быть конфликт GC.