|
|
|
|
[Вопрос] Оптимизация
|
|
Nyp | Дата: Пятница, 02 Марта 2012, 22:32:11 | Сообщение # 1 |
6 уровень
Группа: Проверенные
Сообщений: 217
Награды: 0
Репутация: 56
Блокировки:
| Народ, конвертанув тригер в jass, сократил всё, что попало на глаз. Сократил кучу кода. Вопрос: можно ли его ещё больше оптимизировать, и правильно ли я использовал функцию call CreateUnitAtLoc вместо CreateNUnitsAtLoc? Полученный код:Code function damitavernProverka takes nothing returns boolean if ( GetPlayerSlotState(Player(GetForLoopIndexA())) == PLAYER_SLOT_STATE_PLAYING ) then return true endif return false endfunction
function damitavernAc takes nothing returns nothing local location p = Location(-1282, 2628) local location t = Location(-856, -3670) set bj_forLoopAIndex = 1 loop exitwhen bj_forLoopAIndex > 6 if ( damitavernProverka() ) then call CreateUnitAtLoc( Player(GetForLoopIndexA()), 'h013', p, 1 ) else endif set bj_forLoopAIndex = bj_forLoopAIndex + 1 endloop set bj_forLoopAIndex = 7 loop exitwhen bj_forLoopAIndex > 12 if ( damitavernProverka() ) then call CreateUnitAtLoc( Player(GetForLoopIndexA()), 'h013', t, 1 ) else endif set bj_forLoopAIndex = bj_forLoopAIndex + 1 endloop endfunction
//=========================================================================== function InitTrig_dami_tavern takes nothing returns nothing set gg_trg_dami_tavern = CreateTrigger( ) call TriggerAddAction( gg_trg_dami_tavern, function damitavernAc ) call DestroyTrigger( gg_trg_dami_tavern ) set gg_trg_dami_tavern = null endfunction Ещё одно: конвентировав тригер, код вышел в виде 140 строк: Code function Trig_dami_taverni_Func001C takes nothing returns boolean if ( not ( GetPlayerSlotState(Player(0)) == PLAYER_SLOT_STATE_PLAYING ) ) then return false endif return true endfunction
function Trig_dami_taverni_Func002C takes nothing returns boolean if ( not ( GetPlayerSlotState(Player(1)) == PLAYER_SLOT_STATE_PLAYING ) ) then return false endif return true endfunction
function Trig_dami_taverni_Func003C takes nothing returns boolean if ( not ( GetPlayerSlotState(Player(2)) == PLAYER_SLOT_STATE_PLAYING ) ) then return false endif return true endfunction
function Trig_dami_taverni_Func004C takes nothing returns boolean if ( not ( GetPlayerSlotState(Player(3)) == PLAYER_SLOT_STATE_PLAYING ) ) then return false endif return true endfunction
function Trig_dami_taverni_Func005C takes nothing returns boolean if ( not ( GetPlayerSlotState(Player(4)) == PLAYER_SLOT_STATE_PLAYING ) ) then return false endif return true endfunction
function Trig_dami_taverni_Func006C takes nothing returns boolean if ( not ( GetPlayerSlotState(Player(5)) == PLAYER_SLOT_STATE_PLAYING ) ) then return false endif return true endfunction
function Trig_dami_taverni_Func007C takes nothing returns boolean if ( not ( GetPlayerSlotState(Player(6)) == PLAYER_SLOT_STATE_PLAYING ) ) then return false endif return true endfunction
function Trig_dami_taverni_Func008C takes nothing returns boolean if ( not ( GetPlayerSlotState(Player(7)) == PLAYER_SLOT_STATE_PLAYING ) ) then return false endif return true endfunction
function Trig_dami_taverni_Func009C takes nothing returns boolean if ( not ( GetPlayerSlotState(Player(8)) == PLAYER_SLOT_STATE_PLAYING ) ) then return false endif return true endfunction
function Trig_dami_taverni_Func010C takes nothing returns boolean if ( not ( GetPlayerSlotState(Player(9)) == PLAYER_SLOT_STATE_PLAYING ) ) then return false endif return true endfunction
function Trig_dami_taverni_Func011C takes nothing returns boolean if ( not ( GetPlayerSlotState(Player(10)) == PLAYER_SLOT_STATE_PLAYING ) ) then return false endif return true endfunction
function Trig_dami_taverni_Func012C takes nothing returns boolean if ( not ( GetPlayerSlotState(Player(11)) == PLAYER_SLOT_STATE_PLAYING ) ) then return false endif return true endfunction
function Trig_dami_taverni_Actions takes nothing returns nothing if ( Trig_dami_taverni_Func001C() ) then call CreateNUnitsAtLoc( 1, 'h013', Player(0), GetRectCenter(gg_rct_taverna_Dobra), bj_UNIT_FACING ) else endif if ( Trig_dami_taverni_Func002C() ) then call CreateNUnitsAtLoc( 1, 'h013', Player(1), GetRectCenter(gg_rct_taverna_Dobra), bj_UNIT_FACING ) else endif if ( Trig_dami_taverni_Func003C() ) then call CreateNUnitsAtLoc( 1, 'h013', Player(2), GetRectCenter(gg_rct_taverna_Dobra), bj_UNIT_FACING ) else endif if ( Trig_dami_taverni_Func004C() ) then call CreateNUnitsAtLoc( 1, 'h013', Player(3), GetRectCenter(gg_rct_taverna_Dobra), bj_UNIT_FACING ) else endif if ( Trig_dami_taverni_Func005C() ) then call CreateNUnitsAtLoc( 1, 'h013', Player(4), GetRectCenter(gg_rct_taverna_Dobra), bj_UNIT_FACING ) else endif if ( Trig_dami_taverni_Func006C() ) then call CreateNUnitsAtLoc( 1, 'h013', Player(5), GetRectCenter(gg_rct_taverna_Dobra), bj_UNIT_FACING ) else endif if ( Trig_dami_taverni_Func007C() ) then call CreateNUnitsAtLoc( 1, 'h013', Player(6), GetRectCenter(gg_rct_taverna_zla), bj_UNIT_FACING ) else endif if ( Trig_dami_taverni_Func008C() ) then call CreateNUnitsAtLoc( 1, 'h013', Player(7), GetRectCenter(gg_rct_taverna_zla), bj_UNIT_FACING ) else endif if ( Trig_dami_taverni_Func009C() ) then call CreateNUnitsAtLoc( 1, 'h013', Player(8), GetRectCenter(gg_rct_taverna_zla), bj_UNIT_FACING ) else endif if ( Trig_dami_taverni_Func010C() ) then call CreateNUnitsAtLoc( 1, 'h013', Player(9), GetRectCenter(gg_rct_taverna_zla), bj_UNIT_FACING ) else endif if ( Trig_dami_taverni_Func011C() ) then call CreateNUnitsAtLoc( 1, 'h013', Player(10), GetRectCenter(gg_rct_taverna_zla), bj_UNIT_FACING ) else endif if ( Trig_dami_taverni_Func012C() ) then call CreateNUnitsAtLoc( 1, 'h013', Player(11), GetRectCenter(gg_rct_taverna_zla), bj_UNIT_FACING ) else endif endfunction
//=========================================================================== function InitTrig_dami_taverni takes nothing returns nothing set gg_trg_dami_taverni = CreateTrigger( ) call TriggerAddAction( gg_trg_dami_taverni, function Trig_dami_taverni_Actions ) endfunction Позже, после оптимизации, я решил ещё раз конвентировать триггер(до этого конвентировал копию). Получился код уже не из 140 строк, а из 47. Редактор осознал, что до этого выдал очень уж не оптимизированный код, и эволюционировал? Code function Trig_dami_taverni_Func001Func001C takes nothing returns boolean if ( not ( GetPlayerSlotState(ConvertedPlayer(GetForLoopIndexA())) == PLAYER_SLOT_STATE_PLAYING ) ) then return false endif return true endfunction
function Trig_dami_taverni_Func002Func001C takes nothing returns boolean if ( not ( GetPlayerSlotState(ConvertedPlayer(GetForLoopIndexA())) == PLAYER_SLOT_STATE_PLAYING ) ) then return false endif return true endfunction
function Trig_dami_taverni_Actions takes nothing returns nothing set bj_forLoopAIndex = 1 set bj_forLoopAIndexEnd = 6 loop exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd if ( Trig_dami_taverni_Func001Func001C() ) then call CreateNUnitsAtLoc( 1, 'h013', ConvertedPlayer(GetForLoopIndexA()), GetRectCenter(gg_rct_taverna_Dobra), bj_UNIT_FACING ) else endif set bj_forLoopAIndex = bj_forLoopAIndex + 1 endloop set bj_forLoopAIndex = 7 set bj_forLoopAIndexEnd = 12 loop exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd if ( Trig_dami_taverni_Func002Func001C() ) then call CreateNUnitsAtLoc( 1, 'h013', ConvertedPlayer(GetForLoopIndexA()), GetRectCenter(gg_rct_taverna_zla), bj_UNIT_FACING ) else endif set bj_forLoopAIndex = bj_forLoopAIndex + 1 endloop endfunction
//=========================================================================== function InitTrig_dami_taverni takes nothing returns nothing set gg_trg_dami_taverni = CreateTrigger( ) call TriggerAddAction( gg_trg_dami_taverni, function Trig_dami_taverni_Actions ) endfunction
|
|
|
|
oleg_best_oleg | Дата: Пятница, 02 Марта 2012, 22:46:32 | Сообщение # 2 |
Группа: Заблокированные
Сообщений: 1726
Награды: 0
Репутация: 654
Блокировки:
| Quote (Nyp) bj_forLoopAIndex Замени на локальную целочисленную
|
|
|
|
lawson | Дата: Суббота, 03 Марта 2012, 00:38:28 | Сообщение # 3 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Nyp, А зачем вообще конверировать? Для какой цели? Оптимизировать? - можно и на гуи через кс!
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
Nyp | Дата: Суббота, 03 Марта 2012, 01:09:43 | Сообщение # 4 |
6 уровень
Группа: Проверенные
Сообщений: 217
Награды: 0
Репутация: 56
Блокировки:
| После конвентирования ведь удобней оптимизировать и исправлять код. А как потом применить функшию GetForLoopIndexA, если заменить на локалку i?
|
|
|
|
lawson | Дата: Суббота, 03 Марта 2012, 02:24:58 | Сообщение # 5 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (Nyp) После конвентирования ведь удобней оптимизировать и исправлять код. А зачем исправлять, лучше сразу делать правильно!
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
Dreii | Дата: Суббота, 03 Марта 2012, 05:58:32 | Сообщение # 6 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| Code function damitavernAc takes nothing returns nothing local real xp=-1282 local real yp=2628 local real xt=-856 local real yt=-3670 local integer i=0 loop exitwhen i > 6 if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING then call CreateUnit(Player(i),'h013',xp,yp,0.) endif set i = i + 1 endloop set i = 7 loop exitwhen i > 12 if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING then call CreateUnit(Player(i),'h013',xt,yt,0.) endif set i = i + 1 endloop endfunction //=========================================================================== function InitTrig_dami_tavern takes nothing returns nothing set gg_trg_dami_tavern = CreateTrigger( ) call TriggerAddAction( gg_trg_dami_tavern, function damitavernAc ) endfunction
Code
function Trig_dami_taverni_Actions takes nothing returns nothing local integer i=0 loop exitwhen i > 6 if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING then call CreateUnit(Player(i), 'h013',GetRectCenterX(gg_rct_taverna_Dobra), GetRectCenterY(gg_rct_taverna_Dobra),0.) endif set i = i + 1 endloop set i = 7 loop exitwhen i > 12 if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING then call CreateUnit(Player(i), 'h013',GetRectCenterX(gg_rct_taverna_zla), GetRectCenterY(gg_rct_taverna_zla),0.) endif set i = i + 1 endloop endfunction
//=========================================================================== function InitTrig_dami_taverni takes nothing returns nothing set gg_trg_dami_taverni = CreateTrigger( ) call TriggerAddAction( gg_trg_dami_taverni, function Trig_dami_taverni_Actions ) endfunction
|
|
|
|
Андреич | Дата: Суббота, 03 Марта 2012, 14:03:14 | Сообщение # 7 |
7 уровень
Группа: Проверенные
Сообщений: 363
Награды: 0
Репутация: 138
Блокировки:
| Quote (Nyp) А как потом применить функшию GetForLoopIndexA, если заменить на локалку i?
local integer i = 0 loop {do something...} set i = i + 1 exitwhen i > 5 (к примеру) endloop
"не психуй - пиши на гуй..."
|
|
|
|
SirNikolas | Дата: Суббота, 03 Марта 2012, 14:18:56 | Сообщение # 8 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (Андреич) set i = i + 1 exitwhen i > 5 exitwhen i == 5 set i = i + 1
|
|
|
|
Nyp | Дата: Суббота, 03 Марта 2012, 21:18:34 | Сообщение # 9 |
6 уровень
Группа: Проверенные
Сообщений: 217
Награды: 0
Репутация: 56
Блокировки:
| Тригеры инициализации перестали пахать, да и этот тригер тоже, после всех этих манипуляций Ставлю на событие прошло 0.01 сек - работает.
|
|
|
|
Dreii | Дата: Суббота, 03 Марта 2012, 22:21:28 | Сообщение # 10 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| Nyp, В джассе нет события инициализщация
|
|
|
|
Nyp | Дата: Суббота, 03 Марта 2012, 22:29:09 | Сообщение # 11 |
6 уровень
Группа: Проверенные
Сообщений: 217
Награды: 0
Репутация: 56
Блокировки:
| Я про обычные триггеры. Теперь всё норм, хз что было. Вопрос решён, спс.
|
|
|
|
SirNikolas | Дата: Воскресенье, 04 Марта 2012, 13:49:42 | Сообщение # 12 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (Dreii) Code function damitavernAc takes nothing returns nothing //... endfunction
//=========================================================================== function InitTrig_dami_tavern takes nothing returns nothing set gg_trg_dami_tavern = CreateTrigger( ) call TriggerAddAction( gg_trg_dami_tavern, function damitavernAc ) endfunction Code //=========================================================================== function InitTrig_dami_tavern takes nothing returns nothing //... endfunction Quote (Nyp) Ставлю на событие прошло 0.01 сек - работает. Тогда уж 0.00 ставь.
|
|
|
|
Dreii | Дата: Воскресенье, 04 Марта 2012, 14:07:17 | Сообщение # 13 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| SirNikolas, ты к тому что это и есть инициализация карты?
|
|
|
|
SirNikolas | Дата: Воскресенье, 04 Марта 2012, 14:34:29 | Сообщение # 14 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Да.
|
|
|
|
Dreii | Дата: Воскресенье, 04 Марта 2012, 14:36:37 | Сообщение # 15 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| SirNikolas, Она вроде не рабоатет
|
|
|
|
SirNikolas | Дата: Воскресенье, 04 Марта 2012, 15:52:19 | Сообщение # 16 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Почему не работает? Посмотри код карты после компиляции, а именно - функции main, InitCustomTriggers и RunInitializationTriggers.
|
|
|
|
Dreii | Дата: Воскресенье, 04 Марта 2012, 16:27:34 | Сообщение # 17 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| SirNikolas, у меня неработало. приходилось .0 секунд использовать
|
|
|
|
|
|
|
|
|
|
|