Unity пересоздает объекты, но не обновляет ссылки

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение Alkos26Rus 23 июн 2021, 18:20

TeslaGan писал(а):
Razor89 писал(а):
1max1 писал(а):Хоть через 100 лет доступ запроси, пока есть ссылка, никто ничего из памяти не удалит. Если бы я после удаления явно указал scriptA = null; то через N времени память была бы очищена, а так...

Как в таком случае контролируется переполнение памяти?
Зачастую Destroy довольно часто используется в проекте.

современные компы имеют столько памяти, что порой не видны эти утечки до поры до времени...
вы же не подгружаете каждый раз картинку, или музыку...

к тому же дестрой не так часто используется последнее время... уже какое время продвигается идея переиспользования объектов(они не удаляются, они просто кэшируются).

p.s. лет дцать назад, когда юнити была еще с лицензией, находил заметку, что тип Destroy высвобождает ссылки на GO или компонент, от объектов юнити. и если мы создаем какой-нибудь контроллер, извольте расширить дестрой, и добавить очистку ссылок в ваших контролерах... т.к. GC не может высвободить объект, на который есть ссылка активная.

Мобильные устройства: Ну да, ну да, пошли мы нахер)
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение 1max1 23 июн 2021, 18:26

Пора сваливать с этой юнити на анрил :ymdevil:
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение TeslaGan 23 июн 2021, 19:39

Alkos26Rus писал(а):Мобильные устройства: Ну да, ну да, пошли мы нахер)

а ты видел что на мобилных штампуют? с возможностями современных мобильных(не считая пары моментов) можно делать игры уровня симс 2... с таким же открытым миром... с разными механиками типа модов... но из-за того что некоторым банально лень следить за памятью, мы получаем нечто...

1max1 писал(а):Пора сваливать с этой юнити на анрил :ymdevil:

мы паралельно пишем на моно гейм... там больше вижу перспектив, если ее начнут активно поддерживать конечно.... а анрил - раздутый юнити... в 5 версии вон, движок стал работать медленнее в 2-4 раза..
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение 1max1 23 июн 2021, 19:59

моно гейм

Лучше уж на фалько что-то делать :))
В каких целях вы его используете?
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение TeslaGan 23 июн 2021, 20:07

1max1 писал(а):
моно гейм

Лучше уж на фалько что-то делать :))
В каких целях вы его используете?

фреймворк. с готовыми апи. с помощью которого можно выпустить игру на любой платформе. да, встроенных вещей там меньше чем в других, зато когда есть прогрраммисты в команде, получается получше чем на всяких юнити... а тем более в анреале. сейчас у меня открытых проектов нет, но вот недавно знакомая соло накидала прогу, для вышивки
Скрытый текст:
Изображение
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение Razor89 24 июн 2021, 06:21

1max1 писал(а):Пора сваливать с этой юнити на анрил :ymdevil:

Уверен на анриале еще больше проблем с памятью

к тому же дестрой не так часто используется последнее время... уже какое время продвигается идея переиспользования объектов(они не удаляются, они просто кэшируются).

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.
Razor89
UNец
 
Сообщения: 14
Зарегистрирован: 15 июн 2014, 18:08

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение TeslaGan 24 июн 2021, 11:49

Razor89 писал(а):Вы говорите о пулах, которые не всегда целесообразно применять. Если объект используется 1-2 раза за весь цикл игры, использование пула в этом случае будет означать дурной тон, нежели оптимизацию и оправданное кеширование в памяти. Это становится модно, только лишь потому, что это достаточно просто. Не нужно ни за чем следить, когда пул менеджер управляет вашими объектами. Нагромождение объектов в пул, означает переиспользование памяти, в ряде случаев память выделяется зря.
Поэтому Destroy все еще остается актуален.

хороша ложка к обеду. без спорно что надо к каждой ситуации подходить отдельно... но вот я порой сижу, принимаю кандидатов... они порой такие перлы отыгрывают - прям страшно становится... и обучают их подобным "фишкам" всякие ютуберы... а порой подобные мелочи видишь в курсах юнитеков, и вообще больно становится...

Razor89 писал(а):Вы ошибаетесь, утечки очень сильно заметны, пример тому куча современных игр, которые жрут по 8-12 гигов, при этом реально используют для быстрой работы 30% от этого массива.
После этих утечек часто бывают ситуации когда сложно определить из за чего просадка по фпс идет через каждый кадр рандомно, потому что GC начинает собирать все эти утечки в какой то момент, когда это становится уже критично.
Это если мы не затрагиваем мобильные приложения. Где ситуации еще сложнее.

