Сейчас 05:31:53 Пятница, 27 декабря, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Вопрос] Динамическое создание и уничтожение триггеров.
kapa6acvlkДата: Четверг, 28 Июня 2012, 17:59:59 | Сообщение # 1
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
Как создать триггер, знают все, а вот как его удалить? Хватить ли следующих трех действий, чтобы полостью разрушить и удалить триггер?
Возникли сомнения на этот счет, где-то на англоязычном форуме читал, что в памяти все равно остаются ошметки и полного удаления триггера не происходит.
Code
          call TriggerRemoveCondition(trigger, triggercondition)
          call TriggerRemoveAction   (trigger, triggeraction)                    
          call DestroyTrigger        (trigger)



Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна.
© Александр Зорич
 

SirNikolasДата: Четверг, 28 Июня 2012, 18:14:16 | Сообщение # 2
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Вот здесь FkoFF доказывает, что "ошметки" остаются. Спустя год был проведен второй тест, показавший, что триггеры каким-то мистическим образом все-таки удаляются.
В общем, рекомендуется юзать динамические триггеры по минимуму или не использовать их вовсе.

Добавлено (28 Июнь 2012, 18:14:16)
---------------------------------------------
По теме - да, в теории эти три действия действительно должны освободить память. Ну, естественно, надо еще локалки обнулить.


 

maddroneДата: Суббота, 27 Апреля 2013, 16:20:59 | Сообщение # 3
1 уровень
Группа: Пользователи
Сообщений: 8
Награды: 0
Репутация: 0
Блокировки:
Тестировал динамические триггеры.
Код

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 от утечек не спасает.
Проверял этим же тестом.
 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz