[Вопрос] Максимальная оптимизация периодического триггера
|
|
Ty3uK | Дата: Суббота, 07 Января 2012, 12:11:17 | Сообщение # 26 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Собственно в какой-то теме я ему это уже говорил
|
|
|
|
FatalBlade | Дата: Суббота, 07 Января 2012, 13:25:44 | Сообщение # 27 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| А как вот это сделать в фильтре? Code call GroupEnumUnitsOfType( g, UnitId2String('n00J'), null ) loop set un = FirstOfGroup(g) exitwhen un == null call GroupRemoveUnit( g, un ) set i = GetPlayerId(GetOwningPlayer(un)) + 1 set x = GetWidgetX(udg_HeroesPlaying[i]) set y = GetWidgetY(udg_HeroesPlaying[i]) call SetUnitX( un, x ) call SetUnitY( un, y ) endloop
Сообщение отредактировал FatalBlade - Суббота, 07 Января 2012, 13:26:17 |
|
|
|
Ty3uK | Дата: Суббота, 07 Января 2012, 13:38:32 | Сообщение # 28 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Эти действия в фильтре просто делаешь. Без условий. И возвращает истину Добавлено (07 Январь 2012, 13:38:32) --------------------------------------------- А не, ложь. Ты же потом удаляешь их из группы
|
|
|
|
FatalBlade | Дата: Суббота, 07 Января 2012, 13:48:05 | Сообщение # 29 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (Ty3uK) Эти действия в фильтре просто делаешь. Без условий. И возвращает истину А есть тогда в этом смысл? Просто локальную группу всё равно приходится использовать, ведь для GroupEnumUnitsOfTypeнужна переменная-группа. Так в добавок ещё и функцию новую запускать.
Аналогичный вопрос вот с этим. Не обращайте внимание на переменные и что они значат. Code loop set un = FirstOfGroup(g) exitwhen un == null call GroupRemoveUnit(g, un) set p2 = GetOwningPlayer(un) if IsPlayerAlly( p2, p1 ) == false and p2 != p1 and check[o] == true then set check[o] = false set dx = GetWidgetX(un) - x0 set dy = GetWidgetY(un) - y0 set d = SquareRoot( dx * dx + dy * dy ) if d <= 1000 then set mod = 1.00 elseif d <= 1500 and d > 1000 then set mod = 0.80 elseif d <= 2000 and d > 1500 then set mod = 0.60 elseif d > 2000 then set mod = 0.40 endif call SetPlayerState( p2, PLAYER_STATE_RESOURCE_GOLD, (GetPlayerState(p2, PLAYER_STATE_RESOURCE_GOLD)) + R2I( result * mod ) ) endif endloop
|
|
|
|
Ty3uK | Дата: Суббота, 07 Января 2012, 13:51:19 | Сообщение # 30 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Цикл с таким перебором может на время повесить комп, когда как фильтр нет. Плюс, можно создать глобальную группу для таких случаев- если фильтр возвращает ложь, то юнит не добавляется. Но действия в фильтре для него совершаются. Надеюсь, ты понял
|
|
|
|
lawson | Дата: Суббота, 07 Января 2012, 14:20:25 | Сообщение # 31 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| FatalBlade, Кароче вот смотри что тебе долбят уже столько времени: Как пользоваться фильтром, возможны грамматический ошибки изза того что писал от руки.
function FilterCondition takes nothing return boolean local unit u = GetFilterUnit() ACTIONS // Дальше все действия с юнитами return false// Даст тебе возможность не записывать юнитов в группу по окончанию действий с ними endfunction
function TriggerFunction takes nothing returns nothing call GroupEnumUnitsInRange( глобальнаяГруппа, GetWidgetX(un), GetWidgetY(un), 900., Filter-Condition(function FilterCondition)) \\Можно использовать или фильтр или сондишн, без разницы endfunction
Изза того что юниты в ГлобальнуГруппу так и не попадают по окончанию дейтсвия в фильтре, она остается пустой и можно использовать одну группу для всех действий.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 07 Января 2012, 14:27:24 |
|
|
|
FatalBlade | Дата: Суббота, 07 Января 2012, 14:36:44 | Сообщение # 32 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| lawson, ок. Но в данном случае, я не могу использовать глобалку, потому что событие всего этого код - Юнит Умирает. И переменную Юнит тоже не могу использовать глобальной, так как этот код может запуститься одновременно хоть 100500 раз. Как тут быть?
Code if IsPlayerAlly( p2, p1 ) == false and p2 != p1 and check[o] == true then Вот это я хочу что бы проверял фильтр. p1 = Владелец убитого юнита. p2 = Владелец очередного пикнутого юнита в радиусе 2500 от убитого юнита check[o] = Это проверяет, что если у данного игрока уже есть юнит в радиусе 2500 от убитого, то не пикать. Если нету - пикнуть.
Как сохранить игрока в Фильтр. Я не могу использовать тут глобалку, потому что этот триггер может запускаться много раз в одно и то же время.
Сообщение отредактировал FatalBlade - Суббота, 07 Января 2012, 14:42:47 |
|
|
|
SirNikolas | Дата: Суббота, 07 Января 2012, 15:05:46 | Сообщение # 33 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (FatalBlade) И переменную Юнит тоже не могу использовать глобальной, так как этот код может запуститься одновременно хоть 100500 раз. FatalBlade, если ты не используешь wait (а ведь ты его не используешь, я надеюсь?), тебе не надо думать о возможности параллельного запуска.Добавлено (07 Январь 2012, 15:05:46) ---------------------------------------------
Quote (FatalBlade) Я не могу использовать тут глобалку, потому что этот триггер может запускаться много раз в одно и то же время. ^ same.
|
|
|
|
FatalBlade | Дата: Суббота, 07 Января 2012, 15:14:05 | Сообщение # 34 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (SirNikolas) FatalBlade, если ты не используешь wait (а ведь ты его не используешь, я надеюсь?), Вейты не использую.
Quote (SirNikolas) тебе не надо думать о возможности параллельного запуска. То что ты вчера писал, насчёт глобалки, то да, там проверяется всё поочерёдно, потому что проверяется оно каждую секунду. Здесь же, событие Юнит Умирает. Разве не могут юниты умереть одновременно? Вот например: Герой заюзал спелл который наносит урон врагам вокруг. Допустим всех врагов вокруг этот спелл убил. Вот тебе и паралельный запуск.
|
|
|
|
lawson | Дата: Суббота, 07 Января 2012, 15:23:53 | Сообщение # 35 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (FatalBlade) могут юниты умереть одновременно? Да хоть 100500 раз могут - для человеческого глаза, а для триггера наплевать, для триггера все равно они умирают поочередно.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 07 Января 2012, 15:25:58 |
|
|
|
FatalBlade | Дата: Суббота, 07 Января 2012, 15:35:22 | Сообщение # 36 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (lawson) Да хоть 100500 раз могут - для человеческого глаза, а для триггера наплевать, для триггера все равно они умирают поочередно. Даже если они умерли посредством UnitDamagePoint(bla bla bla)?
|
|
|
|
SirNikolas | Дата: Суббота, 07 Января 2012, 15:37:15 | Сообщение # 37 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Да. Добавлено (07 Январь 2012, 15:37:15) --------------------------------------------- Не юзай UnitDamagePoint! Жутко глючит.
|
|
|
|
FatalBlade | Дата: Суббота, 07 Января 2012, 15:46:02 | Сообщение # 38 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (SirNikolas) Не юзай UnitDamagePoint! Жутко глючит. хз.. Сколько юзаю, не разу не косячило.
|
|
|
|
SirNikolas | Дата: Суббота, 07 Января 2012, 15:58:51 | Сообщение # 39 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Со зданиями глюки. И оно дамажит союзников.
|
|
|
|
FatalBlade | Дата: Суббота, 07 Января 2012, 16:03:27 | Сообщение # 40 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (SirNikolas) Со зданиями глюки. Зданий на карте нету)
Quote (SirNikolas) И оно дамажит союзников. Иногда мне как раз это и нужно, что бы дамажило и врагов и союзников.
|
|
|
|
Ty3uK | Дата: Суббота, 07 Января 2012, 16:26:02 | Сообщение # 41 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Втф. Без разницы как. Поинт тоже наносит урон юнитам по-очереди
|
|
|
|