Разработка игрового приложения под iPhone
Начало
В октябре 2008 года на очередной встрече с двумя друзьями, я узнал, что оба они занимаются разработками игр под iPhone. В то время я уже имел почти законченный shareware проект под Windows.
Загоревшись желанием портировать его под iPhone, я начал работать в данном направлении.
Цели
Cоздать и настроить средства разработки под Windows платформу без покупки самого девайса, Mac и сопутствующих средств разработки. Покупку Mac была отложена до момента полного понимания что и как работает.
Почти готовый проект и тулзы для него были под Windows поэтому было принято решение всё делать под Windows.
Несколько дней на поиск в интернете и я приступил к осуществлению данной идеи.
Шаг Первый — Настройка окружения и компилятора под Windows, а точнее под Cygwin
Было потрачено где-то около месяца на сборку toolchain под Cygwin. Результатом этого был огромный makefile для сборки toolchain и скомпилированное приложение HelloWorld, которое негде было запустить, так как девайса у меня не было. Когда я говорю что это заняло месяц, это не означает что я месяц по 8 часов в день работал над этим, в основном работа велась по выходным и после работы. Много времени уходило на перекомпиляцию, фикс проблем с путями, фикс проблем компиляции и настройки среды CygWin (только Cygwin я переставлял раза три).
Шаг второй — Перекомпиляция готового Windows проекта под iPhone toolchain
Данный шаг тоже занял где-то 1 месяц. Я впервые познакомился c GCC, командной строкой, makefile, как Windows програмист узнал много интересного и полезного. Отдельно хочу выделить время потраченное на изменение кода под нужды GCC и iPhone SDK. Много времени ушло на разборку с файлами заголовков, на поиск функции под Unix окружение (иногда не совпадали или отсутствовали). Приведение своего кода в портабельный вид посредством #define и интерфейсов прошло довольно безболезненно, также как и сборка Third Party библиотек которые мне требовались, например Lua. Очень с экономил время на том, что проект изначально был под завязан на OpenGL и OpenAL. Оба моих друга предупреждали меня что есть много проблем при работе со звуком на iPhone, в моём случае OpenAL заработал сразу, более того, к звуковом коду даже не прикасался. Также помогло то, что в своё время ядро движка (у каждого игрового программиста должен быть свой домашний движок) был проверен под Embeded Visual Studio для смартофонов. За этот период, более менее устоялся сам процесс разработки и тестирования. Очень удобно делать изменения в Far или Visual Studio и туже проверять компиляцию под iPhone toolchain. Проверка работоспособности игры после изменения кода проверялась в Windows. В какой-то момент было принято решение проверять работоспособность под Linux, для чего была поставлена Fedora Linux на VirtualBox. Особо хочу отметить, что наличие Unit тестов позволило оперативно выявить и исправить большинство проблем (запускать я мог только на Linux, но и этого было уже достаточно). Также хочу посоветовать включить максимальный уровень варнингов и остановку компиляции если есть варнинги (-Werror для GCC), и исправить их всех, только благодаря этому было исправлено несколько коварных багов. Objective-C использовался только в 3ех файлах все остальное написано на С++. Так и не удалось разобраться с обработкой зависимостей между файлами исходников (.cpp) и файлами заголовков (.h) для корректной перекомпиляции в случае изменения только .h файлов.
Итого:
- Игра работает под Windows компилируется для iPhone платформы. Путем так называемых платформ конфигов я мог запускать игру которая вела себя почти как на реальном устройстве, включая разрешение как у девайса, landscape ориентацию, размерность текстур и т.д.
Пример конфига platform.cfg
[PLATFORM_]
; COMMON
[PLATFORM_IPHONE]
; настоящий девайс
maxTextureSize = 256
touchInput = 1
hideArrowCursor = 1; отключен курсов для айфона
defines = PLATFORM=IPHONE
fixedVideoResolution = 1
[PLATFORM_IPHONE_WIN32]
; игра под винду в “режиме совместимости”
maxTextureSize = 256
SupportNonPower2 = 0 ; на виндовс такие текстуры возможны
touchInput = 1
#hideArrowCursor = 1 ;курсор показывается для виндовс
fixedVideoResolution = 1
- Windows версия
- Работоспособный toolchain для компиляции программы на iPhone. Тут совершенно неожиданно я нашел CygwinPutty — модификация PuTTy для работы под Cygwin, сделал его Portable и вынес линк на Quick Launch
Шаг третий — покупка девайса и разработка под сам девайс
Чтобы проверить работоспособность на iPhone был куплен iPod Touch 3g 8GB (как оказалось позже 8gb версия iPod Touch это 2g железо). Был произведён jailbreak, и всё заработало с первого раза. Добавил несколько строчек в makefile чтобы он аплоадил скомпилированный проект на девайс. Для аплоада использовался scp с командной строки, чтобы не вводить пароли постоянно была включена авторизация через ключи.
Шаг четвертый — Оптимизация и отладка
Почти сразу выяснилось что процессор на моем iPod Touh 2g не справляется с симуляцией физики, при том не справляется настолько, что реально стал вопрос о прекращении разработки данной игры под iPhone. На больших сценах симуляция могла занимать до 300 ms на кадр, что естественно неприемлемо. В конечном результате, я отделил рендеринг от симуляции физики. Рендеринг шел с максимальным FPS если детонация зарядов не запущена, и ограничивался 10 FPS при старте детонации. Физика после запуска считалась наперед и по максимуму, то есть как только вы нажали кнопку взрыва и у вас заигрался звук сирены, физика уже могла быть просчитана на 1-2 секунды наперед. Конечно пришлось перенастроить симуляцию физики чтобы хоть как-то влезть по производительности, в результате получилось небольшое слоу мо. На будущее была запланирована активность по окончательной настройке физики, чтобы было ровно столько сколько влазит по производительности на мой iPod Touh 2g. Соответственно за минимальную базу были взяты устройства iPod Touсh 2g. Поигравшись с настройками оптимизатора GCC был выбран -O3. Конечно была произведена оптимизация по 3D сцене, уменьшено количество DrawCall, добавлен прокси для OpenGL стейтов, прикручены вертекс буфера (VBO), почти сведено на ноль количество отрисовок с включенным AlphaTest.
Отладка производилась через логи и gdb установленный на устройстве. C учетом того что код под Windows был вылизан и хорошо протестирован, проблем не возникло. Мемори лики были вычишенны под Windows через Visual Leak Detector. Возможные проблемы с OpenGL и профайлинг через geDebugger.
Шаг пятый — MacOS и xCode
В принципе в данном состоянии уже можно выкладывать проект для продажи на Cydia, но очень сильно хотелось попасть на AppStore, для этого конечно надо собирать под Маком и компилировать xCode. Была проинсталирована MaOS 10.6.5 и xCode на VirtualBox.
Несколько дней было потрачено на сборку под iPhone simulator и проект был закончен.
Шаг шестой — покупка сертификата и прохождение сертификации
Чтобы xCode собрал приложение под девайс разработчик должен купить “iOS Developer Program” — стоит такая привилегия 99$ в год. Заказал и получил кредитную карточку, и в полной уверенности что всё будет хорошо начал регистрироваться как разработчик под iPhone.
Apple не принимает кредитные карточки с Украины. Требуют заполнить форму и послать её по факсу (для России, насколько я понял, ситуация аналогичная).
- 28 Января 2011 — Заполнил и отослал через PamFax
- 2 Февраля 2011 пришел ответ
Шаг седьмой — Mac Mini
Через некоторое время был куплен Mac Mini.
По нескольким причинам:
- Скорость компиляции под виртуальной машиной была очень мала.
- Этап поиска и проверок был закончен — надо было начинать всё делать в легальном русле.
Тем не менее от использования тулчейна я не отказался. Основная разработка ведется на Windows машине. Тулчейн используется для проверки компиляции.
Шаг восьмой — Выпуск Lite версии
Так как игровая механика совсем не казуальная, было принято решение выпустить Lite версию первой.
- 1 Июня 2011 — Выложил на ревью.
- 8 Июня 2011 — Ready for Sale
Шаг девятый — Реализация фидбека по Lite версии
Как оказалось некоторые мои решения в области пользовательского интерфейса оказались не так интуитивны как я думал.
Например:
![Windows версия](https://habrastorage.org/getpro/habr/post_images/026/af6/af0/026af6af060e0c7b65bfba939abeccad.png)
На картинке старый и новые интерфейсы
Кнопка Play (стрелочка снизу) явно была непонятна для игроков, многие просто не догадывались на неё нажать. Решение — клик на уровне запускает уровень сразу, кнопка Play была удалена. Кнопки переключение страниц были перерисованы и заменены на простые стрелочки.
Технические детали
Интеграция GameCenter
Прошла без проблем благодаря примеру GKTapper — developer.apple.com/library/ios/#samplecode/GKTapper/Introduction/Intro.html
GameCenterMenager.h и GameCenterMenager.м перешли в мой код без изменений
Интеграция OpenFeint
День потратил на поиск проблемы из за которой не показывался дашбоард OpenFeint, после прочтения документации выяснилось — я забыл спрятать свое окно по событиям
- (void)dashboardWillAppear
{
self.hidden=YES;
}
- (void)dashboardDidDisappear
{
self.hidden=NO;
}
Интеграция Facebook
Сделано было как написано в developers.facebook.com/docs/guides/mobile.
Но возникли проблемы из за того что OpenFeint уже использовал какой то старый Facebook sdk и при линковке возникли ошибки. Решение было очень простым — в заголовках сдк Facebook пришлось повставлять дефайны такого типа #define FBDialog MFBDialog
Так же в процессе тестирования выяснилось что Facebook показывает каптчу если ваши ссылки на картинки ведут вне домена facebook.
Интеграция Twitter
Был использован MGTwitter — github.com/mattgemmell/MGTwitterEngine
Так же пришлось дописать диалог для пред-показа поста в твиттер (его не было в этом sdk). Выкрутился через UIWebView в котором показывалась страничка в формой ввода, нажатия на кнопку Post и Skip перехватывались и потом пересылалисть в MGTwitter.
Rate Me
Была выбрана маленькая библиотечка https://charcoaldesign.svn.beanstalkapp.com/source/cocoa/iRate/trunk/
Для лайт версии был выбран интервал 7 дней и 7 запусков
Для полной 20 дней и 20 запусков.
Multi touch
Для отладки мультитача под Windows был написан небольшой сервер для девайса, к которому Win32 игра присоединялась при старте и получала все тач события девайса.
Контроль верий
SVN для кода и данных. На Mac код берётся из разшаренной директории с виндовс машины. Пока я работаю один это не проблема и экономит время.
Затраты
- iPod Touch 2g 8GB — 270$
- iOS developer — 100$
- MacMini — 800$
- Свободное время
Результат
- Lite версия в AppStore
- Полная версия в AppStore
- Опыт
Что было хорошо
- Выбор основной платформы Windows. Возможность быстро запустить и по нажатию на кнопку R перегрузить/подгрузить ресурсы экономит много времени. Мой опыт работы программистом на этой платформе около 10 лет — переучиваться под xcode долго. Очень удобно и просто снимать видео.
- Цели — это один их немногих домашних проектов который был закончен. Частенько все мои домашние проекты ложатся в долгий ящик из за нехватки времени. В этот раз у меня была четко поставленная цель.
Что было плохо
- Арт — арт я делал самостоятельно и частично получилось не очень.
- Интерфес — изначально разрабатывался под windows и был довольно сложным, под iPhone пришлось удалить все скрины и оставить только главное меню.
- Плейтесты — плейтесты проводились на себе. Основная проблема это “замыливание глаз” — я мог не замечать явных проблем которые простому игроку были видны сразу.
- Ритм работы — работать в таком темпе очень тяжело.
Ссылки:
- Полезная ссылка о регистрации в iOS Developer Program — www.iphones.ru/forum/index.php?showtopic=31536&st=0?s=3988650a9a235fc5021ea885f11572f5
- Очень хорошая инструкция от покупки сертификата до сборки приложения — habrahabr.ru/blogs/macosxdev/86597
- stackoverflow.com — почти всё решения моих проблем с кодом были взяты отсюда
- www.raywenderlich.com — первоисточники по интеграции твитера и фейсбука.
- www.saurik.com/id/4 — Вариант тулчейна который заработал