Pull to refresh

Разработка игрового приложения под iPhone. Часть 3

Game development
Время разработки — 6+ месяцев двух человек в свободное от работы время.
Состав команды — 1 художник 1 программист.
Время от идеи до прототипа — 1 неделя
Арт данные — 288 мегабайт, 1400 файлов
Код Движка и Игры (без сторонних библиотек) ~ 50024 строк кода, 485 файлов
Код Игры — 4338 строк — 12 файлов
Финальный размер дистрибутива для аплоада в AppStore 22мб
Финальный размер в AppStore 25мб



Код мерялся при помощи blog.schuager.com/2009/01/line-count-in-visual-studio.html (В солюшене были оставлены только проекты движка и игры)

Предистория


Часть 1
Часть 2

Организация работы



Ведение проекта было организовано в онлайн с использованием Google Sites и Google Docs.

image
Главная страница проектов. Слева список по проектам и их внутренние страницы:

image
Можно создавать странички, шаблоном которых являются файловые хранилища, например:
Ограничение 20 мб на файл и 100 мб на весь сайт.
Когда наши билды стали по размеру больше 20 мегабайт то мы начали их шарить через Google Docs

image
Можно создавать странички, шаблоном которых являются всевозможные Issue Trackers

Плюсы:

  • Бесплатно
  • Не требует времени на саппорт
  • Онлайн

Минусы:

  • Отсутствие форума в возможностях Google Sites
  • Ограничение по размерам файлов и размеру сайта — но никто не запрещает создавать больше одного сайта на один аккаунт


Разработка


Разработка шла по выходным дням (до 10 часов суммарно за выходные) и иногда в рабочие после 7 вечера (2-3 часа).
Геймплей с этапа прототипа и до релиза почти не менялся. Много времени было потрачено на балансировку спавнов, как результат были добавлены так называемые волны спавнов, падающие шлемы и стрелы. Изначально игра планировалась как платная, но в какой то момент мы таки решились на эксперимент с бесплатной версией. Планы по фичам на будущую платную версию сейчас очень тщательно сортируются взвешиваются и обсуждаются. Проведена сильная оптимизация по времени загрузки и памяти (детали ниже).
Переход на XCode 4 занят 2 дня. Мне лично среда xCode 4 показалась не очень, даже по сравнению с xCode 3 (отсутствие возможности компиляции и препроцесинга пофалово, отсутствие возможности кустимизации тулбара, глюки с постоянной пересборкой Build for Archive, тормоза, и т д). Очень понравилось пользоваться профайлером — на мой взгляд это самый удобный из всех профайлеров которыми мне доводилось пользоватся (включая Windows). C этого момента профайлится я предпочитаю через него.

Ассеты


Арт делался изначально в векторе и экспортировался в png. Надюсь, что когда выйдет 3ий айпад и там будет другое нейтивное разрешение конвертация будет быстра и безболезненна. Сейчас экспортируется как для 1024х768 и специальными скриптами процесится для iphone(480x320), iphone retina(960x640).

Итого:
  • основной набор асетов для айпада
  • под каждую платформу свой набор асетов (генерируется по правилам скрипта)
  • если скрипт перегонки сгенерировал одинаковые .png файлы, это не проблема, так как учитывается на этапе генерации пак файла.

Звук


Звук в .ogg. Часть звуков играется потоково, количество и длина OpеnAL буферов задается через конфиг. Потоковое проигрывание звука полностью отлаживалось на Windows и без малейших изменений заработало на iPhone.
Сейчас рассматриваю альтернативы vorbis-ogg из-за относительно медленного декодинга. Посматриваю в сторону IMA4 (который поддерживается на уровне железа).
Возможно звук в IMA4 будет конвертироваться на этапе компиляции пака (описан ниже).

Ресурсы игры


