2015-04-03 1 views
2

Я изо всех сил пытаюсь найти grok requestanimationframe.Понимание requestanimationframe

Правильно ли говорить, что requestanimationframe - это API-интерфейс браузера, который позволяет логике влиять на окрашенный пользовательский интерфейс, который должен выполняться с максимальной эффективностью, чтобы выполнить до следующего смешения интерфейса с графической подсистемой, так что чтобы избежать нерациональных кадров для рисования кадров, которые никогда не попадают на экран из-за разностей фаз между физическим циклом обновления экрана и циклом рендеринга приложений?

ответ

4

requestAnimationFrame просто method которых:

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

Когда метод вызывается:

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

Следующий шаг должен пройти через список обратного вызова (если только cancelAnimationFrame не были названы для одного или нескольких идентификаторов еще в списке) перед темbrowser issues a repaint.

Метод window.requestAnimationFrame() сообщает браузеру, что вы хотите выполнить анимацию, и просит, чтобы браузер вызвать указанную функцию для обновления анимации до следующей перерисовки.

rAF будет синхронизировать каждый обратный вызов, чтобы каждая перекраска соответствовала скорости обновления монитора (или, скорее, дисплейной карты) (VBLANK). Это в основном означает, что новый обратный вызов выдается сразу после того, как произошел VBLANK, чтобы сценарий имел около 16,7 мс для завершения его рендеринга перед следующими триггерами VBLANK.

A setTimeout/setInterval не может синхронизироваться с обновлением монитора, поскольку они могут принимать только целочисленные значения. Обычная скорость обновления составляет 16,67 мс на кадр при 60 Гц, поэтому время от времени вы будете получать «рывки», используя один из этих методов, так как вам нужно будет использовать скорость обновления 16 или 17 мс.

rAF не ограничивается этим. Поскольку rAF имеет дело с списком обновления фрейма, а не с общим списком событий, браузер может более эффективно очищать очередь. Браузер также может снизить скорость до f.ex. половина, если вкладка браузера невидима, уменьшая обратные вызовы до половины, что, в свою очередь, уменьшает нагрузку.

Нет необходимости использовать графическую подсистему для «blit»/repaint, но это обычно так.

+0

ОК, поэтому RAF связывает вызовы обратных вызовов с выдачей VBLANK из графической подсистемы, предоставляя указанным обратным вызовам максимальное время для завершения до следующего VBLANK.Если обратный вызов сбрасывает бюджет времени на 60 кадров в секунду, запрос кадра анимации продолжается с той же логикой, но возвращается к соответствию циклу 30fps, в конечном счете сохраняя выполнение логики для изменения интерфейса пользователя в фазе с графической подсистемой? – Ben

+0

@BenAston, если сценарий использует бюджет, запрос будет по-прежнему действительным, но ожидается до следующего vblank, поэтому цель все равно равна 60 fps (обычно). 30 кадров в секунду (пропуск vblank), когда вкладка скрыта, в некоторых браузерах, хотя это поведение не определено (зависит от поставщика). Именно поэтому анимация, основанная на времени, лучше, чем фрейм, поскольку мы не будем знать, какова будет фактическая частота кадров (т.е. 60 кадров в секунду не является гарантией). – K3N