ну смотрите. делаем майн. у нас есть блок. этот блок можно положить в слот, слот имеет ссылку на сам блок(чтобы получать технические характеристики) и количество блоков в слоте. мы совершили оплошность, наш блок текет каждый раз когда мы перекладываем его или убираем из сумки или кладем в сундук(сделали универсальный метод перемещения, который должен удалять блок в старом месте, и создавать в нужном формате в новом). стак блоков 64 шт... для этого выделим байт на хранение. через сколько времени мы увидим утечку? в больших компаниях большие утечки находят "быстро" а мелкие забивают дополнительным гигом оперативки... в инди - утечкой обычно начинают заниматься когда кол-во гневных игроков слишком велико, и они портят статистику...

Razor89 писал(а):По поводу метода расширения 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
Они что, сами себе противоречат?))

я точно помню что где-то эту инфу читал. вроде даже в их старой документации... потому что практически сразу стал писать свои дестрои...
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение Razor89 24 июн 2021, 12:38

хороша ложка к обеду. без спорно что надо к каждой ситуации подходить отдельно... но вот я порой сижу, принимаю кандидатов... они порой такие перлы отыгрывают - прям страшно становится... и обучают их подобным "фишкам" всякие ютуберы... а порой подобные мелочи видишь в курсах юнитеков, и вообще больно становится...

На самом деле не всегда играет роль "кто обучает", может обучать нереальный спец в своем деле, но как и в других вещах в жизни, нарабатывая опыт, ты начинаешь понимать суть того, как это в принципе своем должно работать. По началу многие вещи могут интерпретироваться неправильно в твоем сознании. Не смотря на багаж теоретических и даже некоторых практических знаний, человек может делать вообще все неправильно. Ведь каждая ситуация уникальна, и в каждой ситуации можно действовать по разному. Кодинг это в том числе творчество. С опытом до многих вещей сам доходишь. Далеко не все важное рассказывают в тех же курсах, или в школах, это даже не 50% того, что нужно знать и уметь. Ведь вся соль в конкретных нетипичных ситуациях, для которых не придумали шаблонное поведение. Это и есть скилл по сути, как мне кажется. Когда в непредвиденной ситуации человек делает все правильно. Ну, ютуберы, это вообще отдельная тема. На самом деле про это можно много разговаривать, это сродни философии.

в больших компаниях большие утечки находят "быстро"
в инди - утечкой обычно начинают заниматься когда кол-во гневных игроков слишком велико, и они портят статистику...

Я бы с этим поспорил на самом деле, это смешно, но мне известно много проектов, которые выпускают в релиз с неадекватными косяками и потом долго и муторно фиксят, оптимизируют. Среди таких и крупные проекты от больших компаний.
В современном инди, мне кажется вообще никто глобально оптимизацией как таковой и не занимается, в общем-то)) А многие как я недавно узнал, вообще на блюпринтах целые игры делают. :)) Я когда глянул в код блюпринтов, немного опешил. Провести правильную оптимизацию, и нанять нормальных специалистов это дорого, бизнес так устроен, что все хотят дешево и быстро. А инди хорошее подспорье для того чтобы каждый месяц стрелять проектами-однодневками не особо беспокоясь о качестве, аргументируя, что это инди продукт. Возможно кто то не согласится, и наверно все не так однозначно разумеется. Но тем не менее это имеет место быть.
Razor89
UNец
 
Сообщения: 14
Зарегистрирован: 15 июн 2014, 18:08

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение TeslaGan 24 июн 2021, 12:55

Razor89 писал(а):
хороша ложка к обеду. без спорно что надо к каждой ситуации подходить отдельно... но вот я порой сижу, принимаю кандидатов... они порой такие перлы отыгрывают - прям страшно становится... и обучают их подобным "фишкам" всякие ютуберы... а порой подобные мелочи видишь в курсах юнитеков, и вообще больно становится...

