- PVSM.RU - https://www.pvsm.ru -

Кроссплатформенная разработка на Adobe Air: война бобра с ослом

Как известно, халява — двигатель прогресса. Хотите использовать кроссплатформенную мультимедийную технологию с низким порогом вхождения? Код могут писать студенты второго курса, а портирование iOS —> Android при некотором везении занимает полчаса. Векторная графика и анимация в лучшем виде, растр, видео, звук и даже иногда 3D импортируются без особых усилий. Правда, хотите?
Тогда добро пожаловать в наш клуб любителей граблей имени Jonathan Gay (если кто забыл — один из создателей технологии flash). Кстати, когда он увидел, во что превратился Flash — ушёл из IT в сельское хозяйство.
image
Не верите? [1]

Adobe Flash — так же, как любая другая технология — успешно решает свой специализированный спектр задач. За последние 8 лет мне удалось довести до успешного завершения более трёх десятков проектов на flash. Все эти годы я с интересом следил за дискуссиями на тему «когда же он, собака, сдохнет». Кстати, крайний раз это был пост на хабре от 4 апреля [2].

Сегодня мне бы хотелось немного рассказать о частном случае вполне успешного применения flash в версии Adobe Flash CS6 + Adobe Air SDK 3.5 для разработки iOS/Adnroid приложения, описанного в нашем предыдущем посте [3].
image

Сразу уточню: в этом тексте не будет примеров кода на as3. Просто список нюансов, с которыми мы столкнулись при разработке конкретного приложения, и общие ощущения программиста и технолога от использования Adobe Air.

Итак, постановка задачи: мы создаём приложение, воспроизводящее набор звуков, анимаций, управляемых акселерометром, позволяющее сохранять записанный звук. Что ещё? Ах да, работа с API распространённых соцсетей (в первую очередь, конечно, FB и VK) — всякие там кнопочки «написать о приложении на стене» и самопальная система сбора статистики — запросы к нашему родному MySQL-серверу. Поддержка встроенных покупок в App Store и Google Play. Вся эта красота должна прилично выглядеть на iPhone, iPad и всех (о горе!) чёртовых гуглофонах.

image

Идём по пунктам.
• Подгрузка и воспроизведение mp3-файлов — проблем нет, это Adobe AIR умеет хорошо.
• Анимации с акселерометром — всё отлично, пакет flash.sensors.Accelerometer нам в помощь.

image

• Записать и сохранить звук — легко, но… в формате wav. Класс Microphone от Adobe Air возвращает в SampleDataEvent сырые данные. Какой mp3, какой encoder?! Не, не слышали. 6 Мб в минуту — нормально?! Единственное готовое решение, которое мы нашли на as3 — библиотечка ShineMP3Encoder, спасибо автору Gabriel Bouvigne [4]. Работает, правда, долго (грабли №1). Минутный трек кодируется секунд 15 на iPad3, к примеру.

image

А вот на Android производительность вполне приличная. Не нравится — пишите encoder сами. Какие ещё сроки релиза?!

• Конечно, любая соцсеть предоставляет разработчикам библиотеки для работы с её API. Конечно, написанные на нативе. Во flash существует механизм native extensions [5] (аллилуйя!), расширяющий функциональность Adobe Air за счёт подключения компонент, написанных не на as3.

image

Их можно купить в разных местах [6], в том числе прямо у Adobe [7], недорого… для некоторых задач. Например, для Facebook такая компонента есть [8],

image

а для ВКонтакте нету — пишем сами (грабли №2).

image

• Встроенные покупки есть [9], а определение device id или Mac устройства… пока не нашёл (грабли №3), идентификатор пользователя в системе сбора статистики остался дурацким, сложно отследить факт установки нескольких наших приложений с одного устройства и эффективность кросс-рекламы.

