Comments 36
Ну-ну, а потом удивляетесь, почему «простая» анимация жрет 30-50% ресурсов CPU, а браузеры занимают по 300-400 мегабайт в памяти.
Уже 100 лет назад придумали GIF (причем по реальной необходимости) и APNG (тут можно о необходимости поспорить) — нет, мало! Придумаем, чего-бы еще такого засунуть в наш новый стандарт, чтобы все поняли, что мы не присиживаем штаны в своем консорциуме, а напичкиваем его новыми веб-два-нольными функциями, чтобы хомячью было удобнее фейсбуки и вконтакты просматривать. Как дети, ей богу.
Уже 100 лет назад придумали GIF (причем по реальной необходимости) и APNG (тут можно о необходимости поспорить) — нет, мало! Придумаем, чего-бы еще такого засунуть в наш новый стандарт, чтобы все поняли, что мы не присиживаем штаны в своем консорциуме, а напичкиваем его новыми веб-два-нольными функциями, чтобы хомячью было удобнее фейсбуки и вконтакты просматривать. Как дети, ей богу.
А вы, наверное, в интернете через lynx сидите?
Толсто. Ну, аватару зато соответствуете
gif был придуман, чтобы сиськи анимировать
Плюс ко всему если выполняется анимация в табе, который невидим, браузеры не будут продолжать перерисовку
Что-то подобного не наблюдается в Хроме (последняя бета).
Все работает. Хром 10.0.648.82 beta. В примере Demo by Louis-Rémi Babé нужно нажать Interval Bookmarklet затем включить [v] requestAnimationFrame. При смене таба нагрузка ЦП снижается с 28% до 7%
Вообще говоря, safari mobile давно уже таймеры не обрабатывает неактивной вкладке. Про другие ничего не знаю, но у меня есть подозрения, что реализовать это совсем не сложно и все это итак уже умеют.
А для десктопа это не так критично.
А для десктопа это не так критично.
function(/* function */ callback, /* DOMElement */ element){
window.setTimeout(callback, 1000 / 60);
};
Это ничего, что тут
element
теряется? Я бы сделал так:function(/* function */ callback, /* DOMElement */ element){
window.setTimeout(function() { callback.call(callback,element); }, 1000 / 60);
};
Ну что сказать, правильно всё.
Как-то совсем совсем никакого эффекта кроме нормирования FPS не наблюдается.
Где обещанные оптимизация reflow — не знаю :(
Где обещанные оптимизация reflow — не знаю :(
function(/* function */ callback, /* DOMElement */ element){
window.setTimeout(callback, 1000 / 60);
};
Кажется, тут ошибка и необходимо так:
function(/* function */ callback, /* DOMElement */ element){
window.setInterval(callback, 1000 / 60);
};
requestAnimationFrame вызывается приблизительно раз в 17 мс.
а если у меня вычисления длятся больше — он будет захлёбываться, или пропускать кадры?
Понял, глупость сморозил.
Эм, а можете пояснить? А то я тоже об этом задумался, но не понял, почему это глупость.
17ms = 60 fps
Я сказал глупость про setInterval вместо setTimeout. RAF работает как setTimeout
А, вот оно что. А по поводу второго вопроса никаких ответов пока нет?
Она как setTimeout только с синхронизацией с «внутренним таймером перерисовки страницы» и не дает завышать rps
Простите, что поднимаю не очень новый пост, зашел через поиск.
Я новичек в js+canvas, наткнулся на проблему, на которую по моим ощущениям, как-то «забивают»:
даже самая простая анимация на канвасе в js, сделанная через setInterval с каким бы то ни было интервалом периодически устраивает небольшой еле-еле заметный подлаг (у меня раз в секунду в среднем).
Проверено не только на моем компьютере, но и еще на пяти. У кого-то раз в 5 сек, у кого-то раз в секунду.
Зашел на пример из этого топика
jsfiddle.net/paul/XQpzU/
и тоже самое — наблюдаю небольшие скачки раз в секунду, если внимательно смотреть.
Если анимация посложнее, то подлаги есть, просто их труднее разглядеть, если много чего «мельтешит».
При этом компьютер довольно мощный 4 ядра и все такое.
Похожий эффект наблюдается при анимации во flash.
Получается в браузерх пока что никак не реализовать более-менее гарантированное плавное движение?
Я новичек в js+canvas, наткнулся на проблему, на которую по моим ощущениям, как-то «забивают»:
даже самая простая анимация на канвасе в js, сделанная через setInterval с каким бы то ни было интервалом периодически устраивает небольшой еле-еле заметный подлаг (у меня раз в секунду в среднем).
Проверено не только на моем компьютере, но и еще на пяти. У кого-то раз в 5 сек, у кого-то раз в секунду.
Зашел на пример из этого топика
jsfiddle.net/paul/XQpzU/
и тоже самое — наблюдаю небольшие скачки раз в секунду, если внимательно смотреть.
Если анимация посложнее, то подлаги есть, просто их труднее разглядеть, если много чего «мельтешит».
При этом компьютер довольно мощный 4 ядра и все такое.
Похожий эффект наблюдается при анимации во flash.
Получается в браузерх пока что никак не реализовать более-менее гарантированное плавное движение?
Это сборщик мусора запускается.
хм… И получается, что не реализовать плавное перемещение хотябы просто квадратика, а-ля директ Х, ОпенГЛ и т.п. из-за этого «сборщика мусора»?
Сразу скажу, что я не особо эксперт в этих деталях, потому расскажу, как я понимаю ситуацию.
Я проверял эту ситуацию через хромопрофайлер — как раз во время запуска ГК слегка подлагивает изображение.
Да. Сборщик блокирует поток из-за которого один-другой кадр рендерится, скажем, в два раза дольше. И лучше было бы стабильных 30 фпс, чем 60 фпс, а один раз кадр одрендерённый в два раза медленнее.
В Си такой проблемы нету из-за ручной сборки мусора (вроде, в Джава тоже есть эти протормаживания?) и из-за того, что рендер лежит на видеокарте.
Может, поможет рендер через кадр, тогда лаги будут менее заметны
Хотя я всё же думаю, что это не так важно =)
Я проверял эту ситуацию через хромопрофайлер — как раз во время запуска ГК слегка подлагивает изображение.
Да. Сборщик блокирует поток из-за которого один-другой кадр рендерится, скажем, в два раза дольше. И лучше было бы стабильных 30 фпс, чем 60 фпс, а один раз кадр одрендерённый в два раза медленнее.
В Си такой проблемы нету из-за ручной сборки мусора (вроде, в Джава тоже есть эти протормаживания?) и из-за того, что рендер лежит на видеокарте.
Может, поможет рендер через кадр, тогда лаги будут менее заметны
Хотя я всё же думаю, что это не так важно =)
В Java тоже GC. GC есть разных типов: рефкаунт, который не блокирует поток, и блокирующий. Повсеместно используется блокирующий тк он может работать с циклическими ссылками.
Весь код основного потока JavaScript работает с одной кучей, каждый раз когда браузер понимает, что нужно почистить мусор он блокирует поток — чистит и дефрагементирует память. Время простоя зависит от количества созданных и убитых объектов и контекстов в один момент времени.
Пользователь видит GC как зависание окна. Я вот, например, часто вижу как висит WebStorm (Java)…
Управлять GC в JavaScript, в отличии от того же Питона, нельзя (отанавливать и запускать руками). Можно только в Опере принудительно вызывать GC.
Уменьшить время GC можно разбив кучу(Heap) на несколько мелких куч — те использовать Воркеры.
Весь код основного потока JavaScript работает с одной кучей, каждый раз когда браузер понимает, что нужно почистить мусор он блокирует поток — чистит и дефрагементирует память. Время простоя зависит от количества созданных и убитых объектов и контекстов в один момент времени.
Пользователь видит GC как зависание окна. Я вот, например, часто вижу как висит WebStorm (Java)…
Управлять GC в JavaScript, в отличии от того же Питона, нельзя (отанавливать и запускать руками). Можно только в Опере принудительно вызывать GC.
Уменьшить время GC можно разбив кучу(Heap) на несколько мелких куч — те использовать Воркеры.
Спасибо!
А где про это в все javascript можно почитать подробнее?
А где про это в все javascript можно почитать подробнее?
На хабре, у меня в хабраблоге habrahabr.ru/users/azproduction/blog/ или dmitrysoshnikov.com/
Sign up to leave a comment.
Продвинутые анимации с requestAnimationFrame