На самом деле не всегда играет роль "кто обучает", может обучать нереальный спец в своем деле, но как и в других вещах в жизни, нарабатывая опыт, ты начинаешь понимать суть того, как это в принципе своем должно работать. По началу многие вещи могут интерпретироваться неправильно в твоем сознании. Не смотря на багаж теоретических и даже некоторых практических знаний, человек может делать вообще все неправильно. Ведь каждая ситуация уникальна, и в каждой ситуации можно действовать по разному. Кодинг это в том числе творчество. С опытом до многих вещей сам доходишь. Далеко не все важное рассказывают в тех же курсах, или в школах, это даже не 50% того, что нужно знать и уметь. Ведь вся соль в конкретных нетипичных ситуациях, для которых не придумали шаблонное поведение. Это и есть скилл по сути, как мне кажется. Когда в непредвиденной ситуации человек делает все правильно. Ну, ютуберы, это вообще отдельная тема. На самом деле про это можно много разговаривать, это сродни философии.

нереальный спец в своем деле будет обучать плохо... потому что что для него легко и тривиально(что он может пропустить) для другого окажется непосильной задачей. обучать должны педагоги, которые знают как надо стартовать, чтобы ученик смог начать впитывать информацию. да все задачи уникальны. но у каждой задачи есть что-то общее. и ты должен уметь интерполировать общее на частности... сколько я собеседований проводил, я всегда пытался увидеть способности человека. когда мне говорят что вот я это сделал так, потому что там-то было написано/показано/прослушано/еще что-то... ну хорошо. для их задачи это имеет смысл. а тебе зачем это?! другое дело если говорят что мне скажут что я не до конца знаю что тут, я поступил так, потому что так научился... но готов переучиться... и таких я чаще беру. мне порой какого-нибудь кутешника проще взять, чем шарписта....

Razor89 писал(а):Я бы с этим поспорил на самом деле, это смешно, но мне известно много проектов, которые выпускают в релиз с неадекватными косяками и потом долго и муторно фиксят, оптимизируют. Среди таких и крупные проекты от больших компаний.

потому в кавычках. сам бывало кранчил по 200 часов(с перерывами) найти какой-то смешной баг... но как раз такие баги выискивать приходится... и приходится кранчить для этого... мысль была в том, что современное железо слишком неоптимизированно используют... и искать какую-то утечку памяти, которая проявляется скажем через час - начнут те, кому она начнет приносить дискомфорт...
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение TeslaGan 24 июн 2021, 13:09

Razor89 писал(а):Тут дословно написано, что при удалении объекта, удаляются и любые компоненты, как тогда можно получить доступ к ссылке которая находится "внутри компонента", если компонента не существует, ссылка автономно в памяти сосуществует от компонента с которым связана поэтому не удаляется? Но, каким образом тогда данные по этой ссылке можно было получить? Это реально попахивает бредом, как написали выше.
Это отсылка к видео которое продемонстрировал 1max1
Я ни разу такой информации не читал до сегодняшнего дня, и ни от кого не слышал, что Destroy не уничтожает ссылки и компоненты.
Может все-таки не в Update нужно производить удаление?
Как я до этого писал, в примере 1max1 мог быть конфликт GC.

сегодня проверил. к сожалению нет возможности, снять видео, но можете и сами подкинуть чистый проект
Синтаксис:
Используется csharp
using UnityEngine;
using UnityEngine.EventSystems;

public class ScriptOne : MonoBehaviour, IPointerClickHandler
{
    public ScriptTwo Target;
    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log(Target.Sum());
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Destroy(Target.gameObject);
            Destroy(Target);
        }
    }
}
using UnityEngine;

public class ScriptTwo : MonoBehaviour
{
    public int A = 1;
    public int B = 2;

    public int Sum()
    {
        return A + B;
    }
}

и все работает. использую события для обработки данных.
еще раз GC - инструмент языка который высвобождает ненужные ресурсы. как ему определить что этот ресурс не нужен? достаточно удалить все ссылки на объект. но как понять что эта ссылка нужна, а вот та нет - сам программист должен это делать... потому что м.б. вы хотите удалить объект, но оставить на него ссыль, чтобы в конце раунда показать самого сильного монстра... и как языку понять кого удалять, кого нет? а если ссылка есть - ну ок, возможно это тело еще пригодится, и GC его пропускает... а вопрос про хранение ссылок озвученный ранее - есть ссылки на неуправляемые ресурсы... например мы грузим данные из бд... как тогда систематизировать линки? а ведь это одна из проблем с которой стараются боротся уже продолжительное время...
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение Alkos26Rus 24 июн 2021, 13:25

