Некоторое время назад я закончил портирование игры iDracula — Undead Awakening которую разработала компания Moregames Entertainment с платформы iPhone, на платформу Android.
Я готов поделиться с вами своими мыслями и проблемами, с которыми я столкнулся.
Хочу предупредить что я гораздо больше работал с платформой Android (исходя из специфики задачи :), но так же имею опыт разработки более «мелких» игр для платформы iPhone. Так же игры для iPhone я разрабатывал на cpp, а не ObjectC.
Сложная тема, учитывая разность языков и операционных систем. Поэтому коротко и ИМХО.
xCode к сожалению на мой взгляд сложно назвать современной IDE, особенно когда приходиться много работать и рефакторить чужой код. В этом плане преимущество IntelliJ IDEA, или Eclipse (плагин для разработки под Android есть под обе IDE) чувствуется очень сильно. Мне в ряде случае было проще перенести код как есть, а потом уже сделать определенный рефакторинг кода уже в java версии. Отладка под xCode так же требует гораздо больше навыком и знания определенной специфики. К минусам инструментов платформы Android можно отнести некоторую нестабильность плагинов (особенно eclipse) — они периодически забывают adb.exe в памяти, что делает невозможным профилирование через DDMS. Необходимо соблюдать четкий порядок, сначала запустили ddms, потом уже отлаживаемся. Существенным минусом так же является тяжеловесность эмулятора — стартует он долго, работает медленно. При 35 fps на устройстве я на своем MacBook Pro имею 15 fsd на эмуляторе, и еще меньше в режиме отладки, что делает не возможность полноценного тестирования многих вещей. Симулятор для iPhone стартует практически мгновенно, и не уступает в скорости девайсу.
Единственная проблема с которой я cтолкнулся при разработке под iphone это отсутствие поддержки ogg. Проблема решилась простым портированием соответствующей библиотеки.
С Android SDK к сожалению не все так просто.
Самая серьезная проблема это утечки памяти при использовании OpenGL функций glXXXPointer. Фактически на каждый вызов функции мы имеем memory leak размеров в массив который мы устанавливаем. Т.е. что не делай при использовании этих функций мы рано или поздно получим вызов gc, а это от 200 до 1500 ms лаг. Вот тут есть подробности. Так же стоимость вызова функций glXXXPointer сильно выше, что впрочем ожидаемо.
Большая стоимость обработки тачскрина — т.е. тупо у вас 50 фпс, ставите палец на экран у вас 30 фпс. Ибо плодятся MotionEvent-ы и грузят систему. Решение делать sleep после получения MotionEvent решает проблему не польностью.
Отсутствие поддержки мультитача. Причем на уровне SDK, т.е. даже если у вас прошивка которая поддерживает мультитачь, или HTC Hero в котором так же есть поддержка мультитача — вы в данный момент не сможете использовать его в своем приложении.
К сожалению в текущий момент мы имеем достаточно разные устройства. Основные проблемы связаны с HTC Dream (G1). G1 имеет гораздо более худшую чувствительность трекбола по сравнению с Magic и Hero. Там где игрок будет комфортно играть используя трекболл на Magic, он может иметь проблемы на Dream.
Есть проблемы и получением данных с сенсоров положения при включенной музыки. Если у вас играет музыкальный трек с громкостью 0,5 от максимальной, то даже в неподвижном состоянии вы будите получать дребезг датчиков от -40 до +40 из возможного диапазона от -90 до +90 (-180/+180). Фактически при таком дребезге не возможно использовать датчики положения для управления игрой. Только при снижении громкости до 0,2 от максимальной дребезг снижается до диапазона -4/+4, что уже приемлемо.
На G1 так же есть проблемы с малым количеством памяти, они усугубляется тем что виджеты которые пользователь размещает на своем рабочем столе могут потреблять мого памяти (до 15 мегабайт), но при этом пользователю не очевидно что они являются запущенными программами. Поэтому можно получать разные отзывы от пользователей с одинаковыми устройствами. От «вау игра летает» до «невозможно играть, одни лаги» (см. пункт выше о мемори ликах).
Проблемы с G1 с малым количеством места для установки программ, в среднем на нулевой системе у пользователя порядка 30 мегабайт. После установки приложений меньше. Если приложение большое (полная версия iDracula занимает 13 мегабайт) то могут быть проблемы с установкой. Ниже распишу более подробно.
К сожалению Android Market по всем параметрам проигрывает AppStore.
В текущий момент на маркете нету возможности указать устройства под которые разработано ваше приложение.
Т.е. если вашему приложению нужна hardware клавиатура, или мультитач (когда его введут), то приложение будет видно владельцам устройств без этих опций и вы будите получать негативную оценку от них.
Проблемы с установкой больших приложения. Уже как лет пять на всех сотовых телефонах при установки приложения пользователь после скачивания приложения в случае нехватки места для установки помимо предупреждения получает диалог с возможностью удалить текущие приложения и сражу же продолжить установку. На android он вынужден вызвать множество меню для данного дейсвия. Более того если ваше приложение занимает 10 мегабайт, то для его установки требуется минимум 20 мегабайт (скаченый файл, и место для установки).
Одним из решений является установки приложения без ресурсов, и скачиванием ресурсов самим приложением с сохранением их на флешку.
Хотелось бы видеть это стандартной возможностью SDK — возможность пометить часть файлов для размещения на флешке.
Так же очень не хватает возможности получить помимо отзыва (например о падении приложения) информацию об устройстве на котором пользователь оставляет отзыв, а в идеале лог работы приложения как это сделано в iphone.
Не хватает раздела Entertaiment — игры вынуждены соревноваться в топах с приложениями типа «Красивый огонь на вашем экране».
Ну и отсутствие скриншотов, приводит к тому что игру в большей мере выбирают исходя из названия (описания как известно никто не читает), такая проблема была, кстати, и на BREW рынке. Плюс еще есть ограничение на размер описания.
Если резюмировать, то разрабатывать нужно приложения размером до 3х мегабайт, используя, желательно, не более 15 мегабайт памяти и делать запас на тормоза при работе с тачскрином.
Изначально было желание написать более структурированный обзор и больше времени уделить iphone, но чувствую что так статья бы провалялась в черновиках еще бы месяц. Надеюсь, сложенное будет полезно и в таком виде. Я готов ответить на вопросы в комментариях.
P.S. Если у вас есть готовая игра под iphone или другую мобильную платформу и вы хотите ее порт под Android с условием shared revenu или фиксированной оплаты, то я с удовольствием пообщаюсь с вами. :) Например по скайпу — youngskipper. Готов так же пообщаться с другими разработчиками — по обсуждать платформу.
Я готов поделиться с вами своими мыслями и проблемами, с которыми я столкнулся.
Хочу предупредить что я гораздо больше работал с платформой Android (исходя из специфики задачи :), но так же имею опыт разработки более «мелких» игр для платформы iPhone. Так же игры для iPhone я разрабатывал на cpp, а не ObjectC.
Cреда и инструменты разработки
Сложная тема, учитывая разность языков и операционных систем. Поэтому коротко и ИМХО.
xCode к сожалению на мой взгляд сложно назвать современной IDE, особенно когда приходиться много работать и рефакторить чужой код. В этом плане преимущество IntelliJ IDEA, или Eclipse (плагин для разработки под Android есть под обе IDE) чувствуется очень сильно. Мне в ряде случае было проще перенести код как есть, а потом уже сделать определенный рефакторинг кода уже в java версии. Отладка под xCode так же требует гораздо больше навыком и знания определенной специфики. К минусам инструментов платформы Android можно отнести некоторую нестабильность плагинов (особенно eclipse) — они периодически забывают adb.exe в памяти, что делает невозможным профилирование через DDMS. Необходимо соблюдать четкий порядок, сначала запустили ddms, потом уже отлаживаемся. Существенным минусом так же является тяжеловесность эмулятора — стартует он долго, работает медленно. При 35 fps на устройстве я на своем MacBook Pro имею 15 fsd на эмуляторе, и еще меньше в режиме отладки, что делает не возможность полноценного тестирования многих вещей. Симулятор для iPhone стартует практически мгновенно, и не уступает в скорости девайсу.
SDK
Единственная проблема с которой я cтолкнулся при разработке под iphone это отсутствие поддержки ogg. Проблема решилась простым портированием соответствующей библиотеки.
С Android SDK к сожалению не все так просто.
Самая серьезная проблема это утечки памяти при использовании OpenGL функций glXXXPointer. Фактически на каждый вызов функции мы имеем memory leak размеров в массив который мы устанавливаем. Т.е. что не делай при использовании этих функций мы рано или поздно получим вызов gc, а это от 200 до 1500 ms лаг. Вот тут есть подробности. Так же стоимость вызова функций glXXXPointer сильно выше, что впрочем ожидаемо.
Большая стоимость обработки тачскрина — т.е. тупо у вас 50 фпс, ставите палец на экран у вас 30 фпс. Ибо плодятся MotionEvent-ы и грузят систему. Решение делать sleep после получения MotionEvent решает проблему не польностью.
Отсутствие поддержки мультитача. Причем на уровне SDK, т.е. даже если у вас прошивка которая поддерживает мультитачь, или HTC Hero в котором так же есть поддержка мультитача — вы в данный момент не сможете использовать его в своем приложении.
Устройства
К сожалению в текущий момент мы имеем достаточно разные устройства. Основные проблемы связаны с HTC Dream (G1). G1 имеет гораздо более худшую чувствительность трекбола по сравнению с Magic и Hero. Там где игрок будет комфортно играть используя трекболл на Magic, он может иметь проблемы на Dream.
Есть проблемы и получением данных с сенсоров положения при включенной музыки. Если у вас играет музыкальный трек с громкостью 0,5 от максимальной, то даже в неподвижном состоянии вы будите получать дребезг датчиков от -40 до +40 из возможного диапазона от -90 до +90 (-180/+180). Фактически при таком дребезге не возможно использовать датчики положения для управления игрой. Только при снижении громкости до 0,2 от максимальной дребезг снижается до диапазона -4/+4, что уже приемлемо.
На G1 так же есть проблемы с малым количеством памяти, они усугубляется тем что виджеты которые пользователь размещает на своем рабочем столе могут потреблять мого памяти (до 15 мегабайт), но при этом пользователю не очевидно что они являются запущенными программами. Поэтому можно получать разные отзывы от пользователей с одинаковыми устройствами. От «вау игра летает» до «невозможно играть, одни лаги» (см. пункт выше о мемори ликах).
Проблемы с G1 с малым количеством места для установки программ, в среднем на нулевой системе у пользователя порядка 30 мегабайт. После установки приложений меньше. Если приложение большое (полная версия iDracula занимает 13 мегабайт) то могут быть проблемы с установкой. Ниже распишу более подробно.
Доставка контента пользователю
К сожалению Android Market по всем параметрам проигрывает AppStore.
В текущий момент на маркете нету возможности указать устройства под которые разработано ваше приложение.
Т.е. если вашему приложению нужна hardware клавиатура, или мультитач (когда его введут), то приложение будет видно владельцам устройств без этих опций и вы будите получать негативную оценку от них.
Проблемы с установкой больших приложения. Уже как лет пять на всех сотовых телефонах при установки приложения пользователь после скачивания приложения в случае нехватки места для установки помимо предупреждения получает диалог с возможностью удалить текущие приложения и сражу же продолжить установку. На android он вынужден вызвать множество меню для данного дейсвия. Более того если ваше приложение занимает 10 мегабайт, то для его установки требуется минимум 20 мегабайт (скаченый файл, и место для установки).
Одним из решений является установки приложения без ресурсов, и скачиванием ресурсов самим приложением с сохранением их на флешку.
Хотелось бы видеть это стандартной возможностью SDK — возможность пометить часть файлов для размещения на флешке.
Так же очень не хватает возможности получить помимо отзыва (например о падении приложения) информацию об устройстве на котором пользователь оставляет отзыв, а в идеале лог работы приложения как это сделано в iphone.
Не хватает раздела Entertaiment — игры вынуждены соревноваться в топах с приложениями типа «Красивый огонь на вашем экране».
Ну и отсутствие скриншотов, приводит к тому что игру в большей мере выбирают исходя из названия (описания как известно никто не читает), такая проблема была, кстати, и на BREW рынке. Плюс еще есть ограничение на размер описания.
Если резюмировать, то разрабатывать нужно приложения размером до 3х мегабайт, используя, желательно, не более 15 мегабайт памяти и делать запас на тормоза при работе с тачскрином.
Изначально было желание написать более структурированный обзор и больше времени уделить iphone, но чувствую что так статья бы провалялась в черновиках еще бы месяц. Надеюсь, сложенное будет полезно и в таком виде. Я готов ответить на вопросы в комментариях.
P.S. Если у вас есть готовая игра под iphone или другую мобильную платформу и вы хотите ее порт под Android с условием shared revenu или фиксированной оплаты, то я с удовольствием пообщаюсь с вами. :) Например по скайпу — youngskipper. Готов так же пообщаться с другими разработчиками — по обсуждать платформу.