Нужно ли отменять невыполненный запрос AnimationFrame перед его повторным вызовом?

Я смотрю на новые стандарты для requestAnimationFrame и cancelAnimationFrame

http://paulirish.com/2011/requestanimationframe-for-smart-animating/< /а>

и различные полифиллы, представленные здесь:

https://gist.github.com/paulirish/1579671

Семантика использования этих функций немного сложна для меня. В частности, предположим, что вы requestAnimationFrame(callback) один раз. нужно ли вызывать cancelAnimationFrame, если вы хотите requestAnimationFrame(callback) во второй раз, прежде чем будет вызван первый обратный вызов? Будет ли браузер повторно вызывать обратные вызовы? Или браузер автоматически заменит двойные вызовы на одиночные?

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


person Andrew Mao    schedule 27.03.2013    source источник
comment
Предварительное тестирование показало, что отмена незавершенных запросов на анимацию перед заказом новых делает Firefox менее медленным. Этот эффект, вероятно, будет проявляться в любом браузере, где событие перерисовки происходит медленнее, чем запускается анимация.   -  person Andrew Mao    schedule 28.03.2013


Ответы (1)


Согласно спецификации:

Примечание

requestAnimationFrame планирует только одно обновление анимации на основе сценария. Если необходимы последующие кадры анимации, то requestAnimationFrame нужно будет снова вызвать из обратного вызова.

Также обратите внимание, что несколько вызовов requestAnimationFrame с одним и тем же обратным вызовом (до вызова обратных вызовов и очистки списка) приведут к тому, что несколько записей будут в списке с одним и тем же обратным вызовом, и, таким образом, этот обратный вызов будет вызываться более одного раза для кадр анимации.

http://www.w3.org/TR/animation-timing/

Вызовы requestAnimationFrame планируют только один обратный вызов. После обработки вашего обратного вызова его запись в списке обратных вызовов удаляется. Таким образом, вам не нужно отменять предыдущие вызовы.

person Francois Joly    schedule 03.05.2013
comment
Эта спецификация, по-видимому, указывает на то, что вам ДЕЙСТВИТЕЛЬНО необходимо отменить предыдущие запросы, если вы собираетесь запланировать два вызова (отрисовывая одно и то же) для одного и того же кадра, что вызывает замедление, которое я наблюдал. - person Andrew Mao; 07.05.2013
comment
Конечно, если вы делаете несколько вызовов в одном кадре, вы просто теряете время. Извините, я невнимательно прочитал вопрос. Я не понимал, что вы задаете вопрос в контексте только 1 кадра. - person Francois Joly; 07.05.2013