Подтвердить что ты не робот

Производительность движущегося изображения на веб-странице через CSS и HTML5 Canvas

У меня есть изображение и переместите его вокруг моей веб-страницы (JavaScript) следующим образом:

satelliteImage.style.top = coordinates.top + "px";
satelliteImage.style.left = coordinates.left + "px";

К сожалению, производительность довольно плохая во всех браузерах, кроме Chrome. Узким местом является скорость рендеринга. У меня нет надежды на IE, но я хочу улучшить Firefox как минимум. Кто-нибудь имеет опыт работы с холстом HTML5 при перемещении изображения по сравнению со стилем?

4b9b3361

Ответ 1

Я создал эквивалентные тесты для сравнения частоты кадров для перемещения изображения с помощью CSS и его рисования на холсте HTML. Вот тесты:

И вот результаты FPS (см. URL для деталей теста):

                  Image  Image  Sprite  Sprite
        Browser  Canvas    CSS  Canvas     CSS
----------------------------------------------
  Safari v5.0.3      59     95      59      89
Firefox v3.6.13      59     95      60      90
 Firefox v4.0b8      75     89      78      82
    Chrome v8.0     108    230     120     204
    iPad, Horiz      17     44       2      14
     iPad, Vert       4     75       2      15

Как вы можете видеть:

  • Вы всегда будете получать лучшие результаты, перемещая изображение как элемент HTML, чем перерисовку части холста, и
  • Вы вероятно, возможно, что-то не так, если вы получаете только 5 кадров в секунду.

Изменить. Добавлены тесты для перемещения 20 небольших анимированных спрайтов на фоне. Выводы остаются неизменными.

Ответ 2

Теперь прошло более двух лет, и я решил запустить эти тесты, чтобы убедиться, что это все еще верно. Он делает... и это не так.

  • Firefox Desktop и мобильная обе работают с анимацией CSS значительно быстрее, чем холст.

  • Рабочий стол Chrome работает с холстами и анимациями CSS о том же

  • Chrome Mobile (на Nexus 7) делает абсолютно противоположное: холст работает значительно быстрее, чем CSS!

(с помощью Firefox Android с Nexus 7 и настольными браузерами на Linux с разрешением 1920x1080)

Browser/OS          Canvas Image   CSS IMage   Canvas Sprites   CSS Sprites    
-----------         ------------   ----------  --------------   -----------
Firefox 16          56.7fps        215.6 fps   59.2fps          203.6fps
Firefox 16 Android  17.1 fps       179.6fps    11.5fps          35.7
Chrome 22           192.3fps       223.5fps    170.1fps         164.3fps
Chrome Android      48.3fps        39.9fps     92.8fps          13.1fps

Что все остальные получают? Может ли кто-нибудь протестировать IE9, 10 для этого?

Ответ 3

Понял, что я обновил этот старый вопрос своими выводами на iPad третьего поколения:

Холст выигрывает 2: 1 с анимацией спрайтов в среднем около 120 кадров в секунду с очисткой фона в обоих направлениях. CSS вряд ли может удовлетворить 60 кадров в секунду.

Что касается единственного изображения, CSS был определенно быстрее.

Ответ 4

В моем опыте с Canvas вы сможете получить хорошие 50 кадров в секунду на Firefox и даже хорошие 15 кадров в секунду на iOS. IE9, вероятно, будет самым быстрым браузером, другие версии на самом деле не реализуют Canvas.

Ответ 5

В дополнение к выводам MyNameIsKo о производительности iPad 3. Мне было интересно, связано ли это с тем, что метод CSS DOM должен был беспокоиться о том, чтобы рисовать сетчатый экран iPad 3, тогда как холст будет нарисован в более низком разрешении, а затем blt'd для экранирования. IPad 1 значительно быстрее для обновлений CSS, чем iPad3!

Я также внесли некоторые изменения в javascript canvas, чтобы иметь возможность рисовать на холсте разрешения сетчатки. Я добавил следующий код после canv.height = h; в функции bg.onload:

if (window.devicePixelRatio) {
    ctx.canvas.style.width = w + "px";
    ctx.canvas.style.height = h + "px";
    ctx.canvas.height = h * window.devicePixelRatio;
    ctx.canvas.width = w * window.devicePixelRatio;
    ctx.scale(window.devicePixelRatio, window.devicePixelRatio);
}

что значительно уменьшило производительность...

iPad 1 (iOS 5.5.1)

iPad 3 (iOS 6.1.3)

                      CSS Sprite        Canvas Sprites
-----------------------------------------------------
iPad 1                   90                  100
iPad 3                   55                  120
iPad 1(canvas changes)   n/a                 100
iPad 3(canvas changes)   n/a                 35