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


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] Оптимизация кода системы (help me)
[Вопрос] Оптимизация кода системы
DiabfallДата: Суббота, 29 Декабря 2012, 23:01:49 | Сообщение # 1
Группа: Проверенные
Сообщений: 1231
Награды: 0
Блокировки:
Есть старый код недописанной системки движения ИИ. Всё работает, но есть предположение, что он не хило тормозит карту.
Собственно нужны советы как упростить!

p.s. Не надо писать про микро косяки! Меня интересует только то, что действительно вызывает серьёзные тормоза.

Код
function Trig_AIHeroesGo_FilterUnits1 takes nothing returns boolean
       if GetWidgetLife(GetFilterUnit())>.0 and IsPlayerAlly(GetOwningPlayer(GetFilterUnit()),Player(0))==true and GetOwningPlayer(GetFilterUnit())!=Player(PLAYER_NEUTRAL_PASSIVE) then  
           return true  
       endif
       return false
endfunction

function Trig_AIHeroesGo_Actions2 takes nothing returns nothing
     local real array sg
     local real sf
     local rect array rcm1
     local rect array rcm2
     local rect array rc
     local integer roll=0
     local group g1=CreateGroup()
     local unit e=null
     local real array x
     local real array y
     local integer i=0
     local integer n=0
     local string s="attack"
     local real hp=GetUnitLifePercent(udg_HeroPlayer[GetPlayerId(GetEnumPlayer())])
     set actr=actr+.3
     set x[2]=GetWidgetX(udg_HeroPlayer[GetPlayerId(GetEnumPlayer())])
     set y[2]=GetWidgetY(udg_HeroPlayer[GetPlayerId(GetEnumPlayer())])
     if GetPlayerId(GetEnumPlayer())<6 and lsh[GetPlayerId(GetEnumPlayer())]==0 and GetUnitState(udg_HeroPlayer[GetPlayerId(GetEnumPlayer())], UNIT_STATE_LIFE)>=0.5 then
         set sg[1]=SquareRoot((GetWidgetX(gg_unit_h00W_0051)-GetWidgetX(udg_HeroPlayer[GetPlayerId(GetEnumPlayer())]))*(GetWidgetX(gg_unit_h00W_0051)-GetWidgetX(udg_HeroPlayer[GetPlayerId(GetEnumPlayer())]))+(GetWidgetY(gg_unit_h00W_0051)-GetWidgetY(udg_HeroPlayer[GetPlayerId(GetEnumPlayer())]))*(GetWidgetY(gg_unit_h00W_0051)-GetWidgetY(udg_HeroPlayer[GetPlayerId(GetEnumPlayer())])))
         set sg[2]=SquareRoot((GetWidgetX(gg_unit_h00Z_0107)-GetWidgetX(udg_HeroPlayer[GetPlayerId(GetEnumPlayer())]))*(GetWidgetX(gg_unit_h00Z_0107)-GetWidgetX(udg_HeroPlayer[GetPlayerId(GetEnumPlayer())]))+(GetWidgetY(gg_unit_h00Z_0107)-GetWidgetY(udg_HeroPlayer[GetPlayerId(GetEnumPlayer())]))*(GetWidgetY(gg_unit_h00Z_0107)-GetWidgetY(udg_HeroPlayer[GetPlayerId(GetEnumPlayer())])))
         if sg[1]<=sg[2] and (lshhw1[1]<2 or lshhw1[2]<2 or lshhw2[1]>lshhw1[1] or lshhw2[2]>lshhw1[2]) then
         set sf=sg[1]
         set rcm1[1]=gg_rct_AUAI1
         set rcm2[1]=gg_rct_AOAI1
         endif
         if sg[1]>sg[2] and (lshhw1[3]<2 or lshhw1[4]<2 or lshhw2[3]>lshhw1[3] or lshhw2[4]>lshhw1[4]) then
         set sf=sg[2]
         set rcm1[1]=gg_rct_EOAI1
         set rcm2[1]=gg_rct_EUAI1
         else
         set sf=sg[1]
         set rcm1[1]=gg_rct_AUAI1
         set rcm2[1]=gg_rct_AOAI1
         endif
      
          
         set roll=GetRandomInt(1, 2)
             if roll==1 then
             set rc[6]=rcm1[1]
                 if rcm1[1]==gg_rct_AUAI1 then
                     if lshhw1[1]>1 then
                     set rc[6]=rcm2[1]
                     endif
                 endif
                 if rcm1[1]==gg_rct_EOAI1 then
                     if lshhw1[3]>1 then
                     set rc[6]=rcm2[1]
                     endif
                 endif
             elseif roll==2 then
             set rc[6]=rcm2[1]
             if rcm2[1]==gg_rct_AOAI1 then
                     if lshhw1[2]>1 then
                     set rc[6]=rcm1[1]
                     endif
                 endif
                 if rcm2[1]==gg_rct_EUAI1 then
                     if lshhw1[4]>1 then
                     set rc[6]=rcm1[1]
                     endif
                 endif
             endif
              
             if rc[6]==gg_rct_AUAI1 then
             set lsh[GetPlayerId(GetEnumPlayer())]=1
             elseif rc[6]==gg_rct_AOAI1 then
             set lsh[GetPlayerId(GetEnumPlayer())]=2
             elseif rc[6]==gg_rct_EOAI1 then
             set lsh[GetPlayerId(GetEnumPlayer())]=3
             elseif rc[6]==gg_rct_EUAI1 then
             set lsh[GetPlayerId(GetEnumPlayer())]=4
             endif
              
         set lshhw1[lsh[GetPlayerId(GetEnumPlayer())]]=lshhw1[lsh[GetPlayerId(GetEnumPlayer())]]+1
         call IssuePointOrder( udg_HeroPlayer[GetPlayerId(GetEnumPlayer())], "attack", GetRectCenterX(rc[6]), GetRectCenterY(rc[6]) )
     endif
      
     if lsh[GetPlayerId(GetEnumPlayer())]==1 then
         loop  
             exitwhen i>14
             set rc[i]=airg1[i]
             set i=i+1
         endloop
     elseif lsh[GetPlayerId(GetEnumPlayer())]==2 then
         loop  
             exitwhen i>14
             set rc[i]=airg2[i]
             set i=i+1
         endloop
     elseif lsh[GetPlayerId(GetEnumPlayer())]==3 then
         loop  
             exitwhen i>14
             set rc[i]=airg3[i]
             set i=i+1
         endloop
     elseif lsh[GetPlayerId(GetEnumPlayer())]==4 then
         loop  
             exitwhen i>14
             set rc[i]=airg4[i]
             set i=i+1
         endloop
     endif
     set i=14
     if hp > 35. then
         loop
             exitwhen i<0 or e!=null
             set x[1]=GetRectCenterX(rc[i])
             set y[1]=GetRectCenterY(rc[i])
             call GroupEnumUnitsInRange(g1,x[1],y[1], 1500.,function Trig_AIHeroesGo_FilterUnits1)
             set e=FirstOfGroup(g1)
             if e==udg_HeroPlayer[GetPlayerId(GetEnumPlayer())] then
             call GroupRemoveUnit(g1,e)
             set e=FirstOfGroup(g1)
             endif
             if e==null then
             set i=i-1
             endif
         endloop
     else
     set sg[2]=0
     set n=14
         loop
             exitwhen n<1
             set x[1]=GetRectCenterX(rc[n])
             set y[1]=GetRectCenterY(rc[n])
             set sg[1]=SquareRoot((x[1]-x[2])*(x[1]-x[2])+(y[1]-y[2])*(y[1]-y[2]))
             if sg[1]<=sg[2] then
             set i=n-1
                 if i==0 then
                 set i=1
                 endif
             endif
             set sg[2]=sg[1]
             set n=n-1
         endloop     
     set actr=1.5
     set s="move"
     endif
     if actr>=1.5 then
     set actr=.0
     call IssuePointOrder( udg_HeroPlayer[GetPlayerId(GetEnumPlayer())], s, GetRectCenterX(rc[i]), GetRectCenterY(rc[i]) )
     endif
     call DestroyGroup(g1)
     set g1=null
     set e=null
     set rcm1[1]=null
     set rcm2[1]=null
     set rc[0]=null
     set rc[1]=null
     set rc[2]=null
     set rc[3]=null
     set rc[4]=null
     set rc[5]=null
     set rc[6]=null
     set rc[7]=null
     set rc[8]=null
     set rc[9]=null
     set rc[10]=null
     set rc[11]=null
     set rc[12]=null
     set rc[13]=null
     set rc[14]=null
