Сейчас всё большее количество веб-страниц использует элемент Canvas для отрисовки 2D-контента или модификации DOM-элементов на лету. Подобные страницы используют функции setTimeout или setInterval для получения более частых обратных вызовов, что позволяет периодически отрисовывать контент или использовать DHTML для перемещения элементов на странице. Подобным образом работает и WebGL API, используя для анимации похожую технику.
Но, функциям setTimeout и setInterval неважно какой элемент обрабатывается и какая вкладка используется - фоновая или активная, нагрузка на процессор остаётся высокой независимо от просматриваемой страницы пользователем. Особенно такая проблема может сильно поразить нетбуки, ноутбуки и другие мобильные девайсы, где излишняя и ненужная нагрузка на процессор расходует заряд батареи. Кроме этого, избыточная нагрузка на процессор в фоновой вкладке может ухудшить плавность работы анимации в просматриваемой вкладке.
В Mozilla недавно был представлен эккспериментальный набор API под названием mozRequestAnimationFrame, который имеет некоторые различия в работе по сравнению с setTimeout и setInterval. Браузер возвращает вызов только после того как будет готов к обработке следующего кадра, функции mozRequestAnimationFrame API специфичны и могут получать доступ к браузеру, проверяя вкладку, в которой происходит анимация и при обработке фоновой вкладке просто не отправляет обратный вызов слишком часто.
Экспериментальный webkitRequestAnimationFrame API был добавлен в WebKit и доступен начиная с Google Chrome 10, по сути это такой же mozRequestAnimationFrame, но поддерживает в качестве второго необязательного аргумента элемент, которому следует передать управление анимацией. Подобная практика позволит браузеру избежать ненужной анимации, которая в данный момент может оказаться невидимой для пользователя.
WebGL примеры уже модифицированы для использования requestAnimationFrame вместо setTimeout и setInterval.
В предстоящем релизе Google Chrome 11 планируется сократить потребление процессора даже для страниц, которые используют setTimeout и setInterval. Для фоновых вкладок планируется запустить отдельные таймеры, которые будут исполнять требуемые действия примерно один раз в секунду. Такие изменения уже доступны в каналах Dev и Canary браузера Google Chrome.
На некоторых страницах могут возникнуть проблемы, но разработчики Google Chrome на данный момент считают, что это ничто, по сравнению с проблемой бесполезной нагрузки процессора фоновыми вкладками.