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


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] Оптимизация
[Вопрос] Оптимизация
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
Блокировки:
Тригеры инициализации перестали пахать, да и этот тригер тоже, после всех этих манипуляций avtorfffuuu Ставлю на событие прошло 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 секунд использовать

 

Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] Оптимизация
  • Страница 1 из 1
  • 1
Поиск:

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