TeslaGan писал(а):еще раз GC - инструмент языка который высвобождает ненужные ресурсы. как ему определить что этот ресурс не нужен? достаточно удалить все ссылки на объект. но как понять что эта ссылка нужна, а вот та нет - сам программист должен это делать... потому что м.б. вы хотите удалить объект, но оставить на него ссыль, чтобы в конце раунда показать самого сильного монстра... и как языку понять кого удалять, кого нет? а если ссылка есть - ну ок, возможно это тело еще пригодится, и GC его пропускает... а вопрос про хранение ссылок озвученный ранее - есть ссылки на неуправляемые ресурсы... например мы грузим данные из бд... как тогда систематизировать линки? а ведь это одна из проблем с которой стараются боротся уже продолжительное время...

Что значит как определить, это уже разработчикам юнити видней, объект удален - значет все ячейки которые были выделены под него должны быть очищены. Я его для этого и удаляю, потому что он мне нафиг не нужен, любые последующие ссылки на него должный выдавать ошибку, иначе это полная хрень, которая будет только баги плодить, так как ошибка не будет выдаваться там где она должна быть. Что значит как показать самого сильного монстра? Ну не удаляй объект со статистикой и все, в чем проблема? А если уж удалил, то это уже твои проблемы, здесь то уж точно разработчик должен решать что удалять, а что нет.
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение Razor89 24 июн 2021, 13:37

мысль была в том, что современное железо слишком неоптимизированно используют... и искать какую-то утечку памяти, которая проявляется скажем через час - начнут те, кому она начнет приносить дискомфорт...

Так и есть.

я поступил так, потому что так научился... но готов переучиться.

Ну это конечно все тоже относительно и не всегда правильно, раньше я презирал некоторые паттерны, пока сам не пришел к тому, что они действительно облегчают жизнь и абсолютно правильным их использовать.
Все от конкретной ситуации зависит в конечном итоге.

когда мне говорят что вот я это сделал так, потому что там-то было написано/показано/прослушано/еще что-то

Да, отчасти это лишь означает, что человек сам не до конца понимает почему нужно делать именно так.

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

сегодня проверил. к сожалению нет возможности, снять видео, но можете и сами подкинуть чистый проект

Да, я посмотрю, потестирую еще некоторые свои варианты. Когда будет свободное время на днях, и возможно напишу что-то еще по этому поводу.

Что значит как определить, это уже разработчикам юнити видней, объект удален - значет все ячейки которые были выделены под него должны быть очищены.

Именно, я про это и писал, что у Unity немного другая специфика работы с языком, и даже свой собственный GC. Поэтому конечно некоторые моменты совсем не очевидны.
Когда идет прямая команда Destroy, логично удалять абсолютно все, что связано с объектом. На самом деле не смотря на все озвученные аргументы ранее, это достаточно странно. Я бы понял такой избирательный подход в с++, когда разработчик вручную удаляет все объекты, ссылки и прочее, но тут ведь специфика работы.... и язык...не особо располагают даже по своей философии, чтобы постоянно смотреть за всем даже после вызова команды которую нельзя никак по другому интерпретировать логический, кроме как "удалить это". Destroy по всей логике означает именно удаление, которое распространяется на все дочерние объекты и компоненты, что идет в разрез с действительностью, как оказывается.

потому что м.б. вы хотите удалить объект, но оставить на него ссыль, чтобы в конце раунда показать самого сильного монстра..

А как потом получить этот объект по ссылке в памяти, если его уже не существует) В этом случае ссылка должна возыметь была статус null reference и не должна была продолжать указывать на объект, которого нет. В ином случае, получается гораздо примитивнее, объект просто не будет удален, судя по всему.
Razor89
UNец
 
Сообщения: 14
Зарегистрирован: 15 июн 2014, 18:08

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение TeslaGan 24 июн 2021, 14:13

Alkos26Rus писал(а):
TeslaGan писал(а):еще раз GC - инструмент языка который высвобождает ненужные ресурсы. как ему определить что этот ресурс не нужен? достаточно удалить все ссылки на объект. но как понять что эта ссылка нужна, а вот та нет - сам программист должен это делать... потому что м.б. вы хотите удалить объект, но оставить на него ссыль, чтобы в конце раунда показать самого сильного монстра... и как языку понять кого удалять, кого нет? а если ссылка есть - ну ок, возможно это тело еще пригодится, и GC его пропускает... а вопрос про хранение ссылок озвученный ранее - есть ссылки на неуправляемые ресурсы... например мы грузим данные из бд... как тогда систематизировать линки? а ведь это одна из проблем с которой стараются боротся уже продолжительное время...

