Есть триггер в Jass
function Trig_fire_Actions takes nothing returns nothing
    local unit BET
    local unit BEC
    set BET = GetSpellTargetUnit()
    set BEC = GetSpellAbilityUnit()
    call TriggerSleepAction( ( DistanceBetweenPoints(GetUnitLoc(BEC), GetUnitLoc(BET)) / 1000.00 ) )
    call SetUnitMoveSpeed( BET, 500.00 )
    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = 20
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        call IssuePointOrderLocBJ( BET, "move", GetRandomLocInRect(RectFromCenterSizeBJ(GetUnitLoc(BET), 500.00, 500.00)) )
        call UnitDamageTargetBJ( BEC, BET, 5, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL )
        call TriggerSleepAction( 0.50 )
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
    call SetUnitMoveSpeed( BET, GetUnitDefaultMoveSpeed(BET) )
    call IssueImmediateOrderBJ( BET, "stop" )
endfunction
На пустой карте любых размеров работает корректно, даже при выборе области всей карты, а не только вокруг юнита, количество войск на карте не влияет, рельеф карты не пробовал. Принадлежность цели не важна, хоть игрок, хоть комп, хоть нейтрал.
При использовании в точно таком же виде на основной карте вызывает дикие тормоза, вплоть до зависания игы на все время действия триггера, потом отлагивает, чем меньше периодичность - тем сильнее лаги (при >2 cек периода лагает заметно слабее, чем при 0.3).
В чем может быть проблема? Конфликт с другими триггерами (выключать по одному и тестить долго и нудно, больше 50 триггеров в основной карте)? Сложности в вычислении пути по рельефу (пробовал пересчитать пути, не помогло)?

Принятый ответ

Не юзай TriggerSleepAction и будет тебе счастье. Особенно когда юзаешь глобальные переменные, вполне вероятно, что конфликт
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
29
9 лет назад
0
Не юзай TriggerSleepAction и будет тебе счастье. Особенно когда юзаешь глобальные переменные, вполне вероятно, что конфликт
Принятый ответ
0
11
9 лет назад
Отредактирован Impertus
0
Который из? Первый это только задержка снаряда до цели, он срабатывает один раз; который в цикле - ну хз, а как без него делать периодичность? Таймер, я думаю, куда сильнее нагружать будет. Не думаю что в нем проблема.
И почему на пустой карте все в порядке тогда?
С какой триггерной строкой может быть конфликт? Пробовал с самого старта карты, когда нет ни одного еще запущенного периодика или утечки памяти - все равно лаги.
0
29
9 лет назад
0
Impertus, оба, используй таймеры. Конфликт с каким то другим триггером. Попробуй заменить bj_forLoopAIndex на локалки.
IssuePointOrderLocBJ
Тут вообще утечка
DistanceBetweenPoints
на этой строчке целых 2
0
11
9 лет назад
0
bj_forLoopAIndex на локалки не помогло, насчет оптимизации попозже подумаю.
Может ли быть конфликт с Custom Value, так в списке реакций на урон 6-7 триггеров? Или с каким действием\условием может быть конфликт, чтобы сузить круг подозреваемых?
Кстати заметил, что в лагах приказ цели двигаться в рандомную точку не выполняется, она продолжает делать что делала, может там баг какой?
2
28
9 лет назад
2
Impertus, нефиг юзать вейты и локейшены
2
5
9 лет назад
2
НИКОГДА НЕ ЮЗАЙ TriggerSleepAction,ждать условия и PolledWait в циклах!!!! да и вообще никогда их не юзай в картах для мультиплеера темболее. далее у тебя триггер утечный.
при >2 cек периода лагает заметно слабее, чем при 0.3 => это вообще жесть, так как ты юзаешь вейты с задержкой большей чем периодичность триггера...отсюда и вообще черт знает что может вылезти, даже фатал иногда.
"Impertus, оба, используй таймеры. Конфликт с каким то другим триггером. Попробуй заменить bj_forLoopAIndex на локалки.
IssuePointOrderLocBJ
Тут вообще утечка
DistanceBetweenPoints
на этой строчке целых 2"
это вообще не виляет в данном случае, варик пока не закончит один триггер не приступает к другому. так что глобалки или локалки в данном случае не важно.
4
28
9 лет назад
4
варик пока не закончит один триггер не приступает к другому
да?
блин оказывается куча систем основанных на параллельном выполнении триггерров не работает на самом деле
похоже 80% наработок кажутся рабочими лишь потому что я под лсд
пойду повешусь

pusha1999, если пишите чтото то просьба сначала убедитесь в том что ваше утверждение верно
0
5
9 лет назад
0
nvc123:
варик пока не закончит один триггер не приступает к другому
да?
блин оказывается куча систем основанных на параллельном выполнении триггерров не работает на самом деле
похоже 80% наработок кажутся рабочими лишь потому что я под лсд
пойду повешусь

