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


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Заказ] Оптимизация очень важного кода (Выбор героев... Маскимально оптимизировать)
[Заказ] Оптимизация очень важного кода
FatalBladeДата: Среда, 30 Ноября 2011, 02:17:46 | Сообщение # 1
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Code
function Trig_Hero_Chosen_Conditions takes nothing returns boolean
     return ( ( GetUnitTypeId(GetTriggerUnit()) == 'n00G' ) or ( GetUnitTypeId(GetTriggerUnit()) == 'n009' ) )  
endfunction

function Trig_Hero_Chosen_Actions takes nothing returns nothing
     local unit Hero
     local integer id = GetSpellAbilityId()
     local integer ex = LoadInteger(udg_Abilities, id, 9)
     local sound s = LoadSoundHandle(udg_Abilities, id, 10)
     local unit u = GetTriggerUnit()
     local player p = GetOwningPlayer(u)
     local integer a = GetPlayerId(p) + 1
     local unit ud
     local integer i = 1
     local real x
     local real y
     call RemoveUnit(u)
     set udg_AbilityCounter[a] = 0

     if ((p == Player(1)) or (p == Player(2)) or (p == Player(4)) or (p == Player(6)) or (p == Player(9))) then
         if ( GetLocalPlayer() == p ) then
             call PanCameraToTimed( GetLocationX(udg_Good), GetLocationY(udg_Good), 0 )
         endif
         set Hero = CreateUnitAtLoc( p, ex, udg_Good, 0)
     endif
     if ((p == Player(0)) or (p == Player(3)) or (p == Player(5)) or (p == Player(7)) or (p == Player(8))) then
         if ( GetLocalPlayer() == p ) then
             call PanCameraToTimed( GetLocationX(udg_Bad), GetLocationY(udg_Bad), 0 )
         endif
         set Hero = CreateUnitAtLoc( p, ex, udg_Bad, 0)
     endif

     set x = GetWidgetX(Hero)
     set y = GetWidgetY(Hero)

     // ______________________________________________________________________________

     call ModifyHeroSkillPoints( Hero, bj_MODIFYMETHOD_ADD, 3 )
     call SelectHeroSkill( Hero, 'A0JC' )
     call SelectHeroSkill( Hero, 'A0JD' )
     call SelectHeroSkill( Hero, 'A0JI' )
     call ModifyHeroSkillPoints( Hero, bj_MODIFYMETHOD_SET, GetHeroLevel(Hero) )
     call SetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD) + 500)
     call SetPlayerAbilityAvailable( p, 'Asal', false)

     if ( GetLocalPlayer() == p ) then
         call ClearSelection()
         call SelectUnit( Hero, true )
     endif

     loop  
       exitwhen i > 3
         set ud = CreateUnit( p, 'n00J', x, y, 0 )
         call GroupAddUnit( udg_ClassSkillsGroup[a], ud )
         set i = i + 1
     endloop

     set udg_AA[a] = CreateUnit( p, 'n00U', x, y, 0 )  
     call UnitAddAbility (udg_AA[a], (LoadInteger(udg_Abilities, id, 0)) )
     call UnitAddAbility (udg_AA[a], (LoadInteger(udg_Abilities, id, 1)) )
     call UnitAddAbility (udg_AA[a], (LoadInteger(udg_Abilities, id, 2)) )
     call UnitAddAbility (udg_AA[a], (LoadInteger(udg_Abilities, id, 3)) )
     call UnitAddAbility (udg_AA[a], (LoadInteger(udg_Abilities, id, 4)) )
     call UnitAddAbility (udg_AA[a], (LoadInteger(udg_Abilities, id, 5)) )
     call UnitAddAbility (udg_AA[a], (LoadInteger(udg_Abilities, id, 6)) )
     call UnitAddAbility (udg_AA[a], (LoadInteger(udg_Abilities, id, 7)) )
     call UnitAddAbility (udg_AA[a], (LoadInteger(udg_Abilities, id, 8)) )

     call AttachSoundToUnit(s, Hero)
     call SetSoundVolume(s, 127)
     call StartSound(s)
     if ( GetLocalPlayer() == p ) then
         call AdjustCameraBoundsBJ( bj_CAMERABOUNDS_ADJUST_SUB, 500.00, 500.00, 600.00, 400.00 )
     endif

     // ______________________________________________________________________________

     call SaveReal(udg_Hash, GetHandleId(Hero), 100, 0.0)
     call SaveInteger(udg_Hash, GetHandleId(Hero), 101, 0)

     if (GetUnitTypeId(Hero) == 'H00S') then
         call TriggerRegisterUnitEvent( gg_trg_SufferTake, Hero, EVENT_UNIT_DAMAGED )
         call SaveBoolean(udg_Hash, GetHandleId(Hero), 0, false)
     endif
     if (GetUnitTypeId(Hero) == 'H00P') then
         call TriggerRegisterUnitEvent( gg_trg_Blood_to_Soul_Loop, Hero, EVENT_UNIT_DAMAGED )
     endif
     if (GetUnitTypeId(Hero) == 'H00Q') then
         call TriggerRegisterUnitEvent( gg_trg_GOTM_Damage, Hero, EVENT_UNIT_DAMAGED )
         call SaveBoolean(udg_Hash, GetHandleId(Hero), 0, false)
     endif
     if (GetUnitTypeId(Hero) == 'H000') then
         call SaveBoolean(udg_Hash, GetHandleId(Hero), 0, false)
     endif
     if (GetUnitTypeId(Hero) == 'H00X') then
         call SaveBoolean(udg_Hash, GetHandleId(Hero), 82, false)
     endif
     if (GetUnitTypeId(Hero) == 'H008') then
         call SaveBoolean(udg_Hash, GetHandleId(Hero), 72, false)
     endif
     if (GetUnitTypeId(Hero) == 'H00A') then
         call SaveBoolean(udg_Hash, GetHandleId(Hero), 79, false)
     endif
     if (GetUnitTypeId(Hero) == 'H03R') then
         call SaveBoolean(udg_Hash, GetHandleId(Hero), 89, false)
     endif

     call FlushChildHashtable(udg_Abilities, id)
     set udg_HeroesPlaying[a] = Hero
     set Hero = null
     set s = null
     set ud = null
     set u = null
     set p = null
