Казалось бы эта технология предоставит очень существенный плюс флешу, ведь это подарило приложениям некую многопоточность, что должно очень весомо повысить производительность.
В паре с другими нововведениями, такими как апаратное ускорение для видео-проигрывателя, можно было ожидать и апартного ускорения от шейдеров (думаю у всех слово шейдер ассоциируется с видео-картами), но уэе здесь начались огорчения — никакого апартного ускорения он не подарил. Тогда целесообразно было бы задаться вопросом, а где вообще можно применить эту новую технологию, на какой практической задаче, и какой практический смысл в этом?
Подключив воображение, можно конечно придумать очень много способов применения шейдеров. Но насколько востребованы они? И насколько большую выгоду они приносят?
К примеру применив какуе-то цветокорекцию фотограффии с использованием шейдера, вы сэкономите десятую долю секунды, если бы вы делали то же самое с использованием чистого AS3. Такая польза в таких задачах ставит рациональность применения шейдеров под сомнение.
Но вот я вспомнил 1 из проектов, над которым приходилось работать, и решил что возможно его можно будет значительно оптимизировать с использованием шейдера.
Речь идёт о проигрывателе стерео-видео (3D). Есть несколько алгоритмов построения трёхмерных изображений, но я росскажу в двух словах о одном из самых ресурсоёмких.
На входе у вас видео, визуально разделенное на 2 части. Левая часть к примеру для левого глаза, правая для правого (хотя чаще разделяют на верхнюю часть и нижнюю).
На выходе должно быть видео для специального поляризационного 3D монитора, который отображает изображение под разными плоскостями поляризации в шахматном порядке — к примеру белые клетки под одной плоскостью, черные под другой.
Всё что нам необходимо сделать — разбить видео на 2 картинки, а отображать третью, где «белые» клеточки — клетки с левой картинки, «черные» — с правой.
Схематически это выглядит так:
При самом очевидном алгоритме реализации наша программа будет работать так:
— используя стандартные средства 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)
На более старом процессоре, двух-ядерном Pentium 2.8 GHz результаты были такими: применяя маску добиваемся 6.8 кадров в секунду, применяя шейдер 4.7, применяя попиксельный рендеринг средствами AS3 2.9. Как видим здесь преимущество применения шейдера оказалось еще более незначительным.
Диаграмма производительности для процессора Pentium 2.8 GHz
Итог: правильное применение высокоуровневых методов ActionScript 3.0 доказало свою эффективность перед применением передовых технологий работы с низкоуровневым шейдером. Еще одна практическая задача, где шейдер оказался абсолютно бесполезным.
В паре с другими нововведениями, такими как апаратное ускорение для видео-проигрывателя, можно было ожидать и апартного ускорения от шейдеров (думаю у всех слово шейдер ассоциируется с видео-картами), но уэе здесь начались огорчения — никакого апартного ускорения он не подарил. Тогда целесообразно было бы задаться вопросом, а где вообще можно применить эту новую технологию, на какой практической задаче, и какой практический смысл в этом?
Подключив воображение, можно конечно придумать очень много способов применения шейдеров. Но насколько востребованы они? И насколько большую выгоду они приносят?
К примеру применив какуе-то цветокорекцию фотограффии с использованием шейдера, вы сэкономите десятую долю секунды, если бы вы делали то же самое с использованием чистого AS3. Такая польза в таких задачах ставит рациональность применения шейдеров под сомнение.
Но вот я вспомнил 1 из проектов, над которым приходилось работать, и решил что возможно его можно будет значительно оптимизировать с использованием шейдера.
Речь идёт о проигрывателе стерео-видео (3D). Есть несколько алгоритмов построения трёхмерных изображений, но я росскажу в двух словах о одном из самых ресурсоёмких.
На входе у вас видео, визуально разделенное на 2 части. Левая часть к примеру для левого глаза, правая для правого (хотя чаще разделяют на верхнюю часть и нижнюю).
На выходе должно быть видео для специального поляризационного 3D монитора, который отображает изображение под разными плоскостями поляризации в шахматном порядке — к примеру белые клетки под одной плоскостью, черные под другой.
Всё что нам необходимо сделать — разбить видео на 2 картинки, а отображать третью, где «белые» клеточки — клетки с левой картинки, «черные» — с правой.
Схематически это выглядит так:
При самом очевидном алгоритме реализации наша программа будет работать так:
— используя стандартные средства 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)
На более старом процессоре, двух-ядерном Pentium 2.8 GHz результаты были такими: применяя маску добиваемся 6.8 кадров в секунду, применяя шейдер 4.7, применяя попиксельный рендеринг средствами AS3 2.9. Как видим здесь преимущество применения шейдера оказалось еще более незначительным.
Диаграмма производительности для процессора Pentium 2.8 GHz
Итог: правильное применение высокоуровневых методов ActionScript 3.0 доказало свою эффективность перед применением передовых технологий работы с низкоуровневым шейдером. Еще одна практическая задача, где шейдер оказался абсолютно бесполезным.