Главная » Программирование игр под Android » ВОЗМОЖНОСТИ И АРХИТЕКТУРА ANDROID

0

 

Android – это не просто еще один дистрибутив Linux для мобильных устройств. При разработке для Android вам, скорее всего, не придется иметь дело с сами ядром Linux. С точки зрения программиста, Android – платформа, абстрагирующая разработчика от ядра и позволяющая ему создавать код на Java. Android обладает несколькими полезными возможностями. Во-первых, это фреймворк, предлагающий большой набор API для создания различных типов приложений и, кроме того, обеспечивающий возможности повторного использования и замены компонентов, которые предлагаются платформой и сторонними приложениями. Во-вторых, наличие виртуальной машины Dalvik, отвечающей за запуск приложений на Android. Кроме того, к услугам разработчика набор графических библиотек для 2D- и 3D-приложений, поддержка мультимедиа-форматов (Ogg Vorbis, МРЗ, MPEG-4, Н.264, PNG), API для доступа к камере, GPS, компасу, акселерометру, сенсорному экрану, джойстику и клавиатуре. Имеется даже специальное API для воспроизведения фоновых звуковых эффектов, которое пригодится нам при разработке игр. Не все Android-устройства обладают всеми этими возможностями – налицо аппаратное разделение. Конечно, список возможностей Android не исчерпывается упомянутыми мной. Однако для разработки игр они будут наиболее важны.

Архитектура Android формируется из набора компонентов. Каждый компонент построен на основе элементов более низкого уровня. На рис. 1.1 представлен краткий обзор главных компонентов Android.

Рис. 1.1. Обзор архитектуры Android

 

Ядро

В нижней части рисунка вы можете увидеть, что ядро Linux предлагает основные драйверы для аппаратных компонентов системы. Кроме того, ядро отвечает за память, управление процессами, поддержку сети и т. д.

 

Среда выполнения и Dalvik

Среда выполнения Android, являющаяся надстройкой над ядром, отвечает за порождение и выполнение приложений Android. Каждая программа работает в собственном процессе со своей виртуальной машиной Dalvik.

Dalvik запускает программы в байт-кодовом формате DEX. Обычно вы превращаете обычные Java-файлы с расширением CLASS в формат DEX с помощью специальной утилиты dx, имеющейся в SDK. Формат DEX занимает намного меньше места в памяти, чем классические файлы типа CLASS, что достигается большим сжатием, разбиением на таблицы и слиянием нескольких CLASS-файлов. Виртуальная машина Dalvik взаимодействует с библиотеками ядра, предлагающими базовый функционал для Java-программ. Эти библиотеки располагают большим, но не полным набором классов, доступных через Java SE, и используют часть реализации Apache Harmony. Помимо прочего это означает, что в Java SE для Dalvik отсутствуют Swing и Abstract Window Toolkit, а также все классы из Java ME. Однако вы можете использовать (с осторожностью) сторонние библиотеки для Java SE на Dalvik.

До Android 2.2 (Froyo) весь код был интерпретируемым. В Froyo был представлен отслеживающий JIT-компилятор, способный компилировать части байт-кода в машинный код на лету. Это значительно увеличивает производительность приложений, требующих больших вычислений. JIT-компилятор может использовать возможности процессора, специально предназначенные для сложных вычислений, например для операций с плавающей точкой (Floating Point Unit, FPU).

Кроме того, в Dalvik включен собственный сборщик мусора (Garbage Collector, GC). Он работает по принципу отметить и убрать, что иногда ставит разработчиков в тупик. Однако если внимательно им пользоваться, вы сможете эффективно применять его при разработке игр. Последняя версия Android (2.3) обладает улучшенным параллельным GC, работа с которым причиняет меньше неприятностей. Мы рассмотрим проблемы пользования GC позже в этой е.

Каждое приложение, запускающееся в экземпляре виртуальной машины Dalvik, имеет в своем распоряжении от 16 до 24 Мбайт оперативной памяти. Это необходимо держать в уме, жонглируя картинками и звуковыми ресурсами.

 

Системные библиотеки

