Trigger - Add new Event
|
|
FatalBlade | Дата: Пятница, 22 Июля 2011, 16:00:10 | Сообщение # 1 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Возможно ли что триггерное добавление события в триггер вызывает утечки и в итоги сильные лаги? Дело в том что у меня у одного из героев есть скилл, что он активирует ауру, и с этого момента на протяжение 60 секунд, каждая еденица урона по героя подсчитывается. Урон накапливается до определённого максимума (зависит от лвла скилла). С помощью другого скилла, герой наносит столько урона по врагу, сколько накопил с помощью ауры. Понятно что это сделано с помощью добавления события в триггер. Так вот я попробовал потестить этого героя, и после 30-40 минут с игры ним,игра начала лагать. Самое интересно что не вся карта, а только то что вокруг героя. Т.е. если герой в поле зрения камеры, начинаются лаги. Если я отведу камеру чуть подальше от героя, так что бы не видеть его, игра играет нормально. В чём может быть утечка? Я всё проверял, всё чистил.
|
|
|
|
FkoFF | Дата: Пятница, 22 Июля 2011, 16:08:02 | Сообщение # 2 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| FatalBlade, рекомендую выложить тот триггер, где способность добавляет событие, и где это событие работает.
Вообще, были ли тормоза до этого?
|
|
|
|
FatalBlade | Дата: Пятница, 22 Июля 2011, 16:24:21 | Сообщение # 3 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Не было. Тормозит только с этим героем и только если после 15-20 раз как он использовал эту абилку. Проблема лишь в том, что вся эта система состоит из 2-х абилок 6-и триггеров.
Вот триггер где способность добавляет событие: Code Suffer Events Unit - A unit Starts the effect of an ability Conditions (Ability being cast) Equal to Suffer Butcher Actions Set Suffer_Unleash_Counter = (Suffer_Unleash_Counter + 1.00) Set Suffer_Unleash = 0.00 Set SufferCaster = (Casting unit) Set SufferLevel = (Level of Suffer Butcher for SufferCaster) Set Suffer_Active = True Player - Disable Suffer Butcher for (Owner of SufferCaster) If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions (SufferCaster is in SufferCheckGroup) Equal to False Then - Actions Trigger - Add to Suffer Take <gen> the event (Unit - SufferCaster Takes damage) Unit Group - Add SufferCaster to SufferCheckGroup Else - Actions
Wait 60.00 seconds Player - Enable Suffer Butcher for (Owner of SufferCaster) Unit Group - Remove all units from SufferCheckGroup Custom script: call DestroyGroup(udg_SufferCheckGroup) Set SufferCaster = No unit Custom script: call RemoveUnit(udg_SufferCaster) Set Suffer_Unleash = 0.00 Special Effect - Destroy Suffer_Max Trigger - Turn off Unleash Ready <gen> Floating Text - Destroy Unleash_Ready_Text Set Suffer_Active = False Добавлено (22-07-2011, 16:24) --------------------------------------------- Вот триггер в который добавляется событие:
Code Suffer Take Events Conditions Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions And - All (Conditions) are true Conditions Suffer_Unleash Greater than or equal to Suffer_Damage (Damage taken) Greater than 0.00 Suffer_Active Equal to True Then - Actions Set Suffer_Unleash = Suffer_Damage Sound - Play AbominationYesAttack1 <gen> at 100.00% volume, attached to SufferCaster Trigger - Turn on Unleash Ready <gen> Else - Actions If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions And - All (Conditions) are true Conditions (Damage taken) Greater than 0.00 Suffer_Active Equal to True Then - Actions Set Suffer_Unleash = (Suffer_Unleash + ((Damage taken) / Suffer_Unleash_Counter)) Else - Actions If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions And - All (Conditions) are true Conditions (Damage taken) Greater than 0.00 Suffer_Active Equal to True Then - Actions Special Effect - Create a special effect attached to the chest of SufferCaster using Abilities\Spells\Other\Stampede\StampedeMissileDeath.mdl Wait 0.10 seconds Special Effect - Destroy (Last created special effect) Else - Actions
|
|
|
|
lawson | Дата: Пятница, 22 Июля 2011, 16:27:35 | Сообщение # 4 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| FatalBlade, В триггере активируешь еще один триг который будет подсчитывать урон. В нем делаешь условие если твой накопленный урон равен == твое число, то при последующей атаке героя нанести его. Можно делать через хеш, но я думаю через глобалку тебе будет легче. У меня карте есть примерно такой скилл но ты там врятли разберешься.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Пятница, 22 Июля 2011, 16:28:34 |
|
|
|
FatalBlade | Дата: Пятница, 22 Июля 2011, 16:38:07 | Сообщение # 5 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| lawson, Я знаю как это делать. У меня уже давным давно всё сделано. У меня всё так и работает. И прекрасно работает. Проблема в том, что у меня гдето есть утечка. При лагает не всё карта, а только то что возле героя.
|
|
|
|
lawson | Дата: Пятница, 22 Июля 2011, 16:39:32 | Сообщение # 6 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| FatalBlade, Потому что использование гуи это уже утечка!!! А на счет евента не знаю так как его в коде не нашел.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Пятница, 22 Июля 2011, 16:39:48 |
|
|
|
FatalBlade | Дата: Пятница, 22 Июля 2011, 16:49:40 | Сообщение # 7 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Trigger - Add to Suffer Take <gen> the event (Unit - SufferCaster Takes damage)
|
|
|
|
lawson | Дата: Пятница, 22 Июля 2011, 16:51:02 | Сообщение # 8 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| FatalBlade, Чтобы триггеры не собирались в кучу так как ты их периодически создаешь, надо их удалять после действия.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
FatalBlade | Дата: Пятница, 22 Июля 2011, 16:58:29 | Сообщение # 9 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (lawson) Чтобы триггеры не собирались в кучу так как ты их периодически создаешь, надо их удалять после действия. Ок. Как? Какая функция это делает?
|
|
|
|
lawson | Дата: Пятница, 22 Июля 2011, 17:04:11 | Сообщение # 10 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (FatalBlade) Какая функция это делает? call DestroyTrigger(GetTriggeringTrigger())
Добавлено (22-07-2011, 17:01) --------------------------------------------- Но я не отвечаю за то что это уберет лаги, так как я не знаю как ты создаешь этот триг и как он работает.
Добавлено (22-07-2011, 17:04) --------------------------------------------- Тоесть если ты слздаещь за одну секунду 2 триггера при этом только один сработает(тоесть только один удалится), то второй триггер так и останется висеть в памяти изза этого начнутся оаги.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Пятница, 22 Июля 2011, 17:04:33 |
|
|
|
FatalBlade | Дата: Пятница, 22 Июля 2011, 19:17:14 | Сообщение # 11 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (lawson) call DestroyTrigger(GetTriggeringTrigger()) И это писать в триггере где создаётся событие или в триггере куда это событие добавляется?Добавлено (22-07-2011, 19:17) --------------------------------------------- lawson, Когда я триггерно удаляю какой то триггер, то после этого триггер просто удаляется (хехе ), т.е. для игры он больше не существует. А ведь у меня то не создаётся триггер, а всего лишь событие для него. Возможно ли как нибудь удалить событие созданное триггерно?
|
|
|
|
lawson | Дата: Пятница, 22 Июля 2011, 19:42:14 | Сообщение # 12 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| function Action takes nothing returns nothing BLA BLA BLA call DestroyTrigger(GetTriggeringTrigger()) - эта функция будет удалять триггер который создается в другом триггере и который не нуждается в повторном использовании!!! НЕ ТУПИ!!!! Удалится триггер который создал эту функцию тоесть удалится вот это call TriggerRegisterUnitEvent(t, unit, EVENT_UNIT_DEATH) и вот это call TriggerAddAction(t, function Action). Пфф я не знаю как тебе это объяснить. endfunction
function BB takes nothing returns nothing local trigger t = CreateTrigger() call TriggerRegisterUnitEvent(t, unit, EVENT_UNIT_DEATH) call TriggerAddAction(t, function Action) set t = null endfunction
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Пятница, 22 Июля 2011, 19:43:22 |
|
|
|
FatalBlade | Дата: Пятница, 22 Июля 2011, 19:44:13 | Сообщение # 13 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Вот как событие добавляется:
Code If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions (SufferCaster is in SufferCheckGroup) Equal to False Then - Actions Trigger - Add to SufferTake <gen> the event (Unit - SufferCaster Takes damage) Unit Group - Add SufferCaster to SufferCheckGroup Else - Actions
Через 60 секунд после активации абилка вырубается, а SufferCheckGroup очищается и удаляется, и если врубить абилку потом снова, то опять по вышеуказанному условию, в триггер SufferTake добавится событие. Пока абилка активна, она не доступна в панели абилок героя.
|
|
|
|
lawson | Дата: Пятница, 22 Июля 2011, 19:46:27 | Сообщение # 14 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| FatalBlade, Кароче слушай, я не знаю как тебе такое объяснить, я просто тебе скажу что не правильно создание триггера внутри другого триггера создает ОЧЕНЬ БОЛЬШУЮ УТЕЧКУ. Это главное. У меня на JASS не всегда выходит создать гладкий триггер внутри другого без утечек, а ты хочешь сделать это на гуи. Спроси у ФКОФА или у Фаиона они тебе правильный вариант скажут без утечек, остальное зависит от тебя поймешь ты это или нет.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Пятница, 22 Июля 2011, 19:47:30 |
|
|
|
FatalBlade | Дата: Пятница, 22 Июля 2011, 19:49:16 | Сообщение # 15 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Ок тогда где вот это call DestroyTrigger(GetTriggeringTrigger()) писать? В триггере где должен появиться новое событие, или там где оно создаётся?
|
|
|
|
lawson | Дата: Пятница, 22 Июля 2011, 19:51:08 | Сообщение # 16 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (FatalBlade) В триггере где должен появиться новое событие В том тригерре который ты создал из другого. Но я тебе говорю что он уменьшит лаги лишь на 50% а не избавит тебя от них на совсем.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
FatalBlade | Дата: Пятница, 22 Июля 2011, 19:58:35 | Сообщение # 17 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (lawson) В том тригерре который ты создал из другого. Но я тебе говорю что он уменьшит лаги лишь на 50% а не избавит тебя от них на совсем. Уже хорошо. У меня АОС. Сколько уже может длиться игра? 1.5 часа? Думаю хватит )
|
|
|
|
FkoFF | Дата: Суббота, 23 Июля 2011, 03:36:05 | Сообщение # 18 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| Special Effect - Create a special effect attached to the chest of SufferCaster using Abilities\Spells\Other\Stampede\StampedeMissileDeath.mdl Wait 0.10 seconds Special Effect - Destroy (Last created special effect)
по этому и лагает возле героя.Добавлено (23-07-2011, 03:36) ---------------------------------------------
Quote (FatalBlade) И это писать в триггере где создаётся событие или в триггере куда это событие добавляется? если разрушать триггер то в память утекут сразу две вещи - события триггера (не удаляются), условия триггера (не удаляются), действия триггера (не удаляются). Удалится только объект "триггер", который сам по себе не так много и весит (перечисленное выше удалить не возможно).
Quote (lawson) тоесть удалится вот это call TriggerRegisterUnitEvent(t, unit, EVENT_UNIT_DEATH) и вот это call TriggerAddAction(t, function Action не избавляет от утечки.
Quote (FatalBlade) Через 60 секунд после активации абилка вырубается, а SufferCheckGroup очищается и удаляется, и если врубить абилку потом снова, то опять по вышеуказанному условию, в триггер SufferTake добавится событие. Пока абилка активна, она не доступна в панели абилок героя. Таким образом в триггер добавится несколько раз (по количеству вызовов) - событие что твой мясник получил урон.
|
|
|
|
FatalBlade | Дата: Суббота, 23 Июля 2011, 12:32:02 | Сообщение # 19 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (FkoFF) Таким образом в триггер добавится несколько раз (по количеству вызовов) - событие что твой мясник получил урон. Ааа понял. Видимо надо НЕ УДАЛЯТЬ и НЕ ОБНУЛЯТЬ группу и юнита. Что если первый раз при использование этой абилки создать группу и добавить туда юнита (все равно герои выбираются только 1 раз, поэтому на карте может быть только 1 мясник)? Потом когда юнит уже будет в группе, и триггер будет это проверять, то он НЕ БУДЕТ добавлять событие в вспомогательный триггер, если юнит уже в группе. А раз то добавленное событие не удаляется, то он там уже будет на всю игру. Всего 1 событие. То что надо.
Quote (FkoFF) Special Effect - Create a special effect attached to the chest of SufferCaster using Abilities\Spells\Other\Stampede\StampedeMissileDeath.mdl Wait 0.10 seconds Special Effect - Destroy (Last created special effect) Неужто Wait припятствует удалению эффекта??? Дело в том что конкретно этот эффект (StampedeMissileDeath.mdl) почему то вообще не отображается изза удаления. А когда я сделал Wait то всё стало нормально. И это почему то именно с этим эффектом. Для остальных эффектов Special Effect - Create а потом сразу Special Effect - Destroy не припятствует отображению эффекта.Добавлено (23-07-2011, 12:32) --------------------------------------------- И кстати Code Bone Impact Necr Events Unit - A unit comes within 1000000000.00 of Dummy Center Map 0082 <gen> Conditions Actions Trigger - Add to (This trigger) the event (Unit - (Entering unit) Takes damage) If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions (Unit-type of (Damage source)) Equal to Necromancer Necro_Damage_Indicator Equal to True Then - Actions Set BoneDS = (Position of (Damage source)) Set BoneImpact = (BoneDS offset by 900.00 towards (Facing of (Damage source)) degrees) Sound - Play PossessionMissileHit1 <gen> at 100.00% volume, located at BoneImpact with Z offset 0.00 Custom script: call RemoveLocation(udg_BoneImpact) Custom script: call RemoveLocation(udg_BoneDS) Else - Actions
Почему этот триггер не вызывает лаги, хотя тут постоянно добавлется событие?
|
|
|
|
FkoFF | Дата: Суббота, 23 Июля 2011, 14:50:19 | Сообщение # 20 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| Quote (FatalBlade) Неужто Wait припятствует удалению эффекта??? Дело в том что конкретно этот эффект (StampedeMissileDeath.mdl) почему то вообще не отображается изза удаления. А когда я сделал Wait то всё стало нормально. И это почему то именно с этим эффектом. Для остальных эффектов Special Effect - Create а потом сразу Special Effect - Destroy не припятствует отображению эффекта. Неоднократно обсуждалась убогость вейтов. Да, действия после данного вейта не выполняются. Quote (FatalBlade) Почему этот триггер не вызывает лаги, хотя тут постоянно добавлется событие? Оно срабатывает а не добавляется. Добавление события к триггеру увеличивает размер триггера в памяти. Так что вообще, на самом деле, должен быть всего один триггер, который реагирует на damage taken, и в нем через ифзены - вообще все действия, для всех скиллов.
|
|
|
|