[Вопрос] Оптимизация спелла, где используются группы
|
|
FatalBlade | Дата: Среда, 21 Сентября 2011, 23:33:17 | Сообщение # 1 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Например у меня есть спелл который подсчитывает юнитов трупов вокруг героя, с помощью группы юнитов, а затем с помощью цикла, через какое то время взрывает их, нанося урон всем кто стоит возле трупов. Как это сделать не используя глобалки? Не сохранять же каждого пикнутого юнита в хэш? Их может быть хоть 50! А то и больше Вот спелл:
Code function Trig_Explode_Corpses_Conditions takes nothing returns boolean if ( GetSpellAbilityId() == 'A0QT' ) then return true endif return false endfunction
function Trig_Explode_Corpses_Func004A takes nothing returns nothing if ( IsUnitDeadBJ(GetEnumUnit()) == true ) then set udg_ECLocs[udg_ECIndex] = GetUnitLoc(GetEnumUnit()) call CreateUnitAtLoc( GetOwningPlayer(GetSpellAbilityUnit()), 'h007', udg_ECLocs[udg_ECIndex], 0.00 ) set udg_DummyEC[udg_ECIndex] = GetLastCreatedUnit() set udg_ECIndex = udg_ECIndex + 1 call RemoveUnit( GetEnumUnit() ) endif endfunction
function Trig_Explode_Corpses_Actions takes nothing returns nothing local integer l = GetUnitAbilityLevel(GetSpellAbilityUnit(), GetSpellAbilityId()) set udg_ECIndex = 1 set udg_ECIndexOverall = 0 set udg_ECPoint = GetUnitLoc(GetSpellAbilityUnit()) call ForGroup( GetUnitsInRangeOfLocAll(900.00, udg_ECPoint), function Trig_Explode_Corpses_Func004A ) call DestroyGroup(GetLastCreatedGroup()) if ( l == 1 ) then set udg_ECDamage = 50.00 endif if ( l == 2 ) then set udg_ECDamage = 65.00 endif if ( l == 3 ) then set udg_ECDamage = 85.00 endif if ( l == 4 ) then set udg_ECDamage = 110.00 endif if ( l == 5 ) then set udg_ECDamage = 140.00 endif if ( l == 6 ) then set udg_ECDamage = 175.00 endif if ( l == 7 ) then set udg_ECDamage = 215.00 endif if ( l == 8 ) then set udg_ECDamage = 260.00 endif if ( l == 9 ) then set udg_ECDamage = 310.00 endif if ( l == 10 ) then set udg_ECDamage = 365.00 endif call StartTimerBJ( udg_TimerEC, false, 0.40 ) endfunction
//=========================================================================== function InitTrig_Explode_Corpses takes nothing returns nothing set gg_trg_Explode_Corpses = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Explode_Corpses, EVENT_PLAYER_UNIT_SPELL_CAST ) call TriggerAddCondition( gg_trg_Explode_Corpses, Condition( function Trig_Explode_Corpses_Conditions ) ) call TriggerAddAction( gg_trg_Explode_Corpses, function Trig_Explode_Corpses_Actions ) endfunction
Code Events Time - TimerEC expires Conditions Actions Set ECIndexOverall = ECIndex Set ECIndex = 1 For each (Integer A) from 1 to ECIndexOverall, do (Actions) Loop - Actions Unit - Cause DummyEC[ECIndex] to damage circular area after 0.00 seconds of radius 180.00 at ECLocs[ECIndex], dealing ECDamage damage of attack type Spells and damage type Force Special Effect - Create a special effect at ECLocs[ECIndex] using Units\Undead\Abomination\AbominationExplosion.mdl Special Effect - Destroy (Last created special effect) Set ECIndex = (ECIndex + 1) Sound - Play ImpaleLand <gen> at 100.00% volume, located at ECPoint with Z offset 10.00 Countdown Timer - Start TimerEC1 as a One-shot timer that will expire in 1.00 seconds
Code Events Time - TimerEC1 expires Conditions Actions Set ECIndexOverall = ECIndex Set ECIndex = 1 For each (Integer A) from 1 to ECIndexOverall, do (Actions) Loop - Actions Custom script: call RemoveUnit(udg_DummyEC[udg_ECIndex]) Set DummyEC[ECIndex] = No unit Custom script: call RemoveUnit(udg_DummyEC[udg_ECIndex]) Custom script: call RemoveLocation(udg_ECLocs[udg_ECIndex]) Set ECIndex = (ECIndex + 1) Custom script: call RemoveLocation(udg_ECPoint)
|
|
|
|
lawson | Дата: Среда, 21 Сентября 2011, 23:39:06 | Сообщение # 2 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (FatalBlade) Как это сделать не используя глобалки? Не сохранять же каждого пикнутого юнита в хэш? Сделать через локалки что так трудно? Сохраняй группу в хеш а не каждого юнита.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Среда, 21 Сентября 2011, 23:42:20 |
|
|
|
FatalBlade | Дата: Четверг, 22 Сентября 2011, 01:48:22 | Сообщение # 3 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (lawson) Сохраняй группу в хеш а не каждого юнита. SaveGroupHandle(бла бла бла)? Или как?Добавлено (22 Сентябрь 2011, 01:48:22) --------------------------------------------- И если например мне надо сосчитать количество этих пикнутых юнитов? Как это сделать без глобалок? Ведь опять же я не могу сувать в хэш каждый раз насчитанное количество пикнутых юнитов
|
|
|
|
FkoFF | Дата: Четверг, 22 Сентября 2011, 04:30:19 | Сообщение # 4 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| omfg...
function Trig_Explode_Corpses_Func004A takes nothing returns nothing if ( IsUnitDeadBJ(GetEnumUnit()) == true ) then set udg_ECLocs[udg_ECIndex] = GetUnitLoc(GetEnumUnit()) call CreateUnitAtLoc( GetOwningPlayer(GetSpellAbilityUnit()), 'h007', udg_ECLocs[udg_ECIndex], 0.00 ) set udg_DummyEC[udg_ECIndex] = GetLastCreatedUnit() set udg_ECIndex = udg_ECIndex + 1 call RemoveUnit( GetEnumUnit() ) endif endfunction
createunitatloc?! GetLastCreatedUnit()
что это за ужас?!
set udg_DummyEC[udg_ECIndex]=CreateUnit(GetSpellAbilityUnit()), 'h007', x,y,.0)
уж лучше хэш и таймеры чем так как ты это делаешь, правда )
Кстати, что то я действий по смещению массива не вижу, право слово - странно.
P.S *Facepalm* --> call TriggerRegisterAnyUnitEventBJ( gg_trg_Explode_Corpses, EVENT_PLAYER_UNIT_SPELL_CAST ) EVEN_PLAYER_UNIT_SPELL_EFFECT, ибо то что ты использовал - совсем не то.
|
|
|
|
Ty3uK | Дата: Четверг, 22 Сентября 2011, 07:08:42 | Сообщение # 5 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Это называется гуи -> жасс, путем конвертирования в текст
|
|
|
|
Mep3aB4uK | Дата: Четверг, 22 Сентября 2011, 15:32:14 | Сообщение # 6 |
9 уровень
Группа: Проверенные
Сообщений: 1019
Награды: 0
Репутация: 135
Блокировки:
| FatalBlade, уствнови аеременную group (отряд) = отряд в радиусе с условием что здоровье юнита <= 0. Установить переменную count (целочисленую) = Количество юнитов в групе (CountUnitInGroup) в радиусе с условием что здоровье юнита <= 0. запустить таймер --------------------------------------------------------------------------------------------------- таймер истекает цыкл от 1 до сount Установить переменную unit (боевая еденица)=1-ый случайный юнит в group ........ пикнуть в радиусе от unit с условием что юнит враг нанести урон пикнутому юниту ......... удалить unit из group Примерно то что ты хотел, надеюсь понятно пояснил
Сообщение отредактировал Mep3aB4uK - Четверг, 22 Сентября 2011, 16:31:59 |
|
|
|
Ty3uK | Дата: Четверг, 22 Сентября 2011, 16:26:07 | Сообщение # 7 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| А совместить фильтр и ForGroup() в одну функцию? И в ней же удалять юнита из группы?
|
|
|
|
Mep3aB4uK | Дата: Четверг, 22 Сентября 2011, 16:34:24 | Сообщение # 8 |
9 уровень
Группа: Проверенные
Сообщений: 1019
Награды: 0
Репутация: 135
Блокировки:
| Ty3uK, если не большой радиус лучше через цыкл (мое мнение), да и так мне удобней. Через цыкл используется внутри той же функции и не надо все нужные локалки переносить через хэндл, к тому же не создается лишняя функция.
Сообщение отредактировал Mep3aB4uK - Четверг, 22 Сентября 2011, 16:39:18 |
|
|
|
Ty3uK | Дата: Четверг, 22 Сентября 2011, 16:41:06 | Сообщение # 9 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Ну... Тоже верно, но группу делать в любом случае, это раз, фильтровать- это два. А если цикл будет большим- может повесить слабую машину
|
|
|
|
Mep3aB4uK | Дата: Четверг, 22 Сентября 2011, 16:47:30 | Сообщение # 10 |
9 уровень
Группа: Проверенные
Сообщений: 1019
Награды: 0
Репутация: 135
Блокировки:
| Ty3uK, Quote (Mep3aB4uK) если не большой радиус лучше через цыкл в небольшом радиксе не превысит
|
|
|
|
Ty3uK | Дата: Четверг, 22 Сентября 2011, 16:48:44 | Сообщение # 11 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Только если там нет кучи дамми уболтал, чертяка языкастый
|
|
|
|
FkoFF | Дата: Четверг, 22 Сентября 2011, 17:09:02 | Сообщение # 12 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| Quote (Ty3uK) но группу делать в любом случае, это раз, фильтровать- это два. 2-3 global groups is enough. Создание локальных групп и их разрушение - лишние действия которые не всегда заканчиваются безболезненно для процессора. Локальные группы актуальны только в том случае, когда требуется выделить каких то юнитов и зарезервировать их на какое-то время. Для мгновенного срабатывания достаточно 2-3 глобалок.
На счет фильтра - лучше конечно через функцию и вбивать в call GroupEnumUnitsInRange(g,x,y,r,here)
|
|
|
|
Ty3uK | Дата: Четверг, 22 Сентября 2011, 17:16:25 | Сообщение # 13 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Да, я про это и говорил и еще отдельно в local filterfunc f = Filter(function фильтр) и call GroupEnumUnitsInRange(группа, координата х, координата у, радиус, f), чтобы потом можно было сделать call DestroyFilter(f) и set f = null
|
|
|
|
lawson | Дата: Четверг, 22 Сентября 2011, 17:23:40 | Сообщение # 14 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (Ty3uK) call DestroyFilter( помоему фильтр не создает утечки.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
FkoFF | Дата: Четверг, 22 Сентября 2011, 17:25:27 | Сообщение # 15 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| Quote (Ty3uK) local filterfunc f = Filter(function фильтр) Quote (Ty3uK) call GroupEnumUnitsInRange(группа, координата х, координата у, радиус, f) Quote (lawson) помоему фильтр не создает утечки. в использованном выше варианте создает.
А вообще можно было просто вписать напрямую Condition(function PewPew) - утечки не будет.
|
|
|
|
lawson | Дата: Четверг, 22 Сентября 2011, 18:30:08 | Сообщение # 16 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (FkoFF) А вообще можно было просто вписать напрямую Condition(function PewPew) - утечки не будет. Хмм а вот дуос говорит что так делают только нубы. Странно как то.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Четверг, 22 Сентября 2011, 18:30:47 |
|
|
|
FkoFF | Дата: Четверг, 22 Сентября 2011, 19:23:02 | Сообщение # 17 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| Quote (lawson) Хмм а вот дуос говорит что так делают только нубы. Странно как то. а смысл вбивать в переменную? Все равно толку никакого. Вызов 1 на всю функцию, утечки нет. Бтв, он сам так делает.
|
|
|
|
lawson | Дата: Четверг, 22 Сентября 2011, 20:02:57 | Сообщение # 18 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (FkoFF) Бтв, он сам так делает. Сам всегда так делаю. дуос ввел меня в заблуждение. Ty3uK, так что там 97% процентов нубов? Хмм
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Четверг, 22 Сентября 2011, 20:32:32 |
|
|
|
Ty3uK | Дата: Четверг, 22 Сентября 2011, 21:32:54 | Сообщение # 19 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Я просто переадресовал слова Добавлено (22 Сентябрь 2011, 20:48:29) --------------------------------------------- Хм, а если это спелл? За десять минут у тебя будет висеть порядка десяти объектов лишних, не? Добавлено (22 Сентябрь 2011, 21:32:54) --------------------------------------------- type conditionfunc extends boolexpr, type filterfunc extends boolexpr, а type boolexpr extends handle. By Duos
|
|
|
|
lawson | Дата: Четверг, 22 Сентября 2011, 21:47:43 | Сообщение # 20 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (Ty3uK) За десять минут у тебя будет висеть порядка десяти объектов лишних, не? Каких объектов? У меня ИИ в 450 строк срабатывает каждую секунду для каждого героя отдельно, там я пикаю всех вокруг юнитов в одну группу с condition() определяю юнита по фильтру а потом группу удаляю и заново пикаю уже других юнитов в нее и так я делаю это 8 раз за секунду для каждого игрока. А теперь представь если использовать твой фильтр для каждой группы. мда будет похоже на припадок сумашедшего, поэтому использую цикл для нахождения нужного юнита, все обнуляю все удаляю ни каких утечек кроме как PolarProjection так как было лень его раксрывать, все работает четко - идеально. Так что НЕ!
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Четверг, 22 Сентября 2011, 21:50:01 |
|
|
|
Ty3uK | Дата: Четверг, 22 Сентября 2011, 22:16:10 | Сообщение # 21 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Да ну? Фильтр и кондишн- это ссылки, которые висят в памяти, если их не уничтожить, разве я не прав? Добавлено (22 Сентябрь 2011, 22:16:10) --------------------------------------------- Омг, полярки не раскрыл? О.о ну ты сотона
|
|
|
|
lawson | Дата: Четверг, 22 Сентября 2011, 22:31:25 | Сообщение # 22 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (Ty3uK) Да ну? Фильтр и кондишн- это ссылки, которые висят в памяти, если их не уничтожить, разве я не прав? Все забей. пользуйся на здоровье фильтрами просто было неприятно обзывать меня нубом.
Quote (Ty3uK) полярки не раскрыл да было такое. да и сейчас до сих пор не раскрыл. Может както займусь ими.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
Ty3uK | Дата: Четверг, 22 Сентября 2011, 22:43:06 | Сообщение # 23 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Я не называл, я процитировал Дусю. Тебя-то я нубом ни в жисть не назвал, сорри если ввел в заблуждение. Насчет фильтров- у всех свои вкусы, сойдемся каждый на своем мнении
|
|
|
|
FatalBlade | Дата: Четверг, 22 Сентября 2011, 22:49:16 | Сообщение # 24 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (FkoFF) createunitatloc?! GetLastCreatedUnit() ээ.. а в чём проблема? Вроде не БЖ. Ну а если проблема в локациях, то чем будут мешать локации, если они удаляются после использования?
Quote (FkoFF) EVENT_PLAYER_UNIT_SPELL_CAST ) EVEN_PLAYER_UNIT_SPELL_EFFECT, ибо то что ты использовал - совсем не то. Почему? Событие работает, триггер работает. Да и разве GetSpellAbilityUnit() является обозначением для EVEN_PLAYER_UNIT_SPELL_EFFECT ?
|
|
|
|
lawson | Дата: Четверг, 22 Сентября 2011, 22:50:51 | Сообщение # 25 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (FatalBlade) GetSpellAbilityUnit() GetTriggerUnit() это будет болле правильней!
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Четверг, 22 Сентября 2011, 22:52:27 |
|
|
|