Pull to refresh

Comments 11

Тестировал анимацию (цветные квадратики бегают по браузеру, отталкиваясь от его стенок). Вариант в DIV'ами, когда координаты задаются с помощью MARGIN'ов в десятки — сотни раз медленнее, чем вариант с рисованием квадратиков на CANVAS. Причём, чем больше квадратиков, тем разница заметнее.
Вы случайно не облачка рисовали для нового сайта Windows Azure?
Я уперся в эту проблему, когда мне надо было анимировать листалку из картинок большого разрешения весом 100-200kB.

Вес передаваемых картинок никакого значения не имеет — при отображении они всё равно распаковываются в набор пикселей. И чем больше этих пикселей, тем тяжелее рисовать (то есть значение имеет только ширина, высота и битность цвета).

Однако, я проверил эти примерные выкладки практикой: замена тега img на canvas принесло ускорение на порядок в Chrome и лучшую производительность в Opera (которая вообще выпала из рамок исследования скорости repaint). Firefox стал при этом более стабильным. Я объяснил все это переносом вычислений с процессора на видеокарту.


Вывод не совсем правильный: одно дело, когда у вас отмасштабированные картинки, которые заново масштабируются на каждом repaint-цикле (ещё нужно смотреть, какая именно область перерисовывается, потому что вполне вероятно, что браузер может перерисовывать очень большой контейнер, хотя поменялся маленький блок), другое дело, когда на canvas вы создали новое изображение, которое больше нет необходимости перерисовывать заново. Видеокарта тут не при чём.
В предыдущей статье про Canvas автор оригинала тоже однозначно пришёл к выводу, что дело в аппаратном ускорении, поддерживаемом Canvas (строчки «Здесь мы можем увидеть внутреннюю силу HTML5 браузеров, ...»).
Там всё-таки немного другая задача, но принцип тот же: работа не с кучей DOM-объектов в виде масштабированных картинок, а с одной большой текстурой. Это стандартная техника оптимизации, используемая во многих приложениях. Собственно, в статье это и указано:
Основной трюк нашего приложения в рисовании только карт, которые хорошо видно на экране.

Автор текущей статьи сделал вывод, что:
операции с картинками надо реализовывать средствами [canvas], которая нагружает видеокарту, не надо использовать обычные теги [img], которые служат простой презентации графики.

… при том что, например, обычная смена opacity у немасштабированной картинки будет работать практически с такой же скоростью, как и через canvas. То есть проблема тут не в том, что тэг <img> используется не по назначению, а в том, что на каждый repaint картинка дополнительно масштабируется. К тому же, аппаратное ускорение можно включить не только через canvas, но и через CSS Transforms/Transitions.
Вопрос: а разве canvas не участвует в перерисовке всей страницы (когда она случается)? Или что имеете в виду под «repaint-циклом»?

Поясню свой вывод. Я менял обновлял канву n раз в секунду, и это было эффективнее, чем обновлять атрибут у тега img. Т.е. n раз в секунду из кеша бралась картинка и ложилась на канву, она, очевидно, каждый раз перерисовывалась.
canvas – не участвует, потому что содержимое этого элемента не изменяется через стандартные reflow и CSS. В остальном, надо смотреть на код теста, чтобы понять, в чём проблема.
Конкретно в случае слайдера может помочь анимация через scrollLeft/scrollTop.
Немножко в сторону от темы, но тем не менее
Вот здесь
chikuyonok.ru/2010/11/optimization-story/
статья Сергея Чикуенка о том, как они боролись с тормозами перерисовки, и почему они вообще были.
Sign up to leave a comment.

Articles