Что надо знать для разработки игр для Android: советы Криса Пруетта
Крис Пруетт (Chris Pruett) — продвинутый разработчик программного обеспечения для платформы Android, который сейчас специализируется на играх. Он создал игру Replica Island.

Если вы были в этом году на конференции для разработчиков Google I/O, то, возможно, заметили, что в секции Android было представлено очень много игр. Unity, EA, Com2Us, Polarbit, Laminar Research и некоторые другие разработчики представили игры высочайшего класса для устройств на платформе Android. Разработчики игр проявляют большой интерес к платформе Android, и за последние полгода команду Android завалили заявками. Ниже представлен обзор принципов работы игр для Android, а также то, что нужно знать разработчикам.
Шаг 1: Определитесь с типом устройства
В общем, существуют два типа устройств на платформе Android: низкоуровневые устройства, такие, как G1 (устройства первого поколения), и старшие модели устройств, такие, как Nexus One (устройства второго поколения). На рынке имеется большое количество разных моделей телефонов на Android, но в целом, они могут быть совершенно точно отнесены к какому-либо из упомянутых классов устройств по производительности процессора и графическим характеристикам, т. е. тем параметрам, которые имеют наибольшее значение для разработчиков.
Устройства первого поколения представляют собой телефоны с HVGA-экраном, версией ОС Android 1.5 или1.6 (хотя для некоторых моделей уже предусмотрен переход на версию 2.1), процессором с тактовой частотой 500 МГц и графическим интерфейсом OpenGL ES версии 1.0. Большое число устройств обладает схожим с G1 внутренним устройством (Qualcomm MSM7K CPU/GPU с частотой около 500 МГц), поэтому G1 можно смело отнести к классу низкопроизводительных моделей. Согласно проведенным исследованиям, устройства этой категории поддерживают свыше 5000 текстурных, цветных и затемненных вершин на кадр, а частота смены кадров составляет 30 кадров в секунду. С использованием OpenGL ES при указанной частоте смены кадров на экране могут располагаться более 250 спрайтов (тогда как при частоте 60 кадров в секунду можно нарисовать лишь чуть более сотни спрайтов). Эти цифры несложно запомнить, но они весьма приблизительны. Для расчетов использовалась очень простая методика, без использования, скажем, расширения GL_OES_point_sprite, которое поддерживает G1. Тем не менее, эти цифры могут дать общее представление о возможностях устройств первого поколения.
Устройства второго поколения обладают WVGA-экранами, более быстрыми центральным и графическим процессорами, а также поддерживают интерфейс OpenGL ES версии 2.0. Типичными примерами устройств этого типа являются Nexus One и Motorola Droid. Скорость их работы, по сравнению с устройствами первого поколения и работой OpenGL 1.0 в чистом виде, в пять раз выше, т. е. можно получить свыше 27 тысяч текстурных, цветных и затемненных вершин на кадр с частотой смены кадров 30 кадров в секунду. OpenGL ES 2.0 может работать и быстрее, но все устройства второго поколения требуют дополнительных затрат ресурсов для перевода команд OpenGL ES 1.0 в версию 2.0, которое поддерживает встроенное аппаратное обеспечение для обработки графики. Однако, большие экраны этих устройств означают, что они привязаны к их наполнению: затраты ресурсов по наполнению пикселями довольно высоки, и зачастую невозможно рисовать что-либо при частоте смены кадров более 30 в секунду, независимо от сложности сцены.
Поскольку различие в производительности устройств первого и второго поколений довольно велико, необходимо очень четко определить целевую группу устройств. Согласно статистическим данным о распространенности версий ОС Android, телефоны первого поколения занимают свыше 50% рынка, однако доля устройств второго поколения стремительно растет. Игры, версии которых можно устанавливать на телефоны как первого, так и второго поколений, пользуются повышенным спросом.
Шаг 2: Выберите язык
Если вы разрабатывали приложения для ОС Android, а теперь подумываете о том, чтобы создать игру, скорее всего, вы выберете Java. Если вы уже давно занимаетесь разработкой игр, которые теперь хотите переработать под Android, то вам, возможно, будет удобней делать это на C++.
Аркада Replica Island, в которой герой управляется скроллом, полностью написана на Java. Для прорисовки использовался интерфейс OpenGL ES 1.0. Она обратно совместима с версией ОС Android 1.5. Игра идет с достаточно высокой частотой смены кадров (около 60 кадров в секунду для G1) почти на всех устройствах на платформе Android. На самом деле, очень много популярных на Android Market игр написаны на Java, поэтому если вам сложновато писать на C++, то знайте, что Java прекрасно подходит для создания игр для Android.
Конечно, если вы хотите, чтобы игра не подтормаживала, то лучше всего использовать родной код. Только что вышла четвертая версия NDK для Android, в которую вошли некоторые, чрезвычайно полезные для разработчиков игр изменения. С помощью NDK можно перекомпилировать код в разделяемую библиотеку и внедрить ее в оболочку Java, чтобы получить возможность управлять вводом и жизненным циклом событий, а всю тяжелую работу делать в C++ с использованием стандартных API для OpenGL ES. В четвертой версии можно портировать родной код непосредственно в буферы пикселей Java Bitmap, что намного быстрее, чем загружать растровые изображения в виде GL-текстур для каждого кадра в 2D-играх, где требуется создать собственную композицию сцены. В четвертую версию (наконец-то!) включена поддержка gdb для корректирования вашего кода непосредственно на устройстве.
Следует помнить, что при использовании NDK у вас нет доступа к Android Framework API. Например, из C++ нельзя проиграть звуковую дорожку (хотя на последней конференции Google I/O было объявлено о том, что планируется добавить поддержку OpenSL ES). Некоторые разработчики пользуются AudioTrack API с целью совместного использования прямого буфера с родным исходным кодом, позволяющим микшировать и генерировать PCM-поток на лету, а многие запускают интерфейс Java SoundPool из C++. Но для этой процедуры необходим переход из JNI в код Java.
Шаг 3: Тщательно продумайте самую лучшую в мире игру
Когда вы определились с классом устройств и средой разработки, можно начинать. Но прежде, чем вы начнете создание эпической, кошачьей, натуралистичной, космической, морской, боевой онлайн- RPG с кланами и высокой моралью, подумайте о конечных пользователях. Вообще, существуют две области, которые требуют особого внимания при создании игр: системы сжатия текстур и ввода.
Сжатие тексур — это способ (вы, наверное, удивитесь!) сжать данные о текстурах. Оно поможет увеличить производительность и позволит вместить больше текстур в видеопамять. Проблемой при сжатии текстур может стать то, что различные видеокарты поддерживают разные форматы текстур. G1 и другие устройства MSM7k поддерживают формат сжатия ATITC от ATI. Droid поддерживает формат PVRTC от PowerVR. Tegra2 от Nvidia поддерживает формат DXT. Плохой новостью является то, что эти форматы несовместимы.Хорошей новостью является то, что все устройства на OpenGL ES 2.0 (включая Nexus One на процессоре Snapdragon, Droid на OMAP3 и устройства на процессоре Tegra2) поддерживают общий формат ETC1. ETC1 — не самый лучший формат текстур (в нем недостает поддержки альфа-каналов); он не поддерживается устройствами первого поколения, но это традиционный формат (SDK для Android предлагает инструмент для сжатия текстур (см. sdk/tools/etc1tool) и ряд рабочих инструментов для этого формата).
В итоге, если вы сжимаете текстуры, то необходимо обеспечить разные версии текстур, сжатые с использованием разных форматов. Можно сделать это в одном АПК, скачать текстуры из интернета по HTTP или использовать ETC1 и ограничиться только устройствами на OpenGL ES 2.0. Что касается Replica Island, то текстуры в этой игре вообще не сжимались. По вопросам поддержки того или иного формата устройством можно обратиться к строке GL_EXTENSIONS.
String extensions = " " + gl.glGetString(GL10.GL_EXTENSIONS) + " ";
String version = gl.glGetString(GL10.GL_VERSION);
String renderer = gl.glGetString(GL10.GL_RENDERER);
boolean isSoftwareRenderer = renderer.contains("PixelFlinger");
// On 1.6 and newer, we could use ActivityManager.getDeviceConfigurationInfo() to get the GL version.
// To include 1.5, I'll use the GL version string.
boolean isOpenGL10 = version.contains(" 1.0");
boolean supportsDrawTexture =
extensions.contains(" GL_OES_draw_texture "); // draw_texture extension
boolean supportsETC1 =
extensions.contains(" GL_OES_compressed_ETC1_RGB8_texture "); // standard ETC1 support extension
// VBOs are guaranteed in GLES1.1, but they were an extension under 1.0.
// There's no point in using VBOs when using the software renderer (though they are supported).
boolean supportsVBOs =
!isSoftwareRenderer && (!isOpenGL10 || extensions.contains("vertex_buffer_object "));
Также необходимо хорошо подумать над тем, как люди будут играть в вашу игру. На некоторых моделях телефонов имеется шаровой манипулятор, на других — кнопка-манипулятор, на третьих — полная клавиатура, а четвертые поддерживают технологию multitouch. А ряд моделей не располагает ничем из вышеупомянутого. Согласно документу определения совместимости (Compatibility Definition Document), все устройства Android, которые выходят на Android Market, должны иметь сенсорный экран и трехкомпонентный акселерометр, но если вам достаточно простого наклона и single touch, то о вводе данных не приходится сильно беспокоиться. Если вы хотите воспользоваться различными устройствами ввода, поддерживаемыми этими телефонами (что на основании тысяч комментариев на Android Market о Replica Island очень рекомендуется), то Android API страндартным образом отрегулирует для вас события.

