Ответ 1
Обзор
Переход свойств CSS на элемент аппаратно ускорен, если выполняются все эти условия:
- Компонент аппаратного ускорения слоев включен в браузере
- Переходящее свойство CSS ускоряется
- Элементу присвоен собственный слой компоновки
Как правило, требования к этим условиям:
- Необходимо включить соответствующие параметры аппаратного ускорения, а графические устройства и графические драйверы устройства не должны быть внесены в черный список.
- Только компоновка свойств CSS (
opacity
,transform: translate
/scale
/rotate
и т.д.) являются ускоряемыми - В каждом браузере есть определенные причины для принятия решения о том, следует ли предоставить элементу свой собственный слой компоновки (или его можно принудительно использовать с помощью "быстрого перехода", например
transform: translate3d
)
Компоновка аппаратного ускоренного слоя
Чтобы определить, включено ли это:
Chrome
1. Общее ускорение
- Перейдите к
chrome://settings
- Нажмите кнопку + Показать расширенные настройки
- В разделе Система проверьте состояние флажка Использовать аппаратное ускорение при наличии.
Если ускорение включено, то:
2. Ускоренная компоновка
- Перейдите к
chrome://gpu
- В разделе Состояние графических функций проверьте значение Композиция. Это будет одно из следующего:
- Аппаратное ускорение
- Только программное обеспечение, аппаратное ускорение недоступно
Подробнее о Программном Compositor от docs:
В некоторых ситуациях аппаратная компоновка недопустима, например. если графическое изображение устройства драйверы занесены в черный список или на устройстве не хватает GPU целиком. Для этих ситуаций альтернативная реализация GL-рендеринга, называемая SoftwareRenderer
(Примечание: Chrome также имеет Legacy Software Rendering Path, который по-прежнему сохраняется на май 2014 года, но скоро будет удален полностью в Blink. ")
Вот отличная статья с дополнительной информацией: Ускоренный рендеринг в Chrome.
Firefox
1. Общее ускорение
- Перейдите в Настройки Firefox
- Перейдите на вкладку Дополнительно
- Перейдите на вкладку Общие
- Проверьте состояние флажка Использовать аппаратное ускорение при наличии.
Если ускорение включено, то:
2. Ускорение уровня
- Перейдите к
about:config
- Поиск
layers.acceleration.disabled
Если ускорение уровня включено (если значение false
), то:
3. Ускоренные окна с графическим процессором
- Перейдите к
about:support
- В разделе Графика проверьте значение Ускоренные Windows GPU
Если он не начинается с 0/
и отображается API-интерфейс рендеринга (например, OpenGL, Direct3D), тогда активируется ускорение GPU.
Safari
- Включить меню отладки Safari, выполнив эту команду в терминале:
defaults write com.apple.Safari IncludeInternalDebugMenu 1
- Открыть (или перезапустить) Safari
- В меню Safari Отладка проверьте состояние параметра Disable Accelerated Compositing в подменю Рисование/Композиция флагов
Ускоряемые свойства CSS
Единственными переходами свойств CSS, которые могут быть аппаратно ускорены, являются те, которые происходят на этапе компоновки процесса рендеринга. Например:
-
opacity
-
transform: translate
и его друзей:translateX
,translateY
,translateZ
,translate3d
-
transform: scale
и его друзей:scaleX
,scaleY
,scaleZ
,scale3d
-
transform: rotate
и его друзей:rotateX
,rotateY
,rotateZ
,rotate3d
Чтобы полностью воспользоваться ускорением, никакие свойства без компоновки не должны переходить. Например:
- Переход только на
transform: translate
может получить полное преимущество ускорения (потому что элементный слой можно просто перекомпоновать с помощью графического процессора). - Переход на оба
transform: translate
иwidth
почти не получит выигрыша от ускорения (потому что переход наwidth
заставляет слой элемента перерисовываться ЦП для каждого кадра анимации).
Состав слоев и цветных границ
Механизм рендеринга браузера решает (на основе пользовательских предпочтений, стилей CSS и т.д.), чтобы дать элементу свой собственный слой компоновки.
Например, Chrome имеет этот список причин, а также имеет эту опцию в chrome://flags
:
Композиция для RenderLayers с переходами
Включение этой опции приведет к тому, что RenderLayers с переходом на непрозрачность, преобразование или фильтр имеют свой собственный составной слой.
Если элементу не присвоен свой собственный слой, то никакие переходы CSS в этом элементе не будут ускорены.
transform: translate3d
( "быстрый ход" ) обычно заставляет элемент присваивать свой собственный слой.
Но даже если элементу был присвоен свой собственный слой, переходы по свойствам без компоновки (width
, height
, left
, top
и т.д.) до сих пор не могут быть ускорены, поскольку они происходят до этап компоновки (например, в макете или этапах краски). @ChrisSpittles Вот почему вы не увидели визуального улучшения после добавления transform: translate3d
.
Большинство браузеров могут отображать цветные границы вокруг композитных слоев, чтобы их было легко идентифицировать для разработки/отладки:
Chrome
Отображение границ композиционных слоев может быть выполнено одним из двух способов:
- Для всех страниц - перейдите в
chrome://flags
и включите границы слоя композитного рендеринга ( "Отрисовывает границу вокруг композитных слоев рендера, чтобы помочь отлаживать и изучать компоновку слоев" ). Для этого вам потребуется перезапустить Chrome. - Для отдельных страниц. Откройте "Инструменты разработчика", затем откройте "Ящик", выберите вкладку "Рендеринг" и включите Показывать слои композитного слоя. Теперь открытие инструментов разработчика на любой странице приведет к тому, что границы слоев будут показаны на этой странице.
Теперь активируйте переход CSS на элемент. Если у него есть цветная рамка, тогда у него есть свой собственный слой композиций.
Цвета границ и их значения определены в debug_colors.cc
. Подробнее здесь и здесь.
Firefox
Чтобы нарисовать границы композитных слоев:
- Перейдите к
about:config
- Найдите
layers.draw-borders
и включите его
Теперь активируйте переход CSS на элемент. Если у него есть цветная рамка, тогда у него есть свой собственный слой композиций.
Цвета границ и их значения определены в Compositor::DrawDiagnosticsInternal
.
Safari
(Это не работает для меня с Safari 7.0.3, но похоже, что это работало для некоторых людей еще в прошлом году.)
Запустите Safari с терминала с помощью набора переменных CA_COLOR_OPAQUE
boolean:
$ CA_COLOR_OPAQUE=1 /Applications/Safari.app/Contents/MacOS/Safari
Альтернативный метод:
$ export CA_COLOR_OPAQUE=1
$ /Applications/Safari.app/Contents/MacOS/Safari
По-видимому, слои с аппаратным ускорением должны быть окрашены в красный цвет. Подробнее здесь и здесь.
Обновление:
Здесь альтернативный метод, который работает для меня в Safari 7.0.3 (кредит David Calhoun):
- В меню Safari Отладка включите Показывать границы композиций в Подменю <Рисование/Композиция
Теперь активируйте переход CSS на элемент. Если у него есть цветная рамка, тогда у него есть свой собственный слой композиций.
Ссылки
Для получения более подробной информации ознакомьтесь с этими замечательными статьями:
- http://blogs.adobe.com/webplatform/2014/03/18/css-animations-and-transitions-performance/
- http://www.html5rocks.com/en/tutorials/speed/high-performance-animations/
- http://www.html5rocks.com/en/mobile/optimization-and-performance/
- http://ariya.blogspot.co.uk/2011/07/fluid-animation-with-accelerated.html