Есть триггер в 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, триггеры выполняются в разных потоках, но при этом изменение внешних данных происходит синхронно
в одно и тоже время например глобалка могла бы иметь не одно значение, а значит были бы баги.
Да, баги будут и есть
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.