Тестировал динамические триггеры.
Код
function c takes nothing returns boolean
return true
endfunction
function a takes nothing returns nothing
call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, "Damage done")
endfunction
function LeakTest_Actions takes nothing returns nothing
local integer i = 1
local trigger MobTakingDamageTrigger
local triggercondition cond
local triggeraction act
loop
exitwhen i > 500
//======== Paste Code Here ============
set MobTakingDamageTrigger = CreateTrigger()
call TriggerRegisterUnitEvent( MobTakingDamageTrigger, GetLastCreatedUnit(), EVENT_UNIT_DAMAGED )
set cond = TriggerAddCondition( MobTakingDamageTrigger, Condition( function c ) )
set act = TriggerAddAction( MobTakingDamageTrigger, function a )
call TriggerRemoveAction(MobTakingDamageTrigger, act)
call TriggerRemoveCondition(MobTakingDamageTrigger, cond)
call DestroyTrigger(MobTakingDamageTrigger)
//=====================================
set i = i + 1
endloop
endfunction
//===========================================================================
function InitTrig_LeakTest takes nothing returns nothing
set gg_trg_LeakTest = CreateTrigger()
call TriggerRegisterTimerEventPeriodic( gg_trg_LeakTest, 0.10 )
call TriggerAddAction( gg_trg_LeakTest, function LeakTest_Actions )
endfunction
Каждую секунду создаётся и удаляется 5000 триггеров.
В итоге, да, этих трёх строк достаточно. Память не течет, варкрафт стабилен в оперативке, хотя нагрузка на проц в игре чувствуется.
Если убрать строки
Код
call TriggerRemoveAction(MobTakingDamageTrigger, act)
call TriggerRemoveCondition(MobTakingDamageTrigger, cond)
сразу виден эффект, оперативка улетает мегабайтами в секунду.
TriggerClearActions и TriggerClearConditions от утечек не спасает.
Проверял этим же тестом.