Pull to refresh

Целесообразность применения шейдеров Adobe Pixel Bender

Reading time3 min
Views1.4K
Казалось бы эта технология предоставит очень существенный плюс флешу, ведь это подарило приложениям некую многопоточность, что должно очень весомо повысить производительность.

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

Подключив воображение, можно конечно придумать очень много способов применения шейдеров. Но насколько востребованы они? И насколько большую выгоду они приносят?
К примеру применив какуе-то цветокорекцию фотограффии с использованием шейдера, вы сэкономите десятую долю секунды, если бы вы делали то же самое с использованием чистого AS3. Такая польза в таких задачах ставит рациональность применения шейдеров под сомнение.

Но вот я вспомнил 1 из проектов, над которым приходилось работать, и решил что возможно его можно будет значительно оптимизировать с использованием шейдера.
Речь идёт о проигрывателе стерео-видео (3D). Есть несколько алгоритмов построения трёхмерных изображений, но я росскажу в двух словах о одном из самых ресурсоёмких.
На входе у вас видео, визуально разделенное на 2 части. Левая часть к примеру для левого глаза, правая для правого (хотя чаще разделяют на верхнюю часть и нижнюю).
На выходе должно быть видео для специального поляризационного 3D монитора, который отображает изображение под разными плоскостями поляризации в шахматном порядке — к примеру белые клетки под одной плоскостью, черные под другой.
Всё что нам необходимо сделать — разбить видео на 2 картинки, а отображать третью, где «белые» клеточки — клетки с левой картинки, «черные» — с правой.

Схематически это выглядит так:

image

При самом очевидном алгоритме реализации наша программа будет работать так:
— используя стандартные средства ActionScipt 3.0 (getPixel, setPixel), мы каждый кадр мы генерируем новую картинку, каждый пиксель которой которой равен пикселю с левой части, если координаты х и у парные или х и у непарные, или же в противном случае каждый пиксель которой которой равен пикселю с правой части изображение.

Второй вариант реализации заключается в том, чтоб делать эту же черную работу на шейдере.
— мы разбиваем изображение на левую и правую картинки, накладываем шейдер как фильтр на левую картинку, передав ему предварительно и правую.

Выставив количество кадров в секунду флеш-приложению равным 30, процессор Intel Core 2 Duo E7500 (2.93 GHz) смог реально выжать в первом случае лишь 7 кадров в секунду для видео 1290х720, а при использовании шейдера этот показатель составил 24 кадра в секунду.
Значительный выигрыш, и можно было бы смело радоваться и хвалить шейдеры Adobe.

Но есть еще 1 вариант реализации этой задачи:
предварительно рисуем шахматную маску
разбиваем видео на 2 картинки, левую не трогаем вообще, а поверх неё закидываем правую картинку с наложенной шахматной маской. Достигаем желанного эффекта при показателе 30.1 Fps.

Диаграмма производительности для процессора Intel Core 2 Duo E7500 (2.93 GHz)
image

На более старом процессоре, двух-ядерном Pentium 2.8 GHz результаты были такими: применяя маску добиваемся 6.8 кадров в секунду, применяя шейдер 4.7, применяя попиксельный рендеринг средствами AS3 2.9. Как видим здесь преимущество применения шейдера оказалось еще более незначительным.

Диаграмма производительности для процессора Pentium 2.8 GHz
image

Итог: правильное применение высокоуровневых методов ActionScript 3.0 доказало свою эффективность перед применением передовых технологий работы с низкоуровневым шейдером. Еще одна практическая задача, где шейдер оказался абсолютно бесполезным.
Tags:
Hubs:
Total votes 9: ↑6 and ↓3+3
Comments3

Articles