Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Полноэкранная анимация белого шума в браузере - какой подход производительнее? (https://javascript.ru/forum/misc/52633-polnoehkrannaya-animaciya-belogo-shuma-v-brauzere-kakojj-podkhod-proizvoditelnee.html)

Stas404 28.12.2014 06:55

Полноэкранная анимация белого шума в браузере - какой подход производительнее?
 
Приветствую. Всех с наступающим!

Задача:
Создать реалистичную полноэкранную анимацию а-ля помехи в телевизоре с возможностью подкладывать под нее различный контент.

Компоненты анимации:
- белый шум (хаотические мельтешения)
- горизонтальные полосы (движущиеся вертикально с разной скоростью, высотой и прозрачностью)
- фон с градиентом (от серого к более темному, со временем степень затемнения градиента скачкообразно и циклично меняется).

Возможные подходы к решению:
1) Циклическая покадровая генерация шума, полос и фона с отрисовкой на полноэкранном canvas (возможно, использование 3-х элементов canvas с послойно разделенной анимацией).
2) Анимация заранее созданных картинок (либо однократная генерация отдельных png-изображений с шумом и полосами) в элементах DOM, путем изменения background-position.
3) Использовать для анимации css3 (возможно, в комбинации со вторым вариантом).
4) Использовать для анимации SVG (с имеющимися фильтрами и т.д. удобствами).

Примечания:
Предполагается, что слой (или слои) с анимацией будут иметь полупрозрачность, для того чтобы был виден контент под анимацией, что и создает основную нагрузку на браузер.

При анимации слоя с шумом и изменении фонового градиента (через css3) наблюдается большая потеря производительности (например в FF подтормаживает. В chrome более-менее нормально ) - имеет ли смысл комбинировать css3 и js анимацию - либо лучше что-то одно?
Без изменения градиента - все выглядит более менее шустро.
Как повысить производительность этой многослойной анимации?
Какие моменты надо иметь ввиду, для более грамотного и красивого решения этой задачи?
Спасибо.

Aetae 28.12.2014 11:53

Юзать гифки.) Генерация слишком затратна и не имеет смысла если вам не нужен "истинно рандомный" шум. А он не нужен.

ruslan_mart 28.12.2014 13:18

Aetae, +
Делал такое похожее во флеш, просто ставил два-три кадра шума и быстро воспроизводил их по очереди.

ruslan_mart 28.12.2014 13:39

Вот, сделал небольшой пример с использованием одного бесшовного *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, время: 03:49.