Posts Tagged ‘эффекты’
Как сделать из говна конфетку? Processing вам в помощь!
Недавно одному из клиентов потребовалось сваять календарь с некими иллюстрациями. При этом бюджет явно не предусматривал покупку нормальных фотоматериалов. Я крепко призадумался, как из найденного в интернете лоурезного говна сделать приличную вещь. И, неожиданно, вспомнил про Processing.
Если кто не в курсе, это такой движок или платформа, предназначенная для создания интерактивных произведений генеративного искусства (generative art). На этой платформе сделано довольно много модных мультимедийных интерактивных проектов. На сайте есть галерея, все подробности там. Да, и он бесплатный, абсолютно.
Так вот, я решил использовать Процессинг с цель получить примерно такой результат как вы видите на картинке - растеризовать изображение с помощью букв. Все осложнялось тем, что такой скрипт еще предстояло создать…
За основу я взял разработку с сайта complexification.net Джареда Тарбелла box fitting (Thank you Jared!). Но я решил модифицировать алгоритм таким образом, чтобы вместо квадратов использовать буквы. По ходу работы пришлось усовершенствовать алгоритм так, чтобы картинка сохраняла узнаваемость. В оригинальном алгоритме берется цвет из случайного места исходного изображения, затем квадрат начинает расти пока не столкнется с другим растущим квадратом, получается красиво, но структура изображения нарушается. Я же сделал так, что буква растет до тех пор пока перепад яркостей или насыщенности или оттенка находится в заданном коридоре, то есть буквенные пиксели сохраняют структуру изображения.
Алгоритм работает достаточно быстро и можно сразу получить готовое изображение в виде Tiff файла, но как всегда есть НО, это маленькое, но противное НО… - дерьмовое качество отрисовки шрифтов в processing. Плюс к тому, выбор гарнитур небогат, можно использовать только несколько true type шрифтов, вся моя коллекция ps и OpenType шрифтов идет по боку… Внутри процессинга есть несколько разных режимов рендеринга, я перепробовал их все, но увы есть некоторые ограничения по их использованию в данном конкретном случае, так что пришлось смириться с имеющимся результатом. Тем не менее, для полиграфии вполне пристойные картинки получаются.
Естественно, я не смог устоять перед искушением портировать эту штуку на флэш. И я сделал это. Пришлось помучаться, решая проблему производительности, но об этом чуть ниже, а сейчас можно поиграться с letter paint:
Число на панели слева внизу - количество использованных символов. После остановки просчета можно увеличивать изображение и таскать его мышью. И да, приложение тормозное, увы.
Что касается производительности, то выяснилась одна неприятная особенность - если делать все как в оригинальном алгоритме, то ждать придется до второго пришествия. В оригинале, в процессинге, можно видеть как буквы “растут”, и сначала я реализовал именно такую версию, но производительность такого алгоритма во флеше была просто ужасающе низка.
В ходе экспериментов я понял, что огромное время отнимает именно процесс вывода полученного результата на экран, все эти подсоединения к дереву display list’а жрут неимоверное количество времени. Как только я вынес весь процесс за скобки, скорость увеличилась невероятно! Я решил, что будет достаточным показывать результат с некоторой периодичностью, чтобы было ясно, что приложение живо. Поэтому в ходе работы все выглядит и ощущается несколько туповато, реакция прямо скажем не реактивная… зато скорость обсчета вполне вменяемая. Собственно целью этого мероприятия было получения картинки в векторной форме, и это удалось!
Скрипт для процессинга можно скачать здесь: LetterProc02.pde
Совершенству нет предела.
И тем не менее, теперь я наконец могу показать демо, которым я по настоящему доволен. По сравнению с этим вариантом, все предыдущие - тухлая, никуда не годная лажа.
Тут многое подправлено и теперь это выглядит вдохновляюще. Вариант все еще сырой. В коде осталось куча всяких хвостов которые надо зачистить.
К счастью, мне удалось разобраться с производительностью и теперь анимация выглядит плавно и красиво. Для усиления эффекта я сделал киношное каше и подправил цвет. В сцене сейчас пять разных вариантов появления букв, они чередуются в произвольном порядке и у некоторых из них меняются параметры в случайном порядке.
Любуйтесь!
Еще несколько важных фактов о производительности Pixel Blender’а
В блоге Дэвида Ленартса появился интересный тест производительности Пиксел Блендера. В частности интересно, что при работе с фильтами Pixel Blendera:
BitmapData быстрее чем ByteArray а он в свою очередь быстрее, чем Vector.<Number> !
- ShaderJob on BitmapData: 92-99ms
- ShaderJob on ByteArray: 147-172ms
- ShaderJob on Vector.<Number>: 167-192ms
- BitmapData is ~40% быстрее чем ByteArray
- BitmapData is ~47% быстрее чем Vector.<Number>!!
Операторы сравнения дают значительное падение производительности.
В своем тесте Дэвид делает тест, где вычисления не производятся для пикселей с alpha==0. При этом даже если таких пикселей около половины - время вычислений вырастает:
- BitmapData: 134-192ms - ~47% потеря скорости!!!
- ByteArray: 147-172ms - ~22% потеря скорости
- Vector: 192-213ms - ~27%потеря скорости
Не используйте input в качестве output
Лучше иметь два разных BitmapData. Дело в том что Flash player делает временную копию источника, что увеличивает время вычислений фильтра.
- BitmapData: 207-218ms - ~30% потеря скорости
- ByteArray: 256-271ms - ~65% потеря скорости
- Vector: 276-293ms - ~40% потеря скорости
На своем опыте могу сказать, что все эти нюансики складываются иногда в очень неприятные тормоза.
