Созданные экземпляры класса не освобождаются при выходе из области видимости, не могу вдуплить почему так? Стандартный Lua код, везде работает а в warcraft'e проблема.
.если заменять объявление класса на численную переменную то работает всё нормально
myClass = {}
function myClass:new( )
local obj = {}
obj.x = 0.0
obj.y = 0.0
obj.z = 0.0
setmetatable(obj, self)
self.__index = self
return obj
end
function loop()
for i = 1, 9000 do
local a = myClass:new() --- <<<< переменная а навсегда остается в памяти
end
end
function init()
initTrg = CreateTrigger( )
TriggerRegisterTimerEventPeriodic( initTrg, 0.01 )
TriggerAddAction( initTrg, loop )
end
Принятый ответ
- Есть небольшой нюанс - сборщик мусора собирает мертвые объекты когда их количество достигло критического уровня, а не когда они выходят из области видимости. Возможно, что-то мешает ему успешно собрать мусор, например создание 900 тысяч новых объектов в секунду.
- Попробуй нормальный таймер вместо периодик триггера, периодик триггеры известны своей лагучестью.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Ред. prog
Спасибо работает, теперь использую TimerStart(...)
Ред. Ельнур
Ред. Зелёный ёж
запускаю этот же код из C++, работает всё нормально
Не помогает, делал даже что-то вроде деструктора
function myClass:delete()
self.x = nil
self.y = nil
self.z = nil
end
тоже не вышло
Ред. ScorpioT1000
Ред. prog
Ну и да, утверждать что лаги вызваны тем что объекты остаются в памяти это бред и гадание на кофейной гуще. Делайте слабую ссылку и проверяйте после того как сработал сборщик мусора что эта ссылка перестала вести к объекту, если хотите проверить удаляются ли объекты. То что сейчас больше нельзя вызвать сборку мусора вручную, это отдельная тема...
Но тут важно заметить, код выполняется вне виртуальной машины.
Ред. Зелёный ёж
Лаги были из-за того что память кончилась.
Дело не в таймере, пробовал и без него.
С помощью этого кода выяснилось что сборщик не успевает запуститься если плодить много объектов
и выяснилась что чем меньше объектов создаю тем чаще он вызывается
Вывод который я сделал: не стоит больше заниматься такой ерундой :D
Это не сильно точно, ибо я не смотрел поведение в других картах.... и проверял я это чисто визуально, на втором мониторе открыт диспетчер задач