MythBusters: Правда и вымысел о Flash

Источник: habrahabr
SilenceAndy


Последнее время, ходит очень много разговоров о html5, тэге видео и отсутствию Flash на iPad (это очень обидело flash разработчиков) и заявлению Стива Джобса в адрес Adobe. Было много разных мнений - кто-то считал, что это плохо, кто-то что хорошо. В этой статье я бы хотел рассказать от технологии flash со стороны разработчика и рассказать что, почему и как.

В мире flash есть две основных стороны - это Flash и Flex , и у каждой есть свои приверженцы. Чем они отличаются?

Flex - это продукт направленный на создание Rich Internet Applications, то есть довольно больших и объемных по функционалу приложений. Для этого во Flex SDK есть opensource фреймворк со схожим названием, довольно сильно расширяющий функционал базовых классов Flash. К тому же Flex содержит в себе поддержку языка разметки MXML, благодаря которому упрощается работа с компонентами. Flex SDK поставляется с плагином для Eclipse (Flex Builder) для редактирования кода и работы с компонентами.

Flash - это более легкий в плане написания кода продукт, но более мощный в плане создания анимации. Для написания кода в нем нужно иметь железные нервы, так как Flash IDE для этого дает самый минимум - встроенный редактор с минимальной подсветкой кода.

У обоих разные компиляторы (Flex использует command line компилятор, во Flash он встроен в IDE), имеющие некоторые различия - компилятор Flex более мощный.

Почему все приложения написанные на flash такие тяжелые?

Дело в том, что большинству разработчиков для программы нужна визуализация данных - то есть GUI. GUI должно содержать кнопочки, текстовые поля, окна и все то что мы привыкли видеть в браузере. Во flash этого ничего нет. Есть только визуальные объекты. На основе этих визуальных объектов разрабатываются компоненты, имитирующие поведение к которому мы с вами привыкли. "Из коробки" такие компоненты есть как во Flash так и во Flex. Но к сожалению во Flash компоненты абсолютно ужасны и неюзабельны, встретить их в приложениях в последнее время можно достаточно редко. К тому же их развитие в компании Adobe остановилось еще во времена CS2. За то во Flex компоненты цветут и пахнут. Там вам и стилизация через CSS, и MXML для их расположения, настройки, автоматический лаеринг (расположение компонент на слое и смещение/ресайз и прочий функционал такого плана) и куча других разных плюшек. Но как я сказал, это все дополнительный код.

При компиляции в ActionScript весь код на который есть хотя бы одно упоминание компилируется в конечный swf файл. Во Flex очень много жестких ссылок и если вы используете один класс, вы не будете знать сколько еще кода он за собой потащит. Вот вам пример - это один из тестовых файлов Flex4 (последней на данный момент версии фреймворка которая находится в статусе Beta). Его вес 1.28 мегабайта. Вот код данного файла:

Как видно по коду (а кому не видно я объясню), там создается несколько компонент (Panel, TextInput, Button, Label). В принципе ничего особенного, но этот код благодаря жестким ссылкам, вкомпилирует в конечный файл… 489 классов и 125 интерфейсов (около 5 мегабайт в исходных текстах). Это честно скажу дофига.

Во Flex3 была реализована система runtime-shared-libraries (RSLs), которая позволяет часть кода хранить у пользователя и использовать такие библиотеки совместно разными приложениями. Но это использует хорошо если 5% разработчиков.

И отвечая на вопрос - из-за отсутствия нормальных альтернатив, большинство использует компоненты из Flex, со всеми вытекающими последствиями.

Почему все так жутко тормозит и глючит, баннеры отжирают по 90% CPU?

ActionScript это довольно мощный язык с большими возможностями, но так было не всегда. Еще каких-то 6 лет назад еще во времена существования Macromedia и Flash 5, Flash и Action Sctript были технологиями разве, что для создания баннеров, убогих сайтов-визиток и мультиков. В основном мультиков. С годами язык обрастал новыми возможностями и через некоторое время стал взрослым и позволил писать сложные RIA проекты. Но не утратил корни - баннеры, сайты-визитки и мультики можно создавать и сейчас, даже писать на той версии языка что была 6 лет назад - AS2 который сильно похож на JS.

На нем и пишется добрая (скажем 89,26%) часть всех баннеров. И эта добрая часть пишется в основном людьми плохо владеющими AS и пишущих в основном на PHP или JS. Поделать с этим к сожалению ничего нельзя - проблема не в технологии, а в головах. Хотелось бы конечно чтоб владельцы сайтов или баннерообменных сетей следили за качеством своих баннеров, но тут как говорится "Проблемы негров, шерифа не волнуют".

Очень часто разработчики даже в релизных версиях оставляют информацию для дебага. Далеко за примером ходить не надо, например известный клон ютюба:

Хотя в AS3 есть возможность давать команды для компилятора, и исключать дебажный код из конечного swf файла, нажатием одной кнопки или вводом нескольких дополнительных символов если используется command line компилятор.

Этой фичей пользуется хорошо если 1000 разработчиков во всем мире.

Почему у %username% все работает, а у меня нет?

