TeslaGan писал(а):Razor89 писал(а): Думаю это все-же баг Unity, а не мои кривые руки, ведь сборщик должен был по идее следить за этим в том числе. Он посчитал, что объект используется даже после фактического уничтожения вместе со сценой, из за того, что на одну из функций скрипта на объекте висит привязка к событию, и в памяти явно что-то багануло, и большую часть массивов связанных с этим объектом в сцене он попросту удалять не стал и все ссылки продолжали вести на уже якобы несуществующие объекты сцены. А у Unity сборщик мусора кастомный, который отличается от сборщика для c# по умолчанию, насколько мне известно.
ну да, ну да... скажите что еще c# ГК умел зомби-объекты убивать... это когда есть 2/3/несколько объектов с взаимными ссылками.... и которые живут вечно(до закрытия приложения), потому что ссылаются друг на друга...
да, в шарпе есть прекрасный инструмент по очистке неиспользуемых ресурсов(Гарбидж коллектор), но даже он не умеет читать мысли программиста. как он может понять нужен тебе этот класс или нет? ссылка есть, значит она что-то значит. плевать что там круговая порука, и они ссылаются друг на друга.... и как раз твоя задача простая... всего то ссылки удалять... и так работают многие ГК, не считая тех, которые пытаются анализировать связи, и прочую фигню...
Как понять что мне этот класс не нужен? Очень просто, когда удаляется объект(GameObject) в Unity, вместе с ним удаляются все закрепленные за ним классы, если они не DontDestroyOnLoad и подписки должны автоматом слетать. Или хотя-бы об этом можно писать в консоль.
В моем случае, как я выяснил из тестов, Unity не удалял из памяти даже gameobject на котором висел этот скрипт с открытой подпиской на событие.
Если мы используем UnityEvents, то для них справедливо удаляются все ссылки, насколько я это представляю, еще ни разу с ними проблем не было из за отписок. С Action такая проблема существует, хотя по сути это одно и то-же и по идее можно их приравнивать к стандартным событиям Unity и при сборке мусора удалять ненужные связи, чтобы подобных ситуаций не было. В данном случае отследить точно, что класс больше не нужен, мы вполне можем.
Даже если отмести все что я написал ранее, когда Unity пытается удалить GameObject, но не удаляет его из памяти фактический, об этом тоже можно писать в консоль, проинформировать "что-то не так", а не молчать и ссылки на рефы оставлять даже после перезагрузки. Кроме багов, это еще черевато переполнением физической памяти устройства. У меня почти неделя ушла в никуда из за глупой "ошибки".
ps Зомби объекты, это все-же немного другое...в нашем случае поступала явная команда Destroy для обьекта(это прямая команда которую невозможно по другому интерпретировать как-то и когда сцена выгружается команда поступает на все объекты), которая должна была за собой последовать удаление всех классов, логический. В моем понимании это аксиома которая в данном случае была нарушена. В ином случае получается противоречие параметру DontDestroyOnLoad, то есть мы не удаляем не только объекты DontDestroyOnLoad, но и еще если посчитаем, что их не нужно удалять, даже если была прямая команда Destroy.