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

  1. Есть небольшой нюанс - сборщик мусора собирает мертвые объекты когда их количество достигло критического уровня, а не когда они выходят из области видимости. Возможно, что-то мешает ему успешно собрать мусор, например создание 900 тысяч новых объектов в секунду.
  2. Попробуй нормальный таймер вместо периодик триггера, периодик триггеры известны своей лагучестью.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
24
  1. Есть небольшой нюанс - сборщик мусора собирает мертвые объекты когда их количество достигло критического уровня, а не когда они выходят из области видимости. Возможно, что-то мешает ему успешно собрать мусор, например создание 900 тысяч новых объектов в секунду.
  2. Попробуй нормальный таймер вместо периодик триггера, периодик триггеры известны своей лагучестью.
Принятый ответ
7
com23:
prog:
Спасибо работает, теперь использую TimerStart(...)
да и я теперь не буду использоваьт триггеры для таймера а просто таймер функции
9
Поторопился я немного с ответом... вообщем проблема всё еще актуальна :D
запускаю этот же код из C++, работает всё нормально
29
Мне вот интересно, обнуляется ли переменная 'a', если она локальная, может тут есть подвох, и нужно ставить после 'local a = my:Class:new()' 'a = nil'. Или не помогает обнуление a после его объявление и принятия созданного для него класса?
9
KingMaximax:
Не помогает, делал даже что-то вроде деструктора
function myClass:delete()
self.x = nil
self.y = nil
self.z = nil
end
тоже не вышло
9
Неужели нету шарящих в луа? кто то же должен знать как это побороть...
Этот комментарий удален
38
У меня память сильно не росла, когда я плодил векторы

Проверить можно в демо карте к inputMovement
24
Рекомендую засечь сколько времени занимает один запуск этого девятитысячного цикла, просто на случай если по каким-то причинам это занимает дольше чем 0.01 секунды.
Ну и да, утверждать что лаги вызваны тем что объекты остаются в памяти это бред и гадание на кофейной гуще. Делайте слабую ссылку и проверяйте после того как сработал сборщик мусора что эта ссылка перестала вести к объекту, если хотите проверить удаляются ли объекты. То что сейчас больше нельзя вызвать сборку мусора вручную, это отдельная тема...

запускаю этот же код из C++, работает всё нормально
Подробнее. Как запускаете? Где запускаете? Откуда у вас в C++ варовский таймер или периодик триггер, чтобы там можно было бы запустить именно этот код, а не похожий?
32
prog, xgm.guru/p/wc3/anyscript
Но тут важно заметить, код выполняется вне виртуальной машины.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.