endfunction

function Trig_AIHeroesGo_Actions1 takes nothing returns nothing
     call ForForce( udg_AiPlayersGroup, function Trig_AIHeroesGo_Actions2 )
endfunction

function Trig_AIHeroesGo_Actions takes nothing returns nothing
     local timer t=CreateTimer()
     call TimerStart( t, .3, true, function Trig_AIHeroesGo_Actions1)
     set t=null
endfunction

//===========================================================================
function InitTrig_AIHeroesGo takes nothing returns nothing
     set gg_trg_AIHeroesGo  = CreateTrigger(  )
     call DisableTrigger( gg_trg_AIHeroesGo )
     call TriggerAddAction( gg_trg_AIHeroesGo, function Trig_AIHeroesGo_Actions )
endfunction
 

[SeKtOR]Дата: Суббота, 29 Декабря 2012, 23:44:06 | Сообщение # 2
Группа: Проверенные
Сообщений: 1143
Награды: 0
Репутация: 1168
Блокировки:
Код
function Trig_AIHeroesGo_FilterUnits1 takes nothing returns boolean   
         if GetWidgetLife(GetFilterUnit())>.0 and IsPlayerAlly(GetOwningPlayer(GetFilterUnit()),Player(0))==true and GetOwningPlayer(GetFilterUnit())!=Player(PLAYER_NEUTRAL_PASSIVE) then    
             return true    
         endif   
         return false   
