[Вопрос] Оптимизация кода системы
|
|
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
Блокировки:
| Кстати, луп по группе быстрее энума. Могу линк бенчмарка дать
|
|
|
|
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
Блокировки:
| Двукратный выигрыш в скорости. Вот, изучи
|
|
|
|
Diabfall | Дата: Воскресенье, 30 Декабря 2012, 14:33:39 | Сообщение # 9 |
Группа: Проверенные
Сообщений: 1231
Награды: 0
Блокировки:
| Цитата (Ty3uK) Двукратный выигрыш в скорости. Хм, действительно.)
Сообщение отредактировал Diabfall - Воскресенье, 30 Декабря 2012, 14:46:04 |
|
|
|