Помимо библиотек ядра, предлагающих некоторую функциональность Java SE, существует также набор родных библиотек на C/C++, создающих основу для фреймворка приложения (расположенного на уровень выше, чем библиотеки рис. 1.1). Эти системные библиотеки в большинстве своем отвечают за сложные в вычислительном смысле задачи (прорисовка графики, воспроизведение звука, доступ к базе данных), не очень подходящие для виртуальной машины Dalvik. API в них обернуты с помощью классов Java во фреймворк приложения, который мы будем использовать при написании игр. В той или иной форме нам понадобятся следующие библиотеки.

Skia Graphics Library (Skia) – этот программный визуализатор 20-графики используется для рендеринга пользовательского интерфейса приложений Android. Он будет нужен нам при написании первой 20-игры.

OpenGL for Embedded Systems (OpenGL ES) – индустриальный стандарт для аппаратной прорисовки графики. OpenGL ES 1.0 и 1.1 имеются в Java во всех версиях Android. OpenGL ES 2.0, в котором появилась поддержка шейдеров, поддерживается начиная с Android 2.2 (Froyo). Нужно заметить, что Java-реализации для OpenGL ES 2.0 неполные – в них отсутствует несколько важных методов. Кроме того, эмулятор и большинство старых устройств (занимающих, однако, значительную долю рынка) не поддерживают OpenGL ES 2.0. Мы будем иметь дело с OpenGL ES 1.0 и 1.1, чтобы добиться максимальной совместимости.

ОрепСоге – библиотека записи и воспроизведения аудио- и видеофайлов. Она поддерживает хороший набор форматов (Ogg Vorbis, МРЗ, Н.264, MPEG-4 и т. д.). Нас прежде всего будет интересовать работа со звуком, которая напрямую с Java не связана, но используется через несколько классов и сервисов.

FreeType – библиотека загрузки и обработки растровых и векторных шрифтов (в большинстве случаев формата TrueType). FreeType поддерживает стандарт Юникод, включая написание справа налево для арабских шрифтов и другие подобные случаи. Увы, это не очень согласуется с Java, не поддерживающей арабскую типографику. Как и в случае с ОрепСоге, FreeType напрямую в Java не реализован, но обернут в несколько подходящих классов.

Эти системные библиотеки удовлетворяют большой круг потребностей разработчиков игр и выполняют за них много тяжелой работы. Они – причина того, чтобы писать наши игры на старой доброй Java.

ПРИМЕЧАНИЕ

Хотя возможностей Dalvik обычно вполне хватает для наших потребностей, иногда необходимо больше производительности. Такое может произойти при имитации сложных физических процессов или множественных ЗР-вычислениях – тогда нам придется писать собственный код. В этой е данный аспект разработки не рассматривается. Существует набор открытых библиотек для Android, благодаря которым вы сможете реализовать это на Java. По адресу http://code.google.eom/p/libgdx/ можно посмотреть пример.

 

Фреймворк приложения

Фреймворк приложения связывает вместе системные библиотеки и среду выполнения, создавая таким образом пользовательскую сторону Android. Фреймворк управляет приложениями и предлагает продуманную среду, в которой они работают. Разработчики создают приложения для этого фреймворка с помощью набора программных интерфейсов на Java, охватывающих такие области, как разработка пользовательского интерфейса, фоновые службы, оповещения, управление ресурсами, доступ к периферии и т. д. Все ключевые приложения, поставляемые вместе с ОС Android (например, почтовый клиент), написаны с помощью этих API.

Приложения, будь они с интерфейсом или с фоновыми службами, могут связываться с другими приложениями. Эта связь позволяет одному приложению использовать компоненты других. Простой пример – программа, делающая фотоснимок и потом обрабатывающая его. Приложение запрашивает у системы компонент другого приложения, обеспечивающий это действие. Далее первое приложение может повторно использовать этот компонент (например, от встроенного приложения камеры или от фотогалереи). Подобный алгоритм снимает значительную часть ноши с программиста, а также позволяет настроить многообразие аспектов поведения Android.

Как разработчики игр мы будем создавать приложения с пользовательским интерфейсом в этом фреймворке. Посему нас будет интересовать архитектура приложения, его жизненный цикл, а также его взаимодействие с пользователем. Фоновые сервисы обычно играют небольшую роль в разработке игр, поэтому я не буду заострять на них внимание.

 

Источник: Mario Zechner / Марио Цехнер, «Программирование игр под Android», пер. Егор Сидорович, Евгений Зазноба, Издательство «Питер»

По теме:

  • Комментарии