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


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
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, и в нем через ифзены - вообще все действия, для всех скиллов.


 

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

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