• Теперь о качестве графики.
Интуитивно понятно, что идеальное качество графики будет, если у вас разрешение растровой картинки совпадает с разрешением экрана устройства. Пиксель-в-пиксель, красота! Но есть небольшая сложность — ваше приложение запускается на устройствах с разными характеристиками экрана. Для iOS ещё можно сделать наборы картинок и подставлять их в зависимости от типа устройства (ну, 5-6 наборов картинок). Угадали, это утяжеляет приложение. А что делать с проклятыми гуглофонами? Эта проблема и способы её решения прекрасно известна разработчикам iOS/Android, упомяну только о специфическом для Adobe Air способе решения.

Казалось бы Adobe Flash — мощный редактор векторной графики. Рисуй себе, а оно потом растянется под размер экрана (это же вектор!), и будет тебе счастье. Ага, размечтались. Растянуться-то оно растянется, но качество картинки оставляет желать лучшего — не заточены графические процессоры смартфонов и планшетников под эти задачи (грабли №4). А как тормозит векторная анимация, это надо видеть! Эмпирическим путём установлено [10], что импорт растровой графики с галочкой Allow Smoothing даёт оптимальный результат. Действительно, Adobe Air сглаживает с приличным качеством, и не нужно 5 наборов картинок. Не забываем выставить Resolution High в настройках публикации проекта.

image

Нормально придумано — рисовать в векторном редакторе векторную графику, потом её растеризовать и импортировать обратно?! Вообще технические фокусы процесса растеризации — тема для отдельной статьи, одни Sprite Sheets чего стоят, я уж молчу про blitting [11].

Пару слов про размеры сцены. Ежели нет времени и сил кастомизировать интерфейс, выпустить отдельно iPhone и iPad версии, то можно сделать базовый размер сцены под iPhone — 960 на 640, соответственно получив вертикальные «уши» на iPad и горизонтальные на iPhone 5 (при Aspect Ratio Landscape, конечно). Для Android с его безумным многообразием устройств оптимальный размер сцены выбрать настолько сложно, что можно оставить 960 на 640, хотя это, видимо, не оптимальное соотношение высота/ширина экрана для Android-устройств [12].

image

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

РЕЗЮМИРУЮ

Приложение, о котором я рассказывал, было реализовано одним программистом за две рабочие недели (программная часть, конечно). 4088 строчек кода на as3. Анимации рисовали дольше. И портировано на Android за пару часов — добавили кнопку «закрыть приложение», для которой в iOS нет места, перебили ссылки, поменяли интерфейс встроенных платежей и настройки публикации.

image image

Честно говоря, глядя на то, что получилось, о выборе технологии особо не жалеем. О качестве, конечно, судить пользователям, но пока что отзывы хорошие.
У Adobe Air есть ряд ограничений и косяков, но у какой технологии их нет? Если не пытаться пихать во flash невпихуемое, он вполне адекватен задачам, подобным решённой выше.

А за любую конструктивную критику и хорошие идеи будем очень благодарны.
C вами был главный программист Online Science Classroom, Михаил Стеценко. Удачи!

Автор: oscteam

Источник [13]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/razrabotka-pod-ios/32525

Ссылки в тексте:

[1] Не верите?: http://habrahabr.ru/post/148212/

[2] 4 апреля: http://habrahabr.ru/post/175475/

[3] предыдущем посте: http://habrahabr.ru/company/osc/blog/174523/

[4] Gabriel Bouvigne: http://gabriel.mp3-tech.org/

[5] native extensions: http://www.adobe.com/devnet/air/native-extensions-for-air.html

[6] разных местах: http://sleepydesign.blogspot.de/2012/07/ane-free-air-native-extensions.html

[7] прямо у Adobe: http://www.adobe.com/devnet/air/native-extensions-for-air

[8] есть: http://www.milkmangames.com/blog/tools/#iosgv

[9] есть: http://www.milkmangames.com/blog/tools/#iosiap

[10] Эмпирическим путём установлено: http://www.flashburn.info/2011/07/tweethunt-appstore-air-2.html

[11] blitting: http://www.adobe.com/devnet/flash/articles/blitting_mc.html

[12] Android-устройств: http://habrahabr.ru/post/169141/

[13] Источник: http://habrahabr.ru/post/177267/