endfunction


Тут присутствуют глобалки. Они все влияют на игру в дальнейшем.
udg_Bad и udg_Good - 2 глобальные точки на карте, где воскрешаются герои.
udg_HeroesPlaying[a] - Массив героев, которые уже куплены игроками. Можно и хэш сделать, но влом))) Да и не важно, 1 глоб-массив не испортит игру.
udg_AA[a] и udg_ClassSkillsGroup[a] - Долго обьяснять для чего они, но они нужны.
Мне же нужно оптимизировать сам код, что бы работал быстрее.


 

BorodachДата: Среда, 30 Ноября 2011, 02:36:52 | Сообщение # 2
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
я б это подрезал
Code

       if (GetUnitTypeId(Hero) == 'H00S') then
          call TriggerRegisterUnitEvent( gg_trg_SufferTake, Hero, EVENT_UNIT_DAMAGED )
          call SaveBoolean(udg_Hash, GetHandleId(Hero), 0, false)
      endif
      if (GetUnitTypeId(Hero) == 'H00P') then
          call TriggerRegisterUnitEvent( gg_trg_Blood_to_Soul_Loop, Hero, EVENT_UNIT_DAMAGED )
      endif
      if (GetUnitTypeId(Hero) == 'H00Q') then
          call TriggerRegisterUnitEvent( gg_trg_GOTM_Damage, Hero, EVENT_UNIT_DAMAGED )
          call SaveBoolean(udg_Hash, GetHandleId(Hero), 0, false)
      endif
      if (GetUnitTypeId(Hero) == 'H000') then
          call SaveBoolean(udg_Hash, GetHandleId(Hero), 0, false)
      endif
      if (GetUnitTypeId(Hero) == 'H00X') then
          call SaveBoolean(udg_Hash, GetHandleId(Hero), 82, false)
      endif
      if (GetUnitTypeId(Hero) == 'H008') then
          call SaveBoolean(udg_Hash, GetHandleId(Hero), 72, false)
      endif
      if (GetUnitTypeId(Hero) == 'H00A') then
          call SaveBoolean(udg_Hash, GetHandleId(Hero), 79, false)
      endif
      if (GetUnitTypeId(Hero) == 'H03R') then
          call SaveBoolean(udg_Hash, GetHandleId(Hero), 89, false)
      endif


