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

Ничего не обнуляй оставь всё как есть - лучший вариант, сборщик всё приберёт.
Для наглядности я запускал диспетчер задач во втором окне и варик примерно по 500 мегабайт памяти уничтожает как только у него мусорка заполниться, по ну грубо говоря размер процесса прыгает от 1200 до 1700 никогда больше и никогда меньше, сборка мусора происходит по достижению лимита "засраной памяти"
.
но это всё не точно, скорее всего там гибридный алгоритм, либо по времени либо по объёму, либо по числу ссылок, или вообще его нет
`
ОЖИДАНИЕ РЕКЛАМЫ...
33
Ничего не обнуляй оставь всё как есть - лучший вариант, сборщик всё приберёт.
Для наглядности я запускал диспетчер задач во втором окне и варик примерно по 500 мегабайт памяти уничтожает как только у него мусорка заполниться, по ну грубо говоря размер процесса прыгает от 1200 до 1700 никогда больше и никогда меньше, сборка мусора происходит по достижению лимита "засраной памяти"
.
но это всё не точно, скорее всего там гибридный алгоритм, либо по времени либо по объёму, либо по числу ссылок, или вообще его нет
Принятый ответ
38

Если юнит не разлагается, то сразу же как умирает (поистечение времени смерти в параметрах юнита) значение в ячейки Хеш таблицы сразу же принимает значение null. ТО есть, ссылки из Хеш таблицы не учитываются. Вернее, после проведения более точного эксперимента, значение юнита в Хеш таблице сразу же обнолвется на null (не очищается, а заменяется значением null) после обработки гибели юнита (если он не разлагается; для разлагающихся - это произойдёт после разложения; или при вызове функции RemoveUnit), приэтом я специально оставил ссылку на юнита в отдельной переменной - так вот там юнит стал "безымянным", но id сохранился - значит варик сам обрабатывает ячейки Хеш таблицы с уничтожаемыми объектами и присваивает им значение null, несмотря на то, что на эти объекты могу быть ссылки из других переменных. И это даже без вызова RemoveUnit
Но в lua же за сами переменные так париться не надо - обнуляются они при окончании ссылок на них + вызове gc
24
сборщик всё приберёт.
Не все. Какраз хранящееся по хендлу в глобальной таблице он сам не приберет - нужно подчищать т.к. для сборщика мусора хендл это просто число. Автор вопроса вкладывает какой-то странный смысл в слово "локалка".
8
prog:
сборщик всё приберёт.
Не все. Какраз хранящееся по хендлу в глобальной таблице он сам не приберет - нужно подчищать т.к. для сборщика мусора хендл это просто число. Автор вопроса вкладывает какой-то странный смысл в слово "локалка".
Я использую локалки вместо глобалок, обьявленные локали находятся в верху всего когда, и по надобности устанавливаются...Суть в том, что хендл юнита у каждого юнита свой, мало ли если юнит умирает и появляется другой юнит с таким же хендлом и старые данные действуют на нового юнита....
Чтобы оставить комментарий, пожалуйста, войдите на сайт.