Вопрос по оптимизации
|
|
SirNikolas | Дата: Суббота, 30 Апреля 2011, 15:01:37 | Сообщение # 1 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Как лучше оформлять триггер? Вариант 1: Code function Trig_Test_Actions takes nothing returns nothing if true then//Условия //Действия endif endfunction
function InitTrig_Test takes nothing returns nothing local trigger trig = CreateTrigger() //Добавить событие(я) call TriggerAddAction(trig, function Trig_Test_Actions) set trig = null ednfunction Вариант 2:Code function Trig_Test_Actions takes nothing returns boolean if true then//Условия //Действия endif return false endfunction
function InitTrig_Test takes nothing returns nothing local trigger trig = CreateTrigger() //Добавить событие(я) call TriggerAddCondition(trig, Condition(function Trig_Test_Actions)) set trig = null ednfunction Вариант 3:Code function Trig_Test_Conditions takes nothing returns boolean return true//Условия endfunction
function Trig_Test_Actions takes nothing returns nothing //Действия endfunction
function InitTrig_Test takes nothing returns nothing local trigger trig = CreateTrigger() //Добавить событие(я) call TriggerAddCondition(trig, Condition(function Trig_Test_Conditions)) call TriggerAddAction(trig, function Trig_Test_Actions) set trig = null ednfunction Вариант 4:Code function Trig_Test_Actions takes nothing returns nothing //Действия endfunction
function Trig_Test_Conditions takes nothing returns boolean if true then//Условия call Trig_Test_Actions() endif return false endfunction
function InitTrig_Test takes nothing returns nothing local trigger trig = CreateTrigger() //Добавить событие(я) call TriggerAddCondition(trig, Condition(function Trig_Test_Conditions)) set trig = null ednfunction
|
|
|
|
lawson | Дата: Суббота, 30 Апреля 2011, 16:27:01 | Сообщение # 2 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| 3. Если много разных условий то 1.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 30 Апреля 2011, 16:27:52 |
|
|
|
Ajaccio | Дата: Суббота, 30 Апреля 2011, 16:42:13 | Сообщение # 3 |
7 уровень
Группа: Проверенные
Сообщений: 299
Награды: 1
Репутация: 239
Блокировки:
| Я делаю так: на каждое нужное в игре событие создаю ОДИН триггер и добавляю в него Condition. А уже оттуда запускаю действия через ExecuteFunc(...). Например, вот Condition для события EVENT_PLAYER_UNIT_SPELL_EFFECT: function SPL_Filter takes nothing returns boolean if GetSpellAbilityId() == '0000' then call ExecuteFunc("Spell_FireBall") \\заклинание "Огненный шар", запускаю его функцию. elseif GetSpellAbilityId() == '0001' then call ExecuteFunc("Spell_ManaTrap") \\заклинание "Ловушка энергии", запускаю его функцию. elseif GetSpellAbilityId() == '0002' then ... endif return false endfunction Это позволяет сильно экономить память, ибо вместо орды триггеров используется только один.
XOR EAX, EAX MOV EAX, 00H ;; NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
Сообщение отредактировал Ajaccio - Суббота, 30 Апреля 2011, 16:45:05 |
|
|
|
SirNikolas | Дата: Суббота, 30 Апреля 2011, 19:16:36 | Сообщение # 4 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Ajaccio, спасибо, действительно, так должно быть лучше. Только с EVENT_PLAYER_UNIT_SPELL_EFFECT я делаю немного по-другому. Да, раз уж всплыла тема про способности, хотелось бы узнать, является ли Issue...OrderById более быстрой, чем Issue...Order?
|
|
|
|
lawson | Дата: Суббота, 30 Апреля 2011, 21:52:40 | Сообщение # 5 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| SirNikolas, Во у меня тоже такой вопрос, зачем сдесь id?
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
FkoFF | Дата: Воскресенье, 01 Мая 2011, 00:45:45 | Сообщение # 6 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| lawson, бред запуск триггера лучше не допускать лишний раз. return x > 4 and y < 12 and z != 5 Quote (Ajaccio) Я делаю так: на каждое нужное в игре событие создаю ОДИН триггер и добавляю в него Condition. Бред, триггер запускается (вызывается функция), независимо от того, есть ли для этого спелла хоть какой то исполняемый фрагмент, и это пол беды, учитывая что длиннющий ифзен куда больше нагружает память чем выполнение конкретно-заданного условием триггера Quote (Ajaccio) Это позволяет сильно экономить память нет. Вариант 3 для всех случаев оптимален.
|
|
|
|
Banzay89 | Дата: Воскресенье, 01 Мая 2011, 05:07:02 | Сообщение # 7 |
9 уровень
Группа: Проверенные
Сообщений: 858
Награды: 1
Репутация: 77
Блокировки:
| Вся оптимизация - в периодиках © ScorpioT1000
кончайте страдать херней
|
|
|
|
Ajaccio | Дата: Воскресенье, 01 Мая 2011, 11:34:19 | Сообщение # 8 |
7 уровень
Группа: Проверенные
Сообщений: 299
Награды: 1
Репутация: 239
Блокировки:
| Разница в производительности кучи условий или кучи триггеров стремится к 0.0. Quote (Ajaccio) Это позволяет сильно экономить память, ибо вместо орды триггеров используется только один. Если у нас есть, например, 40 заклинаний, то мы количественно получаем в 40 раз меньше триггеров... К тому же, Condition и Actions также занимают свое место в памяти. Способ №3 создает 120 объектов (для 40 заклинаний), мой - всегда два. И именно это я подразумеваю под "экономить память".
XOR EAX, EAX MOV EAX, 00H ;; NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
Сообщение отредактировал Ajaccio - Воскресенье, 01 Мая 2011, 11:35:59 |
|
|
|
lawson | Дата: Воскресенье, 01 Мая 2011, 12:15:12 | Сообщение # 9 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| FkoFF, Хахаха, интересно а юнитов из группы ты как фильтруешь.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|