Вообщем суть вопроса такова - критично ли для карты наличие кучи триггеров с одинаковым условием, которые могли бы быть одним триггером, только сделанным через if do else(одно условие, к примеру "A Unit завершает строительство" и много if do else с разными юнитами и действиями) ? Нужно ли их собирать в один, или можно оставить как есть ? Недавно я обращался сюда по поводу странных багов в карте из за триггеров с условием A Unit Enters region, их было около 10 и после создания ещё пары таких триггеров, они стали вызывать баги. После того, как по вашему совету я собрал их в один(через if do else), баг перестал появляться.
Прикрепил пару примеров триггеров, которых можно было бы(но нужно ли?) обьединить. Хотелось бы понять, влияет ли это на работоспособность карты.

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

Или заменяются только те, у которых не написано "Реакция на событие"
Заменяются все глобальные переменные. Например, последний созданный юнит - глобальная переменная. Реакции на событие всегда нативки, но вот что из них перезаписывается, а что нет - не могу сказать, надо тестировать вручную.
GetLocalPlayer:
но на практике это не имеет смысла.
Имеет большой смысл, потому что 1 триггер проще дебажить, что 100500. Более того, события могут конфликтовать, так как триггер с удалением юнита может сработать раньше, и для всех других триггеров с таким же событием юнита уже не будет. Что уж говорить про события каста.
GetLocalPlayer:
Между тем есть такая вещь как лимит операций, в который ты можешь когда-нибудь упереться если делать все через один триггер.
Скорее лимит операций будет достигнут во время инициализации при 100500 триггеров, чем при 1 триггере с if\then\else. А тут ещё есть Lua, где можно нормально сохранять функции, так что даже if\then\else не нужен. Аналогично, но немного хуже можно сделать и на Jass.

crusader556, делать надо так, как будет удобней. На GUI if\then\else сделан криво, потому удобнее будет делать несколько триггеров. Но тогда надо будет следить за ними, чтобы они не конфликтовали.
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
4
5 лет назад
Отредактирован Black Soul
2
В первую очередь, объединять похожие триггеры нужно для своего же удобства, ведь гораздо лучше, когда на карте 50 триггеров, а не 100. Раз у тебя происходили баги из-за множества триггеров, то тогда тем более.
У тебя на скриншотах ожидание 0.05 секунд. За это время constructed structure может быть заменено на другого юнита. Поменяй на triggering unit, чтобы не возникало багов.
4
28
5 лет назад
4
У тебя на скриншотах ожидание 0.05 секунд. За это время constructed structure может быть заменено на другого юнита. Поменяй на triggering unit, чтобы не возникало багов.
Нет, проблемы не будет.
Загруженные файлы
2
4
5 лет назад
Отредактирован Black Soul
2
PT153, странно. Я думал, что эти переменные заменяются. Или заменяются только те, у которых не написано "Реакция на событие"?
2
26
5 лет назад
2
Black Soul, там лучше вручную всё проверять, есть случаи, в которых не будет правильно работать. Из-за этих случаев распространили ложную информацию, что все эти переменные всегда изменяются.
2
26
5 лет назад
2
уменьшение числа триггеров положительно сказывается на карте
3
17
5 лет назад
3
Не критично. Конечно же тут появятся специалисты грызущие глотку за каждую сотую долю процента производительности, но на практике это не имеет смысла. Между тем есть такая вещь как лимит операций, в который ты можешь когда-нибудь упереться если делать все через один триггер.
3
28
5 лет назад
Отредактирован PT153
3
Или заменяются только те, у которых не написано "Реакция на событие"
Заменяются все глобальные переменные. Например, последний созданный юнит - глобальная переменная. Реакции на событие всегда нативки, но вот что из них перезаписывается, а что нет - не могу сказать, надо тестировать вручную.
GetLocalPlayer:
но на практике это не имеет смысла.
Имеет большой смысл, потому что 1 триггер проще дебажить, что 100500. Более того, события могут конфликтовать, так как триггер с удалением юнита может сработать раньше, и для всех других триггеров с таким же событием юнита уже не будет. Что уж говорить про события каста.
GetLocalPlayer:
Между тем есть такая вещь как лимит операций, в который ты можешь когда-нибудь упереться если делать все через один триггер.
Скорее лимит операций будет достигнут во время инициализации при 100500 триггеров, чем при 1 триггере с if\then\else. А тут ещё есть Lua, где можно нормально сохранять функции, так что даже if\then\else не нужен. Аналогично, но немного хуже можно сделать и на Jass.

crusader556, делать надо так, как будет удобней. На GUI if\then\else сделан криво, потому удобнее будет делать несколько триггеров. Но тогда надо будет следить за ними, чтобы они не конфликтовали.
Принятый ответ
2
26
5 лет назад
2
GetLocalPlayer:
Не критично. Конечно же тут появятся специалисты грызущие глотку за каждую сотую долю процента производительности, но на практике это не имеет смысла. Между тем есть такая вещь как лимит операций, в который ты можешь когда-нибудь упереться если делать все через один триггер.
в лимит операций ты так же упрешься если будешь плодить триггеры бездумно
0
12
5 лет назад
0
PT153:
crusader556, делать надо так, как будет удобней. На GUI if\then\else сделан криво, потому удобнее будет делать несколько триггеров. Но тогда надо будет следить за ними, чтобы они не конфликтовали.
В каком смысле криво ? Это же по сути тоже самое, что и обычные отдельные триггеры, только собранные в кучку с помощью if\then\else. Так или иначе Jass я не осилю, а Lua будет смысл юзать только в reforged.(да и нет такой возможности щас, карта делается на 1.26а)
Прикрепил скрин триггера, правильно ли я делаю ?(один триггер специально раскрыл, другие скрыты т.к однотипные)
Загруженные файлы
2
28
5 лет назад
Отредактирован PT153
2
В каком смысле криво ?
В Jass.
If something then

