Неоднократно встречал утверждения о глючности и непредсказуемости действия "Wait", хотя сам его глючности и непредсказуемости не замечал. Вопрос в заголовке.

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

Эта сволочь продолжает работать при паузах
Разве? :hmm: Часто проверял эту ерунду на работу в паузах, положительный результат не давало.
Вейт плох своей неточностью, могут быть отклонения по несколько миллисек.
Вейт 0.00 сек = вейту 0.10 сек, при этом неточности не будет, он будет ровно 0.1
Вейт нельзя запаузить как таймер или остановить, вейт паузит действия триггера, что идут после него.
Использовать вейт или нет - всегда зависит от ситуации. В основном его удобно юзать, когда не будет проблемы обращения к объекту вызвавшему событие.

Например юнит произнёс спелл
убрать эффект [номер юнита или игрока]
Создать спецэффект на юните
присвоить эффект [номер юнита или игрока] = этот эффект
вейт 2.5 сек
убрать эффект [номер юнита или игрока]
  • создавать определённый эффект на юните на время...

Или во время махинаций с предметами, скиллами, морфами и т.п. могут случаться баги из-за мгновенной обработки и часто там можно влепить вейт 0.00 сек, который не принесёт проблем, а пользу принесёт.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
24
9 лет назад
0
В циклах, либо триггерах, где события выполняются слишком часто.
6
10
9 лет назад
Отредактирован iCCupPlatoon
6
Эта сволочь продолжает работать при паузах, да и просто баговый, блин.
Используй локальные таймеры.
5
24
9 лет назад
5
Эта сволочь продолжает работать при паузах
Разве? :hmm: Часто проверял эту ерунду на работу в паузах, положительный результат не давало.
Вейт плох своей неточностью, могут быть отклонения по несколько миллисек.
Вейт 0.00 сек = вейту 0.10 сек, при этом неточности не будет, он будет ровно 0.1
Вейт нельзя запаузить как таймер или остановить, вейт паузит действия триггера, что идут после него.
Использовать вейт или нет - всегда зависит от ситуации. В основном его удобно юзать, когда не будет проблемы обращения к объекту вызвавшему событие.

Например юнит произнёс спелл
убрать эффект [номер юнита или игрока]
Создать спецэффект на юните
присвоить эффект [номер юнита или игрока] = этот эффект
вейт 2.5 сек
убрать эффект [номер юнита или игрока]
  • создавать определённый эффект на юните на время...

Или во время махинаций с предметами, скиллами, морфами и т.п. могут случаться баги из-за мгновенной обработки и часто там можно влепить вейт 0.00 сек, который не принесёт проблем, а пользу принесёт.
Принятый ответ
0
13
9 лет назад
Отредактирован ENAleksey
0
Что вы думаете об этой функции?
PolledWaitEX
function PolledWaitEX takes real duration returns nothing
    local timer t
    local real  timeRemaining
 
    if (duration > 0) then
        set t = CreateTimer()
        call TimerStart(t, duration, false, null)
        loop
            set timeRemaining = TimerGetRemaining(t)
            exitwhen timeRemaining <= 0
 
            // If we have a bit of time left, skip past 10% of the remaining
            // duration instead of checking every interval, to minimize the
            // polling on long waits.
            if (timeRemaining > bj_POLLED_WAIT_SKIP_THRESHOLD) then
                call TriggerSleepAction(0.1 * timeRemaining)
            else
                call TriggerSleepAction(bj_POLLED_WAIT_INTERVAL)
            endif
        endloop
        call PauseTimer(t)
        call DestroyTimer(t)
        set t=null
    endif
endfunction
0
15
9 лет назад
0
ENAleksey, боже упаси.
0
13
9 лет назад
0
Tobi123, нашёл на сайте разработчика WurstScript. Любой желающий может оставить свой код на любом языке.
3
32
9 лет назад
3
ENAleksey:
Что вы думаете об этой функции?
PolledWaitEX
function PolledWaitEX takes real duration returns nothing
    local timer t
    local real  timeRemaining
 
    if (duration > 0) then
        set t = CreateTimer()
        call TimerStart(t, duration, false, null)
        loop
            set timeRemaining = TimerGetRemaining(t)
            exitwhen timeRemaining <= 0
 
            // If we have a bit of time left, skip past 10% of the remaining
            // duration instead of checking every interval, to minimize the
            // polling on long waits.
            if (timeRemaining > bj_POLLED_WAIT_SKIP_THRESHOLD) then
                call TriggerSleepAction(0.1 * timeRemaining)
            else
                call TriggerSleepAction(bj_POLLED_WAIT_INTERVAL)
            endif
        endloop
        call PauseTimer(t)
        call DestroyTimer(t)
        set t=null
    endif
endfunction
Вот у меня встречный вопрос, а зачем вам вейты и всякие поделки на их основе вроде PolledWait?
Используйте таймеры, они точны, их можно остановить и возобновить, вейты же непригодны практически не для чего кроме киниматиков и синхронизации данных, ну развечто на гуи с таймерами туго вейты, на jass эти городушки не оптимальны, нужно лепить локальные переменные - ибо глобалки могут перезаписываться за время вейта.
2
13
9 лет назад
2
quq_CCCP, сам wait'ы не использую, просто хотел узнать, в чём смысл написания данной функции, зачем вообще они нужны? И есть ли хоть какая-нибудь польза от неё?
1
32
9 лет назад
1
ENAleksey, Есть гуишникам, для мили задержек, но она ресурсоемка и все равно задержки для каких-нить спеллов с кастом снарядами слишком велики, дергается...
Поэтому нафиг, таймер или триггер и точка!
5
24
9 лет назад
Отредактирован Melissa
5
Примеры элементарных случаев написаны выше. Для объёмных систем лучше использовать таймеры. Ну необязательно даже объёмных, для того же респа героев таймеры в разы лучше. Хотя систему респа с вейтами можно уместить тупо в 1 триггер, но этого мало, чтобы отказываться от всех возможностей, что есть у таймера.

Как уже сказано было выше - вейты незаменимы в синематиках, точнее функции "Wait for condition" и "wait for sound". В синематиках эти два элемента просто мегапрофитны и удобны и полезнее даже таймеров.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.