Основная часть технологии Flash - это Flash плеер. В нем часто находят и фиксят большое количество ошибок и неточностей (на данный момент 478 открыто и 114 в работе), и чуть ли не каждую неделю выходит новая версия плеера. Для большинства разработчиков все эти версии превращаются в version hell - в одной минорной версии все работает, в другой нет, в третьей тормозит отрисовка, в пятой не работают хаки благодаря которым работает код в первой. К тому же заставить пользователя обновить плеер достаточно трудно ( ютюб работает, вконтакт музыку проигрывает - значит все нормуль).

А как можно так криво сделать?

Ну тут в Adobe наверное курсы есть специальные, не думаю, что нормальный разработчик хочет делать кривой продукт. К тому же анонсирование всяких фич, а-ля писать программы под айфон, когда плеер уже давно не может нормально работать под маком, как-то странно. Лично по моему мнению среднее количество проклятий в сторону Adobe от flash разработчиков составляет порядка 50 в год. Не верите? Вот вам пример на ActionScript3 (тем кто разбирается в программировании):


Я немного изменил код, для наглядности. Раньше было p["a"] = 2;

Тут вроде бы все ясно, должно быть:

a 2
b 1
с 1

Но будет:

a 2
a 1
с 1

Почему? Загадка… Таких вот вещей довольно много. Как будто ходишь по темной комнате с разбросанными детскими граблями.

Все так плохо? А как дела с маком и линуксом?

Плохо. Если смотреть на линукс, то Adobe как платформу ее начала воспринимать примерна года 2 назад. До этого flash на линукс воспринимался как синоним слова геморрой. Чего стоит только одна ошибка ввода юникодных символов в текстовых полях, которая через 1.5 года после обнаружения была торжественно закрыта.

С маками тоже проблема - жуткие тормоза. И при просмотре видео и вообще при работе Flash плеера. При чем разница между Win и Mac очень существенная, в одном из моих проектов отрисовка элементов в Win была на уровне ~120-200 в секунду, на Mac отрисовка была на уровне ~16-40. Задаче в баг трекере Adobe с этой проблемой уже больше года, и она с открытой датой, так что когда пользователи маков получат нормальный плеер не известно. Особенно смешно выглядит скриншот, где показано, что виртуальная машина с Windows при просмотре видео ест всего 8% CPU, а Firefox 61%.

Хм… Но ведь есть супер мега фича - написание кода на C и C++ под Flash плеер! Может использовать ее?

Да, не так давно Adobe дала возможность разработчикам продукт под названием Alchemy (какая ирония - название псевдонауки), который позволяет писать приложения на C/C++ и исполнять в виртуальной машине Flash плеера. В примерах производительность поражала. Но, через некоторое время выяснилось, что по большей части прирост был вызван использованию нескольких недокументированных команд для работы с памятью и бинарными данными. И через некоторое время одним замечательным человеком был создан продукт под названием TurboDieselSportInjection (автор признавался что у него туго с названиями), позволяющий модифицировать swf файл, для работы с этими командами. К тому же это скорее мост, чем реальная возможность писать на C или C++ под Flash плеер.

То есть так все плохо? Значит HTML5 рулит?

Отчасти. Даже я как Flash разработчик понимаю, что нужно отделить возможность смотреть видео от Flash плеера. Но Flash это хорошая платформа для написания казуальных игр и виджетов. Это хорошая платформа для написания онлайновых MMORPG, хотя пока с 3D у Flash не особо (разве что Alternativa Platform немного вытягивает). К тому же есть приложения написанные хорошими AS3 программистами, но к сожалению их не так много.

К тому же я надеюсь что бурное развитие html5 даст хороший пинок Adobe.

Так может гоу на Silverlight?

Пока Silverlight проигрывает Flash по многим пунктам - поддержка на Linux (да, да я знаю про mono, но хочется официально), малая распространенность, к тому же сильная зависимость от продуктов Microsoft. Но поживем увидим, ни Adobe ни Microsoft на месте не стоят.

Тут я бы скорее смотрел в сторону языка haxe. У него много плюсов и возможность писать код который можно экспортировать для разных платформ, впечатляет (на данный момент это JS, Flash, NekoVM, PHP, C++, iPhone). К тому же компилятор haxe работает в разы быстрее компилятора flash/flex и поддерживает те самые недокументированные команды из Alchemy. Но пока у данного языка маленькое комьюнити, мало документации и примеров, хотя я надеюсь что стремительное развитие языка продолжится.

Значит Джобс был прав насчет Flash на iPad?

Ну я бы сказал, что он лукавил. Все таки пользователям наплевать, как работает технология. Если мне она не нужна, я просто не буду ее использовать. Если бы Flash плеер был на iPhone/iPod/iPad и он работал бы так же плохо как и на больших маках, пользователи бы им просто меньше пользовались. К тому же наличие Flash может сильно ударить по доходам appStrore от казуальных играх и мини приложений.

Пока Flash плеер плохо работает на Mac есть причина по которой Apple может не пускать Flash плеер, но если в Adobe это исправят, возможно мы увидим Flash на экранах устройств от Apple.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=34969