Для iOS билда все данные загонялись в пак файл.
Пак файл — это скомпилированные ассеты под нужную платформу с применением дополнительных оптимизаций:
  • Проверка и удаление альфы из текстур где она вся белая
  • Сжатие данных, если размер уменьшает размер файла на более чем NN процентов
  • Детект инстансов файлов
  • Прекомпиляция и стрипинг скриптов и конфигурационных файлов
  • Запуст OptiPng на все png ресурсы, включая Defaul.png и Icon###.png
  • конвертация некоторых (больших) png файлов в свой собственный формат (связано с тем что png использует zlib (deflate) который не очень быстро работает на распаковку (детали смотрите ниже)

Зачем это нужно:
  • в проекте всегда только один файл data0000.pak — избавляет от добавления каждого ассета в проект XCode и полностью исключает ошибки на этом этапе
  • Скорость загрузки — на Iphone 4 с 10 секунд до 5 сек, на Windows из 5ти секунд до меньше секунды
  • Размеры — все данные в паке сжаты и оптимизированы

Особенности реализации пак файла

Это не zip файл, a простой собственный формат (который частенько меняется от версии к версии).
Почему не zip файл — распаковка zlib-ом на iPhone не дает никаких преимуществ — время загрузки из файла для несжатых данных быстрее чем распаковка.
Варианты которые я пробовал:
  • zlib — очень медленный с отличной компресией (тестовых попугаев распаковывает за 15ms)
  • snappy — быстр, но компрессия не очень (тестовых попугаев распаковывает за 5ms) (виндовая версия иногда асертила на не выровненные данные — много времени разбиратся не было)
  • flastlz — быст и с хорошей компресией (тестовых попугаев распаковывает за 7ms) — www.fastlz.org

Не забываем что приложение из AppStore скачивается в запакованном виде, следовательно уровень компрессии важен не сильно.
Cвязка fastlz и поверх zip(appstore) меня устроила. Zip для аппстора ужимает паки еще на 4 мб. C 19 до 15 мегабайт.
В будущем есть планы на перепроверку snappy.
В предрелизные дни был также пересмотрен JPG как альтернативный формат для хранения текстур, не всех, а только 24 бита и только тех которые после JPG отличаются на минимальную погрешность (больших текстур, которые удовлетворяют данному условию я нашел минимум 5). Это будет дополнительным шагом на этапе компиляции пак файла.
Сейчас сборка пака занимает около 15 секунд и делается только перед компиляцией для iPhone (забирается через RSync c Виндовой машины)

Проявился 20 MB лимит на размер приложения в AppStore (ограничение для скачивания через 3g).
Как данные не пакуй и как не крути у нас всегда получалось больше 20. Если бы наш продукт был бы платным, мы конечно бы разделили на HD и не HD.
В нашем случае (бесплатное приложение) решили не разделять.

Реклама


В приложение встроена реклама от iAd и AdMob — в игровом процессе баннеры не показываются (и никогда показываться не будут)
На последней версии моего первого приложения рекламная логика была исправлена. Финальная версия работает так: В случае если iAd по каким-то причинам фейлится, (судя по репортам это происходит чуть ли не в 90% случаев для не USA, Germany, France) то подключается adMob. В результате этого изменения количество денег, которые приносил adMob серьезно увеличилось.

Результат


Приложение можно скачать в AppStore и оно бесплатное (честно бесплатное). Приносит деньги только за клики на баннеры. Приложение универсальное для iPhone, iPhone4 (Retina) и iPad.

Полезный софт


  • AppResigner — программа позволяющая перересайнить с AppStore Distribution provision на Dev provision, что позволяет тестировать бинарник который вы будете отсылать в AppStore (джайл брекнутый девайс позволяет тестировать даже с AppStore Distribution)
  • SvnX клиент для svn под MacOS
  • VisualSVN — сервер с UI для Windows
  • swRSyncServer — rsync для Windows (использовался для синка паков между Windows и MacOS)

Что хорошо:


  • Не закатили ничего
  • Качество которым очень довольны
  • Игра нам нравится

Что плохо:


  • Не вложились в 20 MB
  • Затянулся — около 6ти месяцев — последний месяц было очень тяжело работать.

Что дальше:


  • Android (скорее всего до нового года)
  • Настройка полноценного пайплайна для ночного билда
Tags:iosgamedeviphoneпрограммированиеapp storegamesfree
Hubs: Game development
Total votes 24: ↑16 and ↓8 +8
Views3K

Popular right now

Top of the last 24 hours