Что значит как определить, это уже разработчикам юнити видней, объект удален - значет все ячейки которые были выделены под него должны быть очищены. Я его для этого и удаляю, потому что он мне нафиг не нужен, любые последующие ссылки на него должный выдавать ошибку, иначе это полная хрень, которая будет только баги плодить, так как ошибка не будет выдаваться там где она должна быть. Что значит как показать самого сильного монстра? Ну не удаляй объект со статистикой и все, в чем проблема? А если уж удалил, то это уже твои проблемы, здесь то уж точно разработчик должен решать что удалять, а что нет.

так. еще раз. у вас есть финалайз и деспоз. с помощью них, руками можно удалить все, что надо и что не надо... и даже GC вам не понадобится. просто переопределяете один из них, делаете остановку всех ядер и процессов. очищаете все поля и линки... и все. объекта не существует. но это муторно. для каждого класса то писать все это. для этого у нас есть GC который занимается тем же самым. просто берет и удаляет все выше перечисленное. но у GC есть одно условие - надо удалить все ссылки на удаляемый объект. и ладно если у нас только ссылки из пространства управляемых ресурсов, у нас есть и не управляемые ресурсы... которые читаются непонятно где, непонятно как(понятно, но не будем вдаваться в подробности)... потому мне кажется и нет такого супер решения как Destroy.... в чистом шарпе даже финализаторы сделалали разного рода, чтобы очищать ресурсы... или вы предлагаете каждый раз удаляя объект проверять все возможные решения по их удалению? но тогда мы упремся в стенку производительности процессора
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение TeslaGan 24 июн 2021, 14:16

Razor89 писал(а):А как потом получить этот объект по ссылке в памяти, если его уже не существует) В этом случае ссылка должна возыметь была статус null reference и не должна была продолжать указывать на объект, которого нет. В ином случае, получается гораздо примитивнее, объект просто не будет удален, судя по всему.

это был лишь пример. который говорит о том, что нет универсального решения, которое бы позволило любой объект удалить безвозвратно... точнее он есть. называется напиши свой диспоз/финализатор/дестрой... и у тебя все будет работать как надо.
Последний раз редактировалось TeslaGan 24 июн 2021, 14:27, всего редактировалось 1 раз.
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: Unity пересоздает объекты, но не обновляет ссылки

Сообщение TeslaGan 24 июн 2021, 14:26

Razor89 писал(а):
Что значит как определить, это уже разработчикам юнити видней, объект удален - значет все ячейки которые были выделены под него должны быть очищены.

Именно, я про это и писал, что у Unity немного другая специфика работы с языком, и даже свой собственный GC. Поэтому конечно некоторые моменты совсем не очевидны.
Когда идет прямая команда Destroy, логично удалять абсолютно все, что связано с объектом. На самом деле не смотря на все озвученные аргументы ранее, это достаточно странно. Я бы понял такой избирательный подход в с++, когда разработчик вручную удаляет все объекты, ссылки и прочее, но тут ведь специфика работы.... и язык...не особо располагают даже по своей философии, чтобы постоянно смотреть за всем даже после вызова команды которую нельзя никак по другому интерпретировать логический, кроме как "удалить это". Destroy по всей логике означает именно удаление, которое распространяется на все дочерние объекты и компоненты, что идет в разрез с действительностью, как оказывается.

тут скорее ошибка термина. и его описания в документации... Destroy - попытка высвободить объект от внутренних элементов и контролеров юнити как я понимаю... но вот еще один пример. работа с сокетами. мы отправили запрос, и ждем ответ. а соединение у нас по модему, а надо выкачать из базы целого персонажа, с его эквипом, сумками и прочим... игроку это надоедает, и он идет в сингл... обычный разработчик просто создаст кастомный метод OnDestroy который прервет соединение и закроет порт. вы же предлагаете чтобы в Destroy была уже встроена поддержка портов? ну так, на всякий... а если мы используем стримы? еще и стримы надо в дестрой запихнуть? зачем все это, если у нас есть программист, который может выбрать те элементы, которые необходимы в его задаче....
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Пред.След.

Вернуться в Почемучка

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

Сейчас этот форум просматривают: Google [Bot] и гости: 27