Полноэкранная анимация белого шума в браузере - какой подход производительнее?
Приветствую. Всех с наступающим!
Задача: Создать реалистичную полноэкранную анимацию а-ля помехи в телевизоре с возможностью подкладывать под нее различный контент. Компоненты анимации: - белый шум (хаотические мельтешения) - горизонтальные полосы (движущиеся вертикально с разной скоростью, высотой и прозрачностью) - фон с градиентом (от серого к более темному, со временем степень затемнения градиента скачкообразно и циклично меняется). Возможные подходы к решению: 1) Циклическая покадровая генерация шума, полос и фона с отрисовкой на полноэкранном canvas (возможно, использование 3-х элементов canvas с послойно разделенной анимацией). 2) Анимация заранее созданных картинок (либо однократная генерация отдельных png-изображений с шумом и полосами) в элементах DOM, путем изменения background-position. 3) Использовать для анимации css3 (возможно, в комбинации со вторым вариантом). 4) Использовать для анимации SVG (с имеющимися фильтрами и т.д. удобствами). Примечания: Предполагается, что слой (или слои) с анимацией будут иметь полупрозрачность, для того чтобы был виден контент под анимацией, что и создает основную нагрузку на браузер. При анимации слоя с шумом и изменении фонового градиента (через css3) наблюдается большая потеря производительности (например в FF подтормаживает. В chrome более-менее нормально ) - имеет ли смысл комбинировать css3 и js анимацию - либо лучше что-то одно? Без изменения градиента - все выглядит более менее шустро. Как повысить производительность этой многослойной анимации? Какие моменты надо иметь ввиду, для более грамотного и красивого решения этой задачи? Спасибо. |
Юзать гифки.) Генерация слишком затратна и не имеет смысла если вам не нужен "истинно рандомный" шум. А он не нужен.
|
Aetae, +
Делал такое похожее во флеш, просто ставил два-три кадра шума и быстро воспроизводил их по очереди. |
Вот, сделал небольшой пример с использованием одного бесшовного *png изображения:
http://learn.javascript.ru/play/4qNur
<!DOCTYPE HTML>
<html>
<head>
<style type="text/css">
.noise {
background: url('http://learn.javascript.ru/files/play/54/9f/549fdabb5db7c.png');
height: 480px;
width: 640px;
}
</style>
</head>
<body>
<div class="noise"></div>
<script type="text/javascript">
(function() {
var getRandom = function(max) {
return Math.floor(Math.random() * ++max);
},
noise = document.querySelector('.noise'),
noiseStyle = noise.style;
setInterval(function() {
noiseStyle.backgroundPosition = getRandom(200) + 'px ' + getRandom(200) + 'px';
}, 30);
})();
</script>
</body>
</html>
В данном примере меняется стиль background-position со случайными значениям от 0 до 200 (т.к. размер текстуры 200x200). Частоту кадров можно изменить с помощью второго аргумента setInterval. Вроде вполне хорошо смотрится, и вес текстуры всего 5кб. :) |
| Часовой пояс GMT +3, время: 11:09. |