Karamba
 

FatalBladeДата: Среда, 30 Ноября 2011, 02:45:26 | Сообщение # 3
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (Borodach)
я б это подрезал

Всмысле убрать? Это тоже нужно.


 

BorodachДата: Среда, 30 Ноября 2011, 02:49:49 | Сообщение # 4
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
FatalBlade, Укоротил.... По догадке, это выбраным(созданым) героям создает событие на получение урона, верно?

Karamba
 

FatalBladeДата: Среда, 30 Ноября 2011, 03:16:36 | Сообщение # 5
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (Borodach)
По догадке, это выбраным(созданым) героям создает событие на получение урона, верно?

Ну если ты только про те ифзены то да. А так это триггер на покупку героя.


 

Ty3uKДата: Среда, 30 Ноября 2011, 07:32:39 | Сообщение # 6
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Я бы убрал в самом начале функу создания юнита в локе, передвижение камеры через время (PanCameraToTimed) и заменил бы на PanCameraTo, ибо при нуле эффект будет одинаковым

Добавлено (30 Ноябрь 2011, 07:32:39)
---------------------------------------------
Ну и лольное обилие скобок, ибо между (p == Player(1)) or (p == Player(3)) и p == Player(1) or p == Player(3) нет никакой разницы в результате, кроме как лишних символов в коде (скобок)


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

SirNikolasДата: Среда, 30 Ноября 2011, 14:39:57 | Сообщение # 7
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (FatalBlade)
local unit u = GetTriggerUnit()
GetTriggerUnit() можно использовать дважды, не занося в локалку. Потери производительности не будет.
Quote (FatalBlade)
call ModifyHeroSkillPoints( Hero, bj_MODIFYMETHOD_ADD, 3 )
Раскрыть.
Quote (FatalBlade)
Code
if ( GetLocalPlayer() == p ) then
           call ClearSelection()
           call SelectUnit( Hero, true )
       endif
call SelectUnit(Hero, GetLocalPlayer() == p)
Quote (FatalBlade)
     loop
          exitwhen i > 3
         set ud = CreateUnit( p, 'n00J', x, y, 0 )
         call GroupAddUnit( udg_ClassSkillsGroup[a], ud )
         set i = i + 1
     endloop
Создание циклов в три прохода != оптимизация.
Quote (FatalBlade)
call AdjustCameraBoundsBJ( bj_CAMERABOUNDS_ADJUST_SUB, 500.00, 500.00, 600.00, 400.00 )
Раскрыть.
Quote (FatalBlade)
GetHandleId(Hero)
В переменную.
Quote (FatalBlade)
Code
     if (GetUnitTypeId(Hero) == 'H00S') then
           call TriggerRegisterUnitEvent( gg_trg_SufferTake, Hero, EVENT_UNIT_DAMAGED )
           call SaveBoolean(udg_Hash, GetHandleId(Hero), 0, false)
       endif
       if (GetUnitTypeId(Hero) == 'H00P') then
           call TriggerRegisterUnitEvent( gg_trg_Blood_to_Soul_Loop, Hero, EVENT_UNIT_DAMAGED )
       endif
       if (GetUnitTypeId(Hero) == 'H00Q') then
           call TriggerRegisterUnitEvent( gg_trg_GOTM_Damage, Hero, EVENT_UNIT_DAMAGED )
           call SaveBoolean(udg_Hash, GetHandleId(Hero), 0, false)
       endif
       if (GetUnitTypeId(Hero) == 'H000') then
           call SaveBoolean(udg_Hash, GetHandleId(Hero), 0, false)
       endif
       if (GetUnitTypeId(Hero) == 'H00X') then
           call SaveBoolean(udg_Hash, GetHandleId(Hero), 82, false)
       endif
       if (GetUnitTypeId(Hero) == 'H008') then
           call SaveBoolean(udg_Hash, GetHandleId(Hero), 72, false)
       endif
       if (GetUnitTypeId(Hero) == 'H00A') then
           call SaveBoolean(udg_Hash, GetHandleId(Hero), 79, false)
       endif
       if (GetUnitTypeId(Hero) == 'H03R') then
           call SaveBoolean(udg_Hash, GetHandleId(Hero), 89, false)
       endif
По крайней мере, юзаем elseif. А GetUnitTypeId следует в переменную записать.


 

