Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   setInterval замедляется (https://javascript.ru/forum/events/85415-setinterval-zamedlyaetsya.html)

rgl 09.08.2023 15:22

setInterval замедляется
 
Такая ситуация. Открываю popup окно в котором должна быть анимация. Вызываю setInterval и все работает поначалу, но когда пытаюсь максимизировать popup окно, все многократно замедляется.
В чем тут проблема?
(браузер Edge)

Как-то так: http://dkirusfe.bget.ru/interval-test.html

voraa 09.08.2023 17:42

Когда вы максимизируете окно с движущимся квадратиком, основное окно становится невидимым, следовательно неактивным. Но таймер работает на основной вкладке. Для неактивных (минимизированных, неактивных вкладок) окон таймер автоматически замедляется до 1 сек.
https://usefulangle.com/post/280/set...n-inactive-tab
А в некоторых случаях даже до минуты
https://usefulangle.com/web-updates/...imers-1-minute

Aetae 09.08.2023 18:49

Ни и на будущее(текущей проблемы это не решит, см. причину выше) - для анимации следует использовать requestAnimationFrame чтобы работать напрямую с отрисовкой браузера, а не абстрактным таймером который ничего не гарантирует по определению.

voraa 09.08.2023 18:57

Aetae, requestAnimationFrame вроде тоже не будет срабатывать на неактивной вкладке

Aetae 09.08.2023 21:32

voraa, дык я уточнил в скобочках.)

rgl 14.08.2023 16:13

voraa,
Спасибо.

Aetae,
Спасибо за информацию, почитал, попробовал, могу немножко поспорить. setInterval ничего не гарантирует, но на практике в моем случае при интервеле 4ms и больше обновляет картинку примерно с заданной частотой, что меня устраивает c большим запасом. С другой стороны, requestAnimationFrame не позволяет задавать интервал (т.е. частоту), какая получится, такая и будет. В моем случае получается что-то примерно 16ms
requestAnimationFrame может быть полезна, напр, если надо добиться "плавности" движения, тогда, зная время, которое прошло с прошлого вызова, можно расчитать смещение. Но у меня задача другая, и в моем конкретном случае setInterval идеально подходит

rgl 14.08.2023 16:18

Форум не дает нажать плюсик, говорит "У Вас нет прав для выполнения этого действия. Пожалуйста, обновите страницу и войдите снова, прежде чем попробовать повторить действие."

ksa 14.08.2023 16:21

Цитата:

Сообщение от rgl
У Вас нет прав для выполнения этого действия

Проверь протокол - нужен https.

voraa 14.08.2023 16:55

Цитата:

Сообщение от rgl
но на практике в моем случае при интервеле 4ms и больше обновляет картинку примерно с заданной частотой, что меня устраивает c большим запасом. С другой стороны, requestAnimationFrame не позволяет задавать интервал (т.е. частоту), какая получится, такая и будет. В моем случае получается что-то примерно 16ms

Картинка все равно будет обновляться так, как она может. И именно requestAnimationFrame говорит: Выполни эту функцию перед очередным обновлением. От того, что поставить 4мс экран не будет обновлятться быстрее Если у вашего монитора частота 60Гц, то это как раз и будет 1/60 ~ 16.67 мс. Быстрее никак. Медленнее - может быть, если поток занят какой то тяжелой задачей, тогда очередное обновление будет только после ее окончания.

Борис К 15.08.2023 18:30

Цитата:

Сообщение от rgl
Форум не дает нажать плюсик, говорит "У Вас нет прав для выполнения этого действия. Пожалуйста, обновите страницу и войдите снова, прежде чем попробовать повторить действие."

Та же проблема!(((


Часовой пояс GMT +3, время: 10:03.