elseif something then

elseif something then

else

endif
В GUI можно сделать только так.
If something then

else
    if something then

    else

    endif
endif
Прикрепил скрин триггера, правильно ли я делаю ?
Почти. Убери Do nothing, а в каждый Then добавь в самый конец Skip remaining actions. Или делай ветвление if\then\else, но это некрасиво.
2
17
5 лет назад
Отредактирован GetLocalPlayer
2
Скорее лимит операций будет достигнут во время инициализации при 100500 триггеров, чем при 1 триггере с if\then\else.
Ну как же. Это верно если бы все условия для всех триггеров в карте были простые, однострочные, но они могут иметь вложенные конструкции и растягиваться на множество операций, в отличии от предсказуемой инициализации триггеров.
PT153:
Что уж говорить про события каста.
По этому поводу в самой теме хорошо высказались. Использовать подобный код - плохая практика. Все зависимости должны быть предусмотрены на этапе разработки, а не выявлены когда все покатилось как снежный ком.
0
12
5 лет назад
0
PT153:
Почти. Убери Do nothing, а в каждый Then добавь в самый конец Skip remaining actions. Или делай ветвление if\then\else, но это некрасиво.
То есть в "То - Действия" нужно после всех моих действий там вписывать Skip remaining actions, чтобы оно пропускало "Иначе - действия", т.к там у меня ничего нет. Да ?
2
4
5 лет назад
2
crusader556:
То есть в "То - Действия" нужно после всех моих действий там вписывать Skip remaining actions, чтобы оно пропускало "Иначе - действия", т.к там у меня ничего нет. Да ?
Нет. Это нужно для того, чтобы после выполнения одного if/then/else триггер завершал свое действие, а не продолжал сравнивать оставшиеся. Из-за этого в некоторых случаях может сработать несколько конструкций if/then/else.
2
26
5 лет назад
2
Возможно Skip remaining actions не обрубает триггер, а продолжает выполнять его, но реализуя действия как бы в невидимом режиме, то есть без влияния на процесс игры. Потому что пытался осуществить сброс всех диалогов кампании через одну переменную, но сбросив один диалог и начав следующий, появлялись реплики из скипнутого диалога, словно он не завершался, а продолжает идти.
Тогда смысла везде ставить Skip remaining actions нет.
4
28
5 лет назад
4
Skip remaining actions
Это просто return в JASS, вот и всё, после этого слова триггер завершается, так как триггер в GUI состоит из одной функции.
А диалоги багнуты чутка, их лучше всего скрывать через EnableUserInterface.
2
26
5 лет назад
2
Что-то не понял про багнутость диалогов. Вот конкретный случай:
  • Есть логическая переменная Skip;
  • Есть один диалог, в самом начале которого Skip=Нет, дальше между репликами стоит If Skip=Да Then Skip remaining actions Else пусто;
  • Есть второй такой же диалог;
  • Есть триггер с событием нажатия Esc и действием Skip=Да.
Если начать первый диалог и завершить, потом начать второй, то его будут прерывать реплики первого, словно он не завершался, хотя там же return произошёл, то есть действия должны прекратить выполнение. При этом, если сделать для двух диалогов переменные Skip1 и Skip2, то всё исправно работает.
4
29
5 лет назад
4
При этом, если сделать для двух диалогов переменные Skip1 и Skip2, то всё исправно работает.
После завершения первого диалога Skip возвращается в false?
0
26
5 лет назад
0
Нет.
Только с началом второго.
0
28
5 лет назад
0
8gabriel8, какое действие GUI делает всё это?
0
26
5 лет назад
0
Давайте-ка, немного позже опять сделаю и проверю, а то может не то говорю, так как напечатал по памяти и делал давно. Просто сейчас оцениваю кампанию Rare, игровой процесс занят, прерывать проверкой не хочу)
0
12
5 лет назад
0
Простой вопрос, так мне пихать Skip remaining actions в триггеры или нет ?
0
26
5 лет назад
0
От этого смысла примерно столько же, как от удаления действия Do nothing. То есть вообще незаметно.
0
28
5 лет назад
Отредактирован PT153
0
То есть в "То - Действия" нужно после всех моих действий там вписывать Skip remaining actions, чтобы оно пропускало "Иначе - действия", т.к там у меня ничего нет. Да ?
Условия на то и условия, что либо выполнится ветка then, либо ветка else. Black Soul верно ответил, это для того, чтобы другие условия пропускались. На твоём скриншоте код выглядит так.
код
If something1 then
    // actions
endif

if something2 then
    // actions
endif
В этом случае, даже если something1 = true, второе условие будет всё равно проверятся. Тебе же нужно, чтобы при обнаружении нужного условия остальные не выполнялись. Потому нужно сделать так.
код
If something1 then
    // actions
    return
endif

if something2 then
    // actions
    return  // Если это условие в самом конце, то return необязателен.
endif
От этого смысла примерно столько же, как от удаления действия Do nothing. То есть вообще незаметно.
?
0
26
5 лет назад
Отредактирован 8gabriel8
0
PT153:
?
Насколько процентов снизится нагрузка на процессор?
0
28
5 лет назад
0
8gabriel8, простая оптимизация. Очень легко делается, а при срабатывании триггера проверяются не все условия.
Можно сделать по другому, для каждого спела в соответствие поставить триггер и вызывать его, передавая аргументы через глобалки.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.