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


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


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.
редактирую посты! ВСЕ!
 

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

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