pusha1999, если пишите чтото то просьба сначала убедитесь в том что ваше утверждение верно
каких систем? вы чо несете? еслибы варик был мультипоточный то например если сделать 10 триггеров с периодическим событием в 0.02 секунды и в каждом треггере менять цвет юнита на неповторяющийся, то цвет юнита был бы один и не менялся никогда. если пишете мне подобный коммент, просьба убедиться в своей адекватности и в своих знаниях...
0
29
9 лет назад
0
pusha1999, кажется ты слегка перегнул палку со своей самоуверенностью
кст, там же и ответ на вопрос
0
5
9 лет назад
0
alexprey, причем тут что когда обрабатывается? я вообще про другое. я про то что варик не обрабатывает одновременно все триггеры, а делает это последовательно. потомучто если бы он обрабатывал все триггеры одновременно, то в одно и тоже время например глобалка могла бы иметь не одно значение, а значит были бы баги. и я про то что пока варик не выполнит функцию, он не перескакивает к другой
2
29
9 лет назад
2
pusha1999, триггеры выполняются в разных потоках, но при этом изменение внешних данных происходит синхронно
в одно и тоже время например глобалка могла бы иметь не одно значение, а значит были бы баги.
Да, баги будут и есть
0
5
9 лет назад
0
alexprey, смотря как глобалка реализована...например если ты запустишь 2 периодических триггера одновременно с одинаковым интервалом и там будут в гуи для каждого числа А делать то то и тото, то те глобалки которые для цикла используются bj_loopindexA и т.д. не будут иметь разные значения одновременно, и бага не будет. ну короче я надеюсь ты понял о чем я, а если ты используешь глобалку для спелла или еще чегото, которая будет для разных игроков одна, то баги будут, но баги будут изза неправильной реализации только того кто пишет а не изза того что триггер выполняется одновременно с другим как вы утверждаете тут)) хотя это не так всетаки. я это тестил и не говорю на пустом месте. если нужен прув всетаки. я могу скинуть мапу с этим тестом и сам убедишься)
0
25
9 лет назад
0
Человек совершенно не рзбирается, а все равно талдычит свое...
0
5
9 лет назад
Отредактирован Uber
0
куда уж мне до тебя...ты хоть одну мапу сделал от начала до конца со сложными алгоритмами? я принял участие не в одном проекте как автор скриптов и помог профиксить многим их мапы а ты только херню пишешь. ты ответь на вопрос автора по существу лучше, чем комментить даже сам не зная что и о чем. отмороженая жаюа не одного гера украла у меня с хайва в свою вонючую доту. а ты покажи свои работы, я могу выложить свои и посмотрим кто разбирается а кто нет. и кто как что реализовывает, а то херню писать то все могут, а на деле 0
1 пункт от Uber: 1.1 (ненормативная лексика) Завуалированный мат
0
20
9 лет назад
0
pusha1999, на хайве у тебя только несколько тех же пафосных сообщений, какой у тебя ник тогда был?
0
28
9 лет назад
0
смотри карту и не неси бред
2 триггера выполняются одновременно
из за этого предмет исчезает но его эффект остаётся
перед тем как писать что либо хотя бы посмотри как в вар3 реализованы триггеры
Загруженные файлы
Этот комментарий удален
0
11
9 лет назад
Отредактирован Impertus
0
Ну вы и наваяли холивара :)
По сути, переделал на таймеры, только вот с ними еще не работал, а гайдов по работе с таймерами нет вообще
function New takes nothing returns nothing
    local unit BET = GetSpellTargetUnit()
    local unit BEC = GetSpellAbilityUnit()
    local integer BECount = 1
    local timer t = CreateTimer()
    call SetUnitMoveSpeed( BET, 500.00 )
    call TimerStart(t, 0.5, true, function New )
    loop
        exitwhen BECount > 20
        call TimerGetElapsed ( t )
        call IssuePointOrderLocBJ( BET, "move", GetRandomLocInRect(GetPlayableMapRect()) )
        call UnitDamageTargetBJ( BEC, BET, 5, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL )
        set BECount = BECount + 1
    endloop
    call SetUnitMoveSpeed( BET, GetUnitDefaultMoveSpeed(BET) )
    call IssueImmediateOrderBJ( BET, "stop" )
    set BET = null
    set BEC = null
    set BECount = 0
    call DestroyTimer ( t )
endfunction
Сейчас вот в таком виде, но не работает) Наносит весь урон сразу, и завершается тоже сразу. Как поправить? Каждый раз стартовать таймер (засунуть его в цикл) не помогает
0
37
9 лет назад
0
Я тут даже рисунок рисовал, как это происходит) xgm.guru/p/wc3/code-flow-and-data-access-thread
Impertus:
гайдов по работе с таймерами нет вообще
У нас 30% форума - гайды по работе с таймерами =\
И статьи есть xgm.guru/p/wc3/w3_special_programming
Чтобы оставить комментарий, пожалуйста, войдите на сайт.