p.s.
Мобильность и спрос на высокопроизводительные вычисления часто очень плотно соединяются вместе. Современные мобильные приложения выполняют много операций, интенсивных в вычислительном отношении, таких как стереоскопический и 3D-рендеринг(представление), распознание изображений и аудио, кодирование и декодирование видео, особенно порожденных новых технологий, таких как дополненная реальность. Они включают мобильные игры, программное обеспечение пользовательского 3D-интерфейса и социальное программное обеспечение, которое включает обработку медиа-потоков. В некотором смысле разработка мобильных игр вынуждает нас путешествовать во времени несколько лет назад и соответствовать ограниченным возможностям аппаратных средств, низкой полосе пропускания памяти и драгоценным ресурсам батареи, но также и заставляет нас пересмотреть канонические формы взаимодействия с пользователем. Плавный и отзывчивый пользовательский интерфейс, основанный на вводе данных сенсоров, доступе в интернет, окружающих звуковых эффектах, высококачественном тексте и графике, являются компонентами успешного мобильного приложения. Все главные мобильные операционные системы дают разработчикам программного обеспечения различные возможности разработке низко-уровнего кода, выполняющегося близко к аппаратным средствам. Компания Google предоставляет набор инструментов разработки низкоуровневого кода Android Native Development Kit(NDK), Он предназначен для упрощения переноса существующих приложений и библиотек с других платформ на платформу Android, и для использования производительности, архитектурно ниже-лежащих, аппаратных средств, предлагаемых современными мобильными устройствами. Языки программирования C и особенно C++, имеют репутацию трудных в обучении программированию и трудных в написании кода пользовательского интерфейса. Это действительно верно, но только когда кто-то пытается написать все с нуля. В этой книге мы используем языки программирования C и C++, и связываем их с широко известными сторонними библиотеками, чтобы предоставить возможность создания приложений с богатым содержанием и с современным интерфейсом, основанным на касаниях, и с доступом через API REST (Representational State Transfer) к популярным сайтам, таким как Facebook, Twitter, Flickr, Picasa, Instagram и несметное число других. Несмотря на доступность информации об использовании интернет-ресурсов в приложениях, написанных на языках Java или .NET, не очень много источников говорят об реализации этой возможности в языке программирования C++. Современные версии стандарта OpenGL требуют достаточных усилий для создания и использования последних расширений стандарта. Программирование с использованием программного OpenGL API-интерфейса обычно описывается в литературе в платформа-специфичном стиле. Вещи становятся еще более сложными в случае с мобильной версией стандарта - OpenGL ES, поскольку разработчики должны адаптировать имеющиеся шейдерные программы, чтобы позволить им выполняться на мобильных графических процессорах(graphics processing unit; GPU). Воспроизведение звука с помощью стандартных средств Android в C++ также не простое, например, должны быть сделаны многие дополнительные вещи для повторного использования имеющегося кода для настольных ПЭВМ для библиотеки OpenAL. Эта книга пытается пролить некоторый свет на эти темы и объединить много полезных рецептов, чтобы упростить мультиплатформенную дружественную разработку с Android NDK. Android - мобильная операционная система, основанная на ядре Linux и разработанная для смартфонов, таблет-компьютеров, нетбуков и других портативных устройств. Изначально разработка Android была начата корпорацией Android Inc, которая была куплена корпорацией Google в 2005 году. В ноябре 2007 года была анонсирована первая версия, однако, первый коммерчески доступный смартфон на базе Android, HTC Dream, был выпущен почти один год спустя в 2008 году. У версий Android, помимо числового обозначения, есть официальные кодовые названия — каждый основной выпуск называют в честь сладкого десерта.
....
Набор разработчика низкоуровневого кода для Android(Native Development Kit; NDK) используется для разработки мультимедийных приложений, требующих производительности, которую виртуальная машина Dalvik неспособна обеспечить, и прямого доступа к низкоуровневым системным библиотекам. NDK является также ключом для переносимости, которая в свою очередь предлагает довольно удобный процесс разработки и отладки, используя знакомые инструменты, такие как цепочки инструментов(toolchains) GCC и Clang или подобные. Типичное использование NDK определяет рамки этой книги — интеграция некоторых обычно используемых C/C++ библиотек для графики, звука, работы сети и хранения ресурсов. Первоначально, NDK был основан на библиотеке Bionic. Она является производным продуктом от C-библиотеки(libc) стандарта BSD, доработанной Google для Android. Главные цели разработки библиотеки Bionic были следующие: Лицензия: оригинальная библиотека GNU C Library(glibc) имеет GPL-лицензию, а библиотека Bionic имеет лицензию BSD. Размер: библиотека Bionic намного меньше в размере по сравнению с библиотека GNU C Library. Скорость: библиотека Bionic разработана для мобильных центральных процессоров с относительно низкими частотами. Например, у нее есть специально реализованные указатели нитей( pthreads). В библиотеке Bionic опущены многие важные особенности, имеющиеся в полных реализациях libc, такие как поддержка RTTI и обработка исключений языка C++. «Однако NDK предоставляет несколько библиотек с различными вспомогательными утилитами времени выполнения на языке C++, которые реализуют эти возможности. Это библиотеки GAbi++ runtime, STLport runtime и GNU Standard C++ Library. Помимо базовых возможностей POSIX, библиотека Bionic поддерживает Android-специфичные механизмы, такие как журналирование. NDK является очень эффективный способом повторного использования большого количества существующего кода на языках C и C++.
Вы хотите портировать ваши имеющиеся приложения на языке C/C++ на платформу Android? Вы - опытный разработчик на языке C++, который хочет перейти в современную мобильную разработку? Вы хотите увеличить производительность своего Java-приложения для Android? Вы хотите пользоваться в вашем приложении для Android знаменитыми библиотеками, написанными на языке C++? Вы хотите повысить свою производительность разработки, отлаживая ваши мобильные игры на ПЭВМ? Если вы говорите "Да" по какому-либо из этих вопросов, то эта книга для вас.
Глава 1 "Установка среды разработки" рассматривает как установить и настроить Android SDK и NDK на Microsoft Windows и разновидностях Linux Ubuntu/Debian, и как построить и запустить ваше первое приложение на устройстве на базе Android. Вы изучите, как использовать различные компиляторы и цепочки инструментов (toolchains), которые идут с Android NDK. Также рассмотрены процедуры отладки и развертывания приложения, используя adb-инструмент.
Глава 2 "Портирование общедоступных библиотек" содержит набор рецептов по портированию хорошо известных C++-проектов и API в Android NDK, таких как библиотека рендеринга шрифтов FreeType, библиотека загрузки изображений FreeImage, библиотеки libcurl и OpenSSL (включая компиляцию библиотек libssl и libcrypto), OpenAL API, аудио библиотека libmodplug, библиотека физики Box2D, Open Dynamics Engine(ODE), libogg, и libvorbis. Некоторые из них требуют изменений исходного кода, которые будут объяснены. Большинство этих библиотек позже используются в последующих главах.
Глава 3 "Работа с сетью" показывает вам, как пользоваться известной библиотекой libcurl для загрузки файлов по протоколу HTTP и как сформировать запросы и делать структурную разборку(парсить) ответов от популярных онлайн сервисов Picasa и Flickr напрямую, используя код на языке C++. Большинство приложений в наше время так или иначе использует сетевую передачу данных. Протокол HTTP является фундаментом для API всех популярных веб-сайтов, таких как Facebook, Twitter, Picasa, Flickr, SoundCloud и YouTube. Оставшаяся часть главы посвящена разработке веб-сервера. Наличие мини-веб-сервера в приложении позволяет разработчику управлять программным обеспечением удаленно мониторить его во время выполнения, без использования OS-специфичного кода. В начале главы также объяснены очередь задач для обработки фоновой загрузки и простые интелектуальные указатели(smart pointers), для обеспечения эффективного обмена данными между нитями. Эти примитивы для работы нитей используются позже в главе 4 "Организация виртуальной файловой системы" и главе 5 "Кросс-платформенные аудио-потоки".
Глава 4 "Организация виртуальной файловой системы" полностью посвящена асинхронной обработке файлов, доступу к ресурсам и сжатию ресурсов. Много программ хранят свои данные в виде набора файлов. Загрузка этих файлов, без блокирования всей программы, является важной проблемой. Руководства по интерфейсу пользователя для всех современных операционных систем предписывает разработчику приложений избегать любой задержки или "замораживания" последовательности выполняемых действий программы (известной в Android как ошибка "Application Not Responding"(ANR; "Приложение не отвечает")). Пакеты программ для Android являются просто архивными файлами с .apk-расширением, сжатыми по известному ZIP-алгоритму. Для предоставления возможности чтения файлов ресурсов приложения напрямую из .apk-файла, мы должны разархивировать .zip-формат с помощью zlib- библиотеки. Другой важной затронутой темой является понятие виртуальной файловой системы, которое позволяет нам абстрагировать, лежащие уровнем ниже OS-зависимые структуры файлов и каталогов, и делать общими(share) ресурсы между Android и PC версиями нашего приложения.
Глава 5 "Кроссплатформенные аудиопотоки" начинается с организации аудиопотока, пользующегося библиотекой OpenAL. После этого мы продолжим рассмотрение чтения файла формата RIFF WAVE и декодирования потоков OGG Vorbis. В заключение, мы изучим, как проигрывать небольшие записи музыки, используя библиотеку libmodplug. Последний Android NDK включает реализацию OpenSL ES API. Однако мы хотим разработать полностью переносимую реализацию между настольной ПЭВМ и другими мобильными платформами, чтобы предоставить бесшовные возможности отладки игр. Чтобы сделать это, мы предварительно откомпилируем реализацию OpenAL в статическую библиотеку, и затем организуем небольшую многопоточную(multithreaded) библиотеку звуковых потоков сверху библиотек libogg и libvorbis.
Глава 6 "Унификация использования OpenGL ES 3 и OpenGL 3" представляет базовый цикл рендеринга для настольного OpenGL 3 и мобильного OpenGL ES 3.0. Переустановка приложения на мобильном устройстве является продолжительной операцией, которая отрывает разработчика от быстрого тестирования функциональности и отладки. Для предоставления возможности разработки и отладки логики игры на настольной ПЭВМ, мы предоставляем технологический прием по использованию настольных GLSL-шейдеров в мобильном OpenGL ES.
Глава 7 "Кроссплатформенные интерфейс пользователя и система ввода" обучит вас, как реализовать переносимым способом обработку событий мультикасаний и распознания жестов. Мобильный телефон теперь почти синонимичен с базируемым на жестах вводом касаний. Никакое современное ориентированное на пользователя приложение не может существовать без графического интерфейса пользователя(a graphical user interface; GUI). Есть две важных проблемы при организации взаимодействия с пользователем: ввод и рендеринг текста. Для упрощения тестирования и отладки мы также покажем вам, как смоделировать ввод мультикасаний на ПЭВМ с Windows 7, оборудованном множеством устройств мыши. Так как мы стремимся к разработке интерактивных игровых приложений , то мы должны реализовать ввод данных пользователем легко узнаваемым способом. Мы покажем вам систематически, как создать UI-геймпад на экране. В глобальной мультикультурной окружающей среде очень желательно иметь рендер многоязычного текста для любого приложения. Мы покажем вам, как пользоваться библиотекой FreeType для рендеринга текста на латинице и кириллице, и текстов, выводимых слева направо. Организация многоязычного UTF-8 локализованного интерфейса будет представлена в виде подхода, базируемого на словаре.
Глава 8 "Написание игры Match-3" описывает размещение вместе всех ранее рассмотренных технологических приемов и написание простой игры Match-3, включая рендеринг с использованием OpenGL ES, обработку ввода, упаковку ресурсов и отладку на стороне настольной ПЭВМ. Игра также выполняется и отлаживается на настольной ПЭВМ с ОС Windows и может быть легко перенесена на другие мобильные платформы.
Глава 9 "Написание игры Picture Puzzle" объяснит более сложный пример, объединяя все упомянутые выше вещи. Все вышеупомянутые элементы, касаются графики и ввода, будут использовать низкоуровневые сетевые библиотеки и API для загрузки изображений с онлайнового сервиса Picasa.
Для примеров книги нужна ПЭВМ с ОС Windows. Из-за ограничений эмулятора в 3D-графике и низкоуровневом аудио, желательно иметь смартфон или таблет-компьютер на базе Android. Примечание: исходный код в этой книге базируется на движке Linderdaum Engine, на основе открытых исходников, и код является жестким прессованием некоторых подходов и методов, используемых в движке. Вы можете получить движок по адресу http://www.linderdaum.com.
Предполагается, что у вас имеются элементарные знания языков C или C++, включая манипуляцию указателями, многопоточность и базовые понятия объектно-ориентированного программирования. Читатель должен быть знаком с продвинутыми программными понятиями, такими как нити и примитивы синхронизации, и иметь некоторое базовое понимание цепочки инструментов GCC. Мы также надеемся, что читатель не боится разрабатывать без интегрированной оболочки разработчика(IDE; да, разработка без функциональности авто выполнения IDE определенно - умение), а например с набором программ: terminal/FarManager/Notepad/SublimeText. Разработка на языке Java для Android не рассматривается в этой книге. Для обучения этому вы должны будете прочитать что-то еще. Некоторое практическое знание линейной алгебры и аффинных преобразований в 3D-пространстве полезно для понимания программирования для OpenGL и распознавания жестов.
Нет.