Созданные экземпляры класса не освобождаются при выходе из области видимости, не могу вдуплить почему так? Стандартный 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
Ну и да, утверждать что лаги вызваны тем что объекты остаются в памяти это бред и гадание на кофейной гуще. Делайте слабую ссылку и проверяйте после того как сработал сборщик мусора что эта ссылка перестала вести к объекту, если хотите проверить удаляются ли объекты. То что сейчас больше нельзя вызвать сборку мусора вручную, это отдельная тема...
Но тут важно заметить, код выполняется вне виртуальной машины.