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

Принятый ответ

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

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