Кстати, один из важнейших уроков, который получаешь при разработке игр, это то, что люди хотят получить настраиваемое управление персонажем в игре. Даже если вы организовали поддержку на телефонах любой модели, найдутся пользователи, которые захотят что-то настроить под себя. Или они могут захотеть использовать стандартную клавиатуру вместо D-pad. Или же управление наклоном в какую-либо сторону вместо использования шарового манипулятора. Совет: поработайте над возможностью настройки управления как для того, чтобы поддерживались телефоны с такими конфигурациями ввода, которые вы не учитываете, так и с целью предоставления пользователям возможности найти подходящий для них способ управления персонажем.
Шаг 4: Получайте прибыль!
Все остальное зависит от вас. Но прежде, чем вы начнете, ознакомьтесь с перечисленными ниже ссылками: они могут оказаться полезны.
HeightMapProfiler. Это простой инструмент 3D-тестирования. Именно отсюда были взяты цифры, приведенные в этой статье. Его также можно использовать для проверки того, как различные состояния GL влияют на производительность устройства, с которым вы работаете (размер текстур, фильтрация текстур, фильтрация MIP-текстур и т. д.).
SpriteMethodTest. Еще один простой инструмент для тестирования, относящийся к спрайтам.Эта утилита полезна и в качестве приложения, позволяющая сформировать основу 2D-игр.
GLSurfaceView. Удобная основа для создания программ под OpenGL ES на Java. Эту программу можно использовать как в сочетании с NDK, так и только под Java.
Quake Port. Полный исходный код игры Quake для Android, предоставленный Джеком Палевичем (Jack Palevich), инженером команды разработчиков Android. Это отличный пример того, как сводить Java и родной код, как загружать текстуры на SD-карту через HTTP, и многих других интересных и полезных вещей (посмотрите менеджер текстур с распределением памяти на SD-карту).
Replica Island. Полный исходный код к этой игре, выпущенный под Apache2. Его можно использовать в качестве справочного материала при подготовке собственной игры.
Источник:http://android-developers.blogspot.com
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