endfunction

Зачем?
Код
function Trig_AIHeroesGo_FilterUnits1 takes nothing returns boolean   
        return GetWidgetLife(GetFilterUnit())>.0 and IsPlayerAlly(GetOwningPlayer(GetFilterUnit()),Player(0))==true and GetOwningPlayer(GetFilterUnit())!=Player(PLAYER_NEUTRAL_PASSIVE)
endfunction


Код
function Trig_AIHeroesGo_Actions takes nothing returns nothing   
       local timer t=CreateTimer()   
       call TimerStart( t, .3, true, function Trig_AIHeroesGo_Actions1)   
       set t=null   
endfunction

Зачем?
Код
function Trig_AIHeroesGo_Actions takes nothing returns nothing   
       call TimerStart(CreateTimer() , .3, true, function Trig_AIHeroesGo_Actions1)   
endfunction

И в функции "Trig_AIHeroesGo_Actions2 " замени группу g1 на глобальную, как я понял ты создаешь каждый раз при вызове. Создай один раз и все
P.S. Хотя скорее всего это придирки




Сообщение отредактировал [SeKtOR] - Суббота, 29 Декабря 2012, 23:44:16
 

SirNikolasДата: Воскресенье, 30 Декабря 2012, 09:12:29 | Сообщение # 3
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Насчет группы правильно замечено. Плюс выделение памяти под локальные массивы - ресурсоемкая процедура. А у тебя это происходит несколько раз каждые .3 секунды. Сделай их глобальными.

 

DiabfallДата: Воскресенье, 30 Декабря 2012, 11:19:45 | Сообщение # 4
Группа: Проверенные
Сообщений: 1231
Награды: 0
Блокировки:
Сделал всё по вашим рекомендациям, ничего не изменилось. Делаю вывод, что корень проблемы исходит не отсюда.

Тему пока прошу придержать открытой.
 

ImpregnableДата: Воскресенье, 30 Декабря 2012, 11:32:59 | Сообщение # 5
6 уровень
Группа: Проверенные
Сообщений: 231
Награды: 0
Репутация: 92
Блокировки:
ужас...

Вставь в конец функции "Trig_AIHeroesGo_Actions2" это "call BJDebugMsg("123")"
Проверь и скажи выводит ли сообщения


Если долго мучиться, то может,
все равно нихуя не получится.
 

Ty3uKДата: Воскресенье, 30 Декабря 2012, 11:33:48 | Сообщение # 6
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Кстати, луп по группе быстрее энума.
Могу линк бенчмарка дать


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

DiabfallДата: Воскресенье, 30 Декабря 2012, 11:58:14 | Сообщение # 7
Группа: Проверенные
Сообщений: 1231
Награды: 0
Блокировки:
Цитата (Impregnable)
Вставь в конец функции "Trig_AIHeroesGo_Actions2" это "call BJDebugMsg("123")"
Проверь и скажи выводит ли сообщения

Да, всё выводит.

Цитата (Ty3uK)
Кстати, луп по группе быстрее энума.

И много я выиграю?
 

Ty3uKДата: Воскресенье, 30 Декабря 2012, 13:35:44 | Сообщение # 8
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Двукратный выигрыш в скорости.
Вот, изучи ;)


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

DiabfallДата: Воскресенье, 30 Декабря 2012, 14:33:39 | Сообщение # 9
Группа: Проверенные
Сообщений: 1231
Награды: 0
Блокировки:
Цитата (Ty3uK)
Двукратный выигрыш в скорости.

Хм, действительно.)


Сообщение отредактировал Diabfall - Воскресенье, 30 Декабря 2012, 14:46:04
 

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

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