FatalBladeДата: Среда, 30 Ноября 2011, 22:03:51 | Сообщение # 8
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (SirNikolas)
GetTriggerUnit() можно использовать дважды, не занося в локалку. Потери производительности не будет.

Ок.

Quote (SirNikolas)
call SelectUnit(Hero, GetLocalPlayer() == p)

А разве второй аргумент функции SelectUnit предназначен для условия выбора юнита? Помоему там что то другое

Quote (SirNikolas)
Раскрыть.

Я могу написать вот так?
Code
if ( GetLocalPlayer() == p ) then
call SetCameraBounds(minX, minY, minX, maxY, maxX, maxY, maxX, minY)
endif

Все минимумы и максимумы естественно обозначены заранее

Quote (SirNikolas)
В переменную.

ок

Добавлено (30 Ноябрь 2011, 22:03:51)
---------------------------------------------
Quote (Ty3uK)
Я бы убрал в самом начале функу создания юнита в локе,

Но если есть уже 2 глобальные локи на карте, которые не будут удаляться напротяжение всей игры, то почему бы и создать в локе? Смысл юзать координаты, если есть константная точка?




Сообщение отредактировал FatalBlade - Среда, 30 Ноября 2011, 22:33:03
 

SirNikolasДата: Четверг, 01 Декабря 2011, 14:01:20 | Сообщение # 9
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (FatalBlade)
Смысл юзать координаты, если есть константная точка?
Смысл юзать константные точки, если есть константные координаты, которые оптимизатор подставляет прямо в код?
Quote (FatalBlade)
А разве второй аргумент функции SelectUnit предназначен для условия выбора юнита?
Там логическая, отвечающая за то, следует юнита добавить в выделение или удалить. Однако исхитрившись с GetLocalPlayer(), можно сделать что-то вроде условия.
Quote (FatalBlade)
if ( GetLocalPlayer() == p ) then
call SetCameraBounds(minX, minY, minX, maxY, maxX, maxY, maxX, minY) endif
Скорее всего, можешь.
P. S. Пиши поменьше скобок - это снижает читабельность кода.


 

FatalBladeДата: Четверг, 01 Декабря 2011, 16:13:52 | Сообщение # 10
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (SirNikolas)
Смысл юзать константные точки, если есть константные координаты, которые оптимизатор подставляет прямо в код?

А как их найти? Просто в самом ВЕ навести машкой на нужную точку, и переписать координаты которые будут высвечиваться в нижнем левом углу? Я думал об этом, но понял что это не так просто. В ВЕ координаты исчисляются по пронципу окна/графа, где точка (0,0) находится точно в середине экрана. То есть на карте есть и отрицательные координаты. А ведь джасс походу считает координаты по другому - там точка (0,0) находится в верхнем левом углу... нет?


 

HexingДата: Четверг, 01 Декабря 2011, 16:16:13 | Сообщение # 11
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
Quote (FatalBlade)
нет?

нет
наводишь курсор и пишешь ручками ;) все так делают


 

[DUОS]Дата: Четверг, 01 Декабря 2011, 20:34:23 | Сообщение # 12
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
Quote (FatalBlade)
udg_Bad и udg_Good - 2 глобальные точки на карте, где воскрешаются герои.

Лучше udg_GoodX, udg_GoodY и с Bad аналогично.
Код не поддаётся никаким комментариям просто... Куда катятся джассеры Инфо, в конце концов?


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)


Сообщение отредактировал [DUОS] - Четверг, 01 Декабря 2011, 20:35:58
 

FatalBladeДата: Четверг, 01 Декабря 2011, 21:46:26 | Сообщение # 13
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Спс большое

 

HexingДата: Пятница, 02 Декабря 2011, 08:55:03 | Сообщение # 14
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
Quote (Hexing)
Куда катятся джассеры Инфо, в конце концов?

ну так научите нас dunno


 

Ty3uKДата: Пятница, 02 Декабря 2011, 08:57:21 | Сообщение # 15
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Он учит меня :-P за что я ему очень признателен

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

FatalBladeДата: Пятница, 02 Декабря 2011, 11:27:37 | Сообщение # 16
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Меня тож научите плз, а?)

 

Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Заказ] Оптимизация очень важного кода (Выбор героев... Маскимально оптимизировать)
  • Страница 1 из 1
  • 1
Поиск:

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