Портирование любимой игры под Android

На конференции разработчиков игр (Game Developers Conference - GDC), компании Valve и Nvidia выступили с докладом, посвящённым портированию игр под Linux. Презентация с данного мероприятия на сайте Nvidia.

Наиболее интересные моменты:

  • В качестве мотивов почему следует портировать игры на Linux, упоминаются:
    • Открытость операционной системы Linux и экосистемы.
    • Довольно быстрый рост популярности Linux в качестве игровой платформы.
    • Логичный промежуточный шаг при портировании игр на мобильные платформы, где также доминируют стандарты семейства OpenGL
    • Производительность.
    • Под Linux официально доступен Steam.
    • OpenGL предоставляет доступ к возможностям оборудования, оперируя при этом сугубо возможностями оборудования, а не версиями ОС или чем-либо ещё. В частности, в Китае в данный момент все ещё очень много пользователей с ОС семейства Windows XP, которые не могут пользоваться Direct3D 10/11. Тем не менее, при использовании OpenGL будут доступны полные возможности оборудования, в том числе и в данной версии ОС. Это позволит использовать возможности современного оборудования даже указанным пользователям.
    • Публично доступные спецификации стандарта.
    • Спецификации развиваются комитетом, в котором может принять участие любая заинтересованная сторона, для этого не требуются огромные суммы денег.
    • OpenGL проще расширять, любой вендор может предложить свои расширения.
    • OpenGL очень богат по своим возможностям.
  • Для управления окнами настоятельно рекомендуют использовать SDL, относительно небольшую и кроссплатформенную библиотеку на Си. SDL берет на себя все что касается работы с окнами, независимо от ОС, в том числе и на мобильных платформах. Valve пользуется данной библиотекой при портировании своих проектов, что доказывает пригодность библиотеки для достаточно требовательных применений. Кроме того, основной разработчик libsdl в настоящее время работает в Valve.
  • Проблемы с которыми столкнулись в Valve:
    • Файловые системы в unix-подобных ОС по умолчанию чувствительны к регистру имён файлов, тогда как в Windows файловые системы по умолчанию игнорируют регистр. Для игр это, как правило, не является проблемой так как игровые ресурсы обычно поставляются в платформо-нейтральных контейнерах. Тем не менее, в процессе разработки это может быть проблемой. Наиболее простым решением является перевести имена всех ресурсов в нижний регистр.
    • Ошибочные define`ы, например предполагающие, что на Linux может быть только выделенный игровой сервер и более ничего.
    • Проблемы с локалью могут вызывать проблемы в функциях printf/scanf. Решение: установить локалью en_US.utf8, а локализацию предоставить самому приложению. Так как в некоторых случаях локаль en_US.utf8 в системе может отсутствовать, следует предусмотреть вывод предупреждения в данном случае.
    • Шрифты: рекомендуется использовать библиотеки freetype и fontconfig. Тем не менее, может потребоваться пересчёт размера шрифтов.
    • Использование RDTSC (прецизионный таймер, основанный на счётчике тактов современных CPU х86). Вместо него рекомендуется использовать вызов clock_gettime(CLOCK_MONOTONIC), не зависящий от архитектуры процессора.
    • Использование raw mouse input, когда весь ввод мыши монопольно отправляется одной программе. Это очень хорошо работает для игр, однако некоторые оконные менеджеры при этом также перенаправляют и весь клавиатурный ввод. Это, в частности, может отключить работу alt-tab или аналогичных по смыслу горячих клавиш для переключения задач, что способно вызвать неудовольствие пользователей в некоторых ситуациях.
    • Более шероховатая поддержка многомониторных конфигураций. Тем не менее, libsdl способна взять большую часть проблем на себя.
  • Инструментарий:
    • Steam Linux Runtime и SDK предоставляют разработчикам игр ABI, не зависящий от дистрибутива.
    • Компилирование и отладка:
      • gcc - для компилирования.
      • gdb - для отладки.
      • cgdb - интерфейс на основе curses
      • ldd - отслеживание зависимостей бинарного файла от библиотек (эквивалент dumpbin).
      • nm - предоставляет информацию о символах, используемых программой.
      • objdump - дизассемблер и инструмент для просмотра подробных деталей о бинарных файлах.
      • readelf - инструмент для получения подробной информации об ELF файлах (основной формат исполняемых файлов в Linux).
      • make - средство сборки проекта.
    • Анализ производительности - CPU:
      • perf - свободный профайлер под Linux, использующий performance counters современных процессоров
      • vtune - инструмент от компании Intel, также существующий и в версии под Linux.
      • Telemetry - многие коммерческие разработчики игр уже и так используют данный инструментарий.
  • Примерное соответствие OpenGL и Direct3D:
    • Direct3D 9 примерно соответствует возможностям OpenGL2. Начиная с этой версии доступны шейдеры.
    • Direct3D 10 примерно соответствует семейству OpenGL3, появилось более актуальное API. Реализованы геометрические шейдеры.
    • Direct3D 11 примерно соответствует OpenGL4. Поддержка тесселяции и произвольных вычислений на шейдерах.
  • Ключевые отличия Direct3D от OpenGL с точки зрения разработчика:
    • В OpenGL у потоков есть локальные данные, поэтому:
      • У потока может быть только один текущий контекст.
      • Контекст может являться текущим только для одного потока.
      • Вызовы в OpenGL из потока без текущего контекста согласно спецификации не должны иметь никакого эффекта.
    • OpenGL основан на Си. Объекты передаются хэндлами.
      • Многие функции вообще не требуют указания хэндла и оперируют на выбранном в данный момент объекте.
      • Как правило хэндл имеет тип GLuint.
    • OpenGL поддерживает расширения.
    • Несмотря на то что OpenGL довольно многословен и на первый взгляд требует больше вызовов, он показывает впечатляющую эффективность и производительность.
    • В OpenGL отсуствуют проблемы с потерей устройств.
  • Расширения OpenGL:
    • Есть специфичные для поставщиков расширения с префиксами NV|AMD|APPLE. Тем не менее, ряд из них был реализован сразу несколькими поставщиками. Например, NV_bindless_texture.
    • Расширения с префиксом EXT реализуются сразу многими поставщиками. Например, EXT_separate_shader_objects
    • Расширения с префиксом ARB были рассмотрены и приняты комитетом развивающим стандарт. Например, ARB_multitexture.
    • Базовые расширения (Core extensions): базовые возможности из более поздних версий стандартов OpenGL представляются как расширения относительно прошлой версии стандарта.
    • Есть зависящие от специфики платформы расширения: WGL, GLX, AGL и EGL.
  • Советы разработчикам:
    • Поиск в интернете имеет смысл делать как с префиксом GL_ или gl у соответствующего вызова так и без него.
    • Чтение спецификаций стандарта себя оправдывает многократно.
    • Если вам не нравится текущее направление развития OpenGL, присоединитесь к Khronos Group и постарайтесь оказать влияние на развитие стандарта. Лучше всего определять свое будущее самому.
    • Core vs Compatibility: Некоторые производители утверждают что использование core-профайлов будет быстрее чем compat-, однако по факту подтверждение данного тезиса обнаружить не удалось. Поэтому можно пользоваться тем, что проще и удобнее конкретному разработчику. * Наиболее полезные расширения OpenGL по мнению разработчиков: EXT_direct_state_access, EXT_swap_interval (и EXT_swap_control_tear), ARB_debug_output, ARB_texture_storage и ARB_sampler_objects. Кроме того отмечаются NVX_gpu_memory_info и GL_ATI_meminfo позволяющие получить информацию о использовании памяти GPU.
  • Самые проблематичные места в плане производительности:
    • Вызов MakeCurrent очень дорогой. Следует избегать его вызова даже 1 раз на кадр.
    • Современные драйвера как правило используют более 1 потока. Программа по факту взаимодействует с относительно тонкой прослойкой которая может распределять работу на несколько потоков. Некоторые вызовы заставляют производить полный сброс буферов и ресинхронизацию между потоками что сильно просаживает скорость операций.
    • Наиболее проблемными оказались функции glGet() и glGetError() (вместо этой функции рекомендуется использовать ARB_debug_output)

Портирование игр - это действительно нелегкая задача для разработчиков, даже если речь идет о выпуске игры на ПК, где она, собственно, и разрабатывалась. И в этой статье один из основателей студии Disparity Games Джейсон Старк (Jason Stark) расскажет, с какими трудностями сталкиваются его коллеги по цеху.

Вопросы сооснователю Disparity Games задавали журналисты сайта PC Gamer. Материал подготовлен на основе англоязычной .

Как портируют игры на ПК

Геймеры спрашивают, почему разработчики просто не могут выпустить ту версию игры, которую они делали на PC во время тестирования. А когда они делают это и выпускают забагованный билд, те же геймеры сетуют на ошибки и винят девелоперов в лени.
— Джейсон Старк, сооснователь Disparity Games

Чтобы понять всю сложность процесса, достаточно просто представить, как много компонентов имеет любой современный компьютер. Различное «железо», тысячи версий драйверов, и иногда очень трудно предугадать, как их связка поведет себя в тех или иных условиях.

Даже хорошо оптимизированные и отлаженные игры часто работают не так, как нужно, если компьютер имеет специфический набор ПО и комплектующих. В этом смысле вопрос «хорошего» или «плохого» порта - это скорее вопрос вложения денег и времени: сколько ресурсов готов потратить разработчик, чтобы обеспечить наибольшую совместимость? Впрочем, абсолютный идеал все равно недостижим.

Перенести игру на консоли тяжело, но в случае возникновения бага на одном Xbox One, ты будешь знать, что то же самое будет на всех остальных Xbox One.

Больше платформ - больше проблем

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

Каждый патч или обновление нужно тестировать на каждой платформе отдельно. И только если ни на одной не возникло проблем, выпускать это в «паблик». Ведь безобидный «фикс» на одной платформе может вызывать критический сбой на другой. Нужно учитывать кучу факторов и особенности архитектуры каждой среды.

Создание ПК-порта игры с прошлого поколения консолей тоже довольно проблемное дело. Проект, который ранее запускался в 30 fps, далеко не всегда можно быстро «завести» в 60. А игры из прошлого десятилетия нельзя по мановению руки адаптировать к 4K-разрешению, как бы просто это не казалось.

По факту многие игры создавались именно под 30 кадров в секунду, на основе этого фреймрейта писалась их логика. Например, в смена частоты на 60 fps привела к удвоению урона, так как боевая часть учитывала смену кадров.

Также многие помнят баг, из-за которого в PC-версии оружие портилось в 2 раза быстрее. Чтобы исправить эту простую, казалось бы, проблему, разработчикам из From Software потребовался год!

Когда проще сделать игру заново

Чтобы некоторые игры, приходится их переписывать буквально с нуля: изменять программный код, переделывать графические элементы. Такое произошло, например, с PC-версией . А переиздание вообще пришлось делать с заново, так как большая часть исходного кода была утеряна.

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

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

Особенности продвижения

Если на минутку забыть о технических вопросах, то выпуск игр на разных платформах все равно является очень трудным делом. Ведь если игра выходит на системе, ее нужно продавать тем, кто этой системой пользуется. Нужно искать популярных «ютуберов», налаживать связь с сообществом игроков, делать промо-материалы для каждой платформы в отдельности.

Например, в коллективе из 20 человек вопросами продвижения могут заниматься трое. Они не участвуют в разработке как таковой, только занимаются изданием, маркетингом и продажами. Для маленьких студий вопрос выхода на нескольких платформах - это серьезная головная боль: рук не хватает.

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

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

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

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

И вот наши бессмертные хиты:

Порт

Грандиозные приключения Гордона Фримена в борьбе с инопланетными захватчиками в лице «Альянса», которым на Землея управляет в своей Цитадели Сити 17 некий Уоллес Брин – главный злодей и враг гордона. Игра требует подключения геймпада, но её сюжет и графика были сохранены на 100%.

Порт


Grand Theft Auto III игра умудрилась совершить 2 переворота в игровой индустрии: внедрение трехмерной графики в играх с открытым городом и абсолютное портирование на мобильные платформы трудом компании Rockstar Games. В успех проекта верили единицы, но в честь 10-летнего юбилея в 2011 году.

Порт


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

Порт


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

Порт


Незабываемые приключения от французского автора Бенуа Сокаля оценили пользователи ПК в 2002 году. Это история начинающего юриста Кейт Уолкер, которой поручили отправиться в старинный магазин игрушек о подписать договор продажи в пользу семье Форальберг. Игра выполнена в жанре point-and-click квестов, обладает особой атмосферой угнетенности и всегда радует неожиданными поворотами в сюжете.

Порт


Детище компании Blizzard, Диабло вышло на ПК в 1996 году и соединяло сразу несколько жанровых направлений. Все события происходят в большом подземелье Тристам, в котором игроку нужно истреблять нечисть из Ада всеми с помощью мечей, топоров, магии и различных комбинаций.

Порт


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

Порт Quake на Андроид


Адский футуристический шутер от первого лица, действия которого проходят в далеком будущем на специальной космической арене, являющейся плацдармом нового увлечения человечества – война команд на смерть. В игре есть минимальный сюжет и особая динамика, которая приковывает взгляд к происходящему.

Порт


Лучший онлайн-шутер всех поколений. Это бессмертный шедевр от Valve, который по популярности и долголетию не сумел превзойти ни один другой проект. Особая физика стрельбы, динамика, международные чемпионаты, легендарные карты и комбинации клавиш на клавиатуре для покупки снаряжения – теперь Контр-Страйк 1.6 на Андроид доступен всем пользователям смартфонов и планшетов.

Порт Max Payne на Андроид


Макс Пейн – полицейский, работающий под прикрытием. Однажды его подставили на убийстве криминального авторитета, в результате чего охоту на героя начали полицейские и бандиты. Легендарный шутер от 3 лица был представлен компанией Remedy в 2001 году. Именно в этой игре впервые была задействована система Bullet Time – замедленное время.

Порт Star Wars: Knights of the Old Republic на Андроид


Это самая первая RPG во вселенной Звёздных Войн, выпущена компанией Lucas Arts в 2003 году. Разделение на классы, драматический сюжет, много героев, известные локации, легендарные джедаи со световыми мечами и продвинутая система прокачки – все это теперь на вашем устройстве.

Порт


Прямо сейчас вы находитесь у истоков становления компании BioWare – одной из самых лучших в создании ролевых игр на ПК. Их детище Врата Балдура появилось в 1998 году на ПК тесно связано с сюжетом книги «Аватары» и передает весь дух классической RPG в стиле Diablo.

Порт


Герои 3 – это невероятная пошаговая RPG-стратегия с 2D графикой и скриптовой анимацией, вышедшая на ПК в 1999 году. Именно эта часть большой серии окончательно завоевала сердца игроков невероятно атмосферой, удивительной музыкой, режимом строительства города и пошаговыми сражениями героев на своих лошадях.

Порт Alien Shooter на Андроид


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

Порт Петьки и Василия Ивановича на Андроид


Еще одно достижение российских разработчиков – Петька получило всемирное признание на момент выхода в 1998 году. Мобильная версия хита была несколько изменена и доработана, но все же сохранила первобытную атмосферу и дух классических point-n-click квестов.

Отличающейся от той среды, под которую она была изначально написана с максимальным сохранением её пользовательских свойств. В этом основное отличие понятий порт и форк - в первом случае все пользовательские свойства пакета стараются сохранить, а во втором - это базирующаяся на общей основе самостоятельная разработка с новыми полезными свойствами.

Процесс портирования также называют портированием или переносом , а результат - портом . Но в любом случае главной задачей при портировании является сохранение привычных пользователю интерфейса и приёмов работы с пакетом и его свойств. Добавление новых или удаление части имеющихся свойств при портировании программных продуктов не допускается.

Портирование - включение кода программы в работу Аппаратно-программного обеспечения.

Портируемость (переносимость, англ. portability ) обычно относится к одной из двух вещей:

Необходимость в выполнении портирования возникает обычно из-за различий в системе команд процессора , различий между способами взаимодействия операционной системы и программ (API - Application Program Interface), принципиальных различий в архитектуре вычислительных систем, либо по причине некоторых несовместимостей или даже полного отсутствия используемого языка программирования в целевом окружении.

Международные стандарты (в частности, продвигаемые ISO) значительно упрощают портирование , благодаря тому что они описывают среду исполнения программ таким образом, что различия между платформами становятся минимальными. Часто портирование программ между платформами, реализующими один и тот же стандарт (такой как POSIX .1 ) сводятся к перекомпиляции программы на новой платформе.

Существует также всё расширяющийся набор инструментов, облегчающих портирование, например, таких как GCC , предоставляющий неизменный язык программирования на различных платформах.

Некоторые языки программирования высокого уровня (Eiffel , Esterel) достигают портируемости путем трансляции исходного кода в промежуточный язык, имеющий компиляторы для многих процессоров и операционных систем.

Термин портирование часто применяется к компьютерным играм , а именно, к процессу переноса компьютерной игры с первоначальной целевой платформы (персонального компьютера или игровой приставки) на другую платформу. Ранние порты видеоигр, по сути, были результатом значительного или полного переписывания программы, но всё больше современных игр разрабатывается с использованием программного обеспечения, позволяющего генерировать код как для PC так и для одной или нескольких игровых консолей.

В зависимости от того, для чего первоначально разрабатывалось то или иное программное обеспечение , его называют родным или портированным. Родное (англ. native ) ПО разрабатывается сразу для той платформы (аппаратного обеспечения и/или операционной системы), о которой идёт речь. Портированное (англ. ported ) ПО разрабатывается для одних платформ, после чего переносится для работы на других платформах.

Примеры

См. также

Примечания

Литература

  • Andrew S. Tanenbaum (1984): Structured computer organization 10th Print. ISBN 0-13-854605-3 .
  • Brian Hook. Write portable code: an introduction to developing software for multiple platforms - No Starch Press, 2005; ISBN 1-59327-056-9

Wikimedia Foundation . 2010 .

Смотреть что такое "Портирование программного обеспечения" в других словарях:

    В программировании, под портированием понимают адаптацию некоторой программы или её части, с тем чтобы она работала в другой среде, отличающейся от той среды, под которую она была изначально написана. Процесс портирования также называют портингом … Википедия

    В программировании, под портированием понимают адаптацию некоторой программы или её части, с тем чтобы она работала в другой среде, отличающейся от той среды, под которую она была изначально написана. Процесс портирования также называют портингом … Википедия

    NetBSD Packages Collection (pkgsrc) система управления пакетами, позволяющая устанавливать, обновлять и удалять программное обеспечение посредством одной команды. После сборки программного обеспечения, управление им осуществляется с помощью… … Википедия

    Тип управление пакетами Разработчик Alistair Crooks, Hubert Feyrer и Johnny C. Lam Написана на C Операционная система Unix подобные Лицензия B … Википедия

    Высокоуровневый язык программирования язык программирования, разработанный для быстроты и удобства использования программистом. Основная черта высокоуровневых языков это абстракция, то есть введение смысловых конструкций, кратко… … Википедия

    Высокоуровневый язык программирования язык программирования, разработанный для быстроты и удобства использования программистом. Основная черта высокоуровневых языков это абстракция, то есть введение смысловых конструкций, кратко описывающих такие … Википедия

    Высокоуровневый язык программирования язык программирования, разработанный для быстроты и удобства использования программистом. Основная черта высокоуровневых языков это абстракция, то есть введение смысловых конструкций, кратко описывающих такие … Википедия

    В зависимости от того, для чего первоначально разрабатывалось то или иное программное обеспечение, его называют родным или портированным. Родное (англ. native) ПО разрабатывается сразу для той платформы (аппаратного обеспечения и/или операционной … Википедия

Создание игры процесс захватывающий и познавательный. Особенно это заметно, когда ремейк «классики» делаешь сам, руководствуясь идеями оригинала и десятками часов, потраченных на прохождение кампании. У меня не было сколь-нибудь значимого опыта разработки для Android"a, поэтому создание работающего «как надо» приложения для планшета поначалу выглядело довольно туманно, но от этого не менее притягательно. При наличии времени и возможностей, можно стряхнуть пыль со старых игр, подмазать и подклеить, добавив поддержку «больших» разрешений и окажется, что они выглядят не хуже современных продуктов, выложенных на маркете, даже с палитрой RGB565 без альфа-канала. Я предполагал, что будут подводные камни и заботливо спрятанные грабли, которые лежат тихонько во время разработки, но больно лупят по голове, стоит запустить игру на реальном железе. Чего сильно не хватало, так это отладчика, а возникающие проблемы лишь укрепили желание достичь поставленной цели. Под катом будет рассказ о том, как это все заработало.


Стоит сразу предупредить, что это возможно будет рассказ о велосипедах, я не придумал ничего такого, что не гуглится на просторах «интернетов». Также Читатель вряд ли увидит новые решения или мега технологии, но найдет опробованные инструкции по сборке приложения, использующего SDL1/2, для Android.


3. создание файла конфигурации для сборки игры через libsdl-andlroid

В папке с исходниками надо создать или скопирать ииз другого проекта файл AndroidAppSettings.cfg, ниже я привел его содержимое своего конфига
комментарии подлежат удалению, также я опустил настройки по умолчанию
# The application settings for Android libSDL port
#Название, которое будет показано пользователю
AppName=«CaesarIA»
#имя пакета
AppFullName=net.dalerank.caesaria
#внутрення версия приложения
AppVersionCode=1740
#эта версия будет показана пользователю
AppVersionName=«0.3.1740»
#здесь можно указать локальный или удаленный архив, который будет распакован после установки
AppDataDownloadUrl="!!Game data is 100 Mb|cache.zip"
#версия библиотеки, с которой собирается приложение (версия 2.0 не работает)
LibSdlVersion=1.2
#ориентация экрана
ScreenOrientation=h
#глубина цвета, поддерживается 16/24/32 - 16 самый быстрый, на глаз отличия не заметны
VideoDepthBpp=16
#этот и два следующих флага отвечают за подеключение OpenGL в приложения,
#так как я не использую GL, то и подключать их смысла нет
NeedDepthBuffer=n
NeedStencilBuffer=n
NeedGles2=n
#флаг отвечает за хранение текстур в оперативной памяти, если на ПК это не вызывало проблем, то
#на андроиде без этого флага текстуры могут не отображаться
SwVideoMode=y
#эмуляция мыши, флаг нужен для работы следующих двух флагов
AppUsesMouse=y
#обработка нескольких одновременных нажатий
AppUsesMultitouch=y
#эмуляция нажатия правой кнопки мыши, тапом вторым пальцем
AppNeedsTwoButtonMouse=y
#отображение курсора
ShowMouseCursor=n
#вообще-то здесь должно стоять yes, но при включении этого флага поле ввода не убиралось
AppNeedsTextInput=n
#разрешение чтения с накопителя
AccessSdCard=y
#если кеш подтягивается из интернета, то нужно поставить в yes
AccessInternet=n
#число встроенных виртуальных кнопок SDL, я использую свой GUI, поэтому кнопок не будет
AppTouchscreenKeyboardKeysAmount=0
#задержка заставки SDL перед стартом приложения
StartupMenuButtonTimeout=3000
#под какое abi будет собираться приложение
MultiABI=armeabi-v7a
#здесь нужно указать библиотеки. помимо sdl, которые нужны для работы приложения
CompiledLibraries=«sdl_mixer sdl_ttf lzma ogg»
#дополнительные флаги компиляции, у меня включены RTTI и исключения
AppCflags="-O2 -finline-functions -frtti -fexceptions"
#здесь указаны папки, где нужно искать исходники для сборки, помимо текущей
AppSubdirsBuild="dep dep/smk dep/aes dep/lzma dep/bzip2 dep/libpng source source/vfs source/core source/gfx source/game source/gui source/sound source/scene source/pathway source/walker source/objects source/good source/city source/events source/world source/religion"


4. настройка пути для компиляции нужного приложения

$rm project/jni/application/src
$ln -s caeasaria project/jni/application/src


5. cборка аpk

$./changeAppSettings.sh -a
$android update project -p project
$./build.sh


6. подписывание и установка приложения на андроид

Если все удачно скомпилилось, то в папке commandergenius/project/bin появится файла MainActivity--unsigned.apk, который нужно подписать и установить на устройство.

$ keytool -genkey -v -keystore rs.keystore -alias caesaria -keyalg RSA -keysize 2048 -validity 10000
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore rs.keystore ~/projects/commandergenius/project/bin/MainActivity-release-unsigned.apk caesaria
$ mv ~/projects/commandergenius/project/bin/MainActivity-release-unsigned.apk ~/projects/caesaria.apk
$ adb uninstall net.dalerank.caesaria
$ adb install ~/projects/caesaria.apk

Подводные камни
0. Определение окружения: для начала надо определиться в каком окружении будет работать Windows, Linux или Linux Android.
Решение: Проверяем наличие дефайнов ANDROID/__ANDROID__.

1. Логи: смотреть сообщения об ошибках и прочий вывод можно через abd logcat , но как оказалось стандартные средства типа stdout/printf не работают, можно конечно пользоваться выводом лога в файл и смотреть уже его, но хотелось какойто более привычной отладки.
Решение: подключаем заголовочный файл логов андроида #include , а для вывода сообщения пользуемся функцией
__android_log_print(ANDROID_LOG_DEBUG, CAESARIA_PLATFORM_NAME, "%s", str.c_str());

С привычным printf синтаксисом.

2. Использование OpenGL: если кому понадобится OpenGL, то на мобильных плафтормах обитает его близкий родственник GLES.
Решение: подключаем вместо стандартных заголовояных файлов и , есть небольшие отличия в использовани текстур и отрисовке, но в основном код(простой код, который я использовал) работает практически без изменений.

3. Обработка событий: пропадает событие SDL_MOUSEBUTTONUP при движении пальцем по экрану, это могла быть недоработка в самой библиотеке libsdl-android или я где-то его терял. Проявлялось иногда в отсутствии реакции элементов интерфейса на действия пользоватся, например после движения остановились на кнопкой, которая по идее должна перейти в состояние если над ней находится курсор мыши.
Решение: Специфично для моего приложения - при сборке под андроид было добавлено принудительное обновление состояния элементов под курсором при движении последнего.

4. Мелкий интерфейс: разрешение экрана современных мобильных устройств сопоставимо или превышает разрешение монитора, используемого 10-15 лет назад, но физические размеры заметно меньше, оттого и сам элементы пользовательского интерфейса выглядят мелко и пользоваться ими будет не всегда удобно.
Решение: Переделка интерфейса, что достаточно хлопотное занятие и не всегда удается сохранить первоначальный вид.


Один переезд равен двум пожарам (народная мудрость)
Все началось с того, что один из коммитеров прислал ссылку на ветку разработки, где успешно запустил игру с использованием относительно свежей библиотеки SDL2, а до этого использовалась версия SDL1.2 - 2008 года выпуска. Надо сказать, что я и сам рассматривал возможность перехода на новую версию, особенно после просмотра списка изменений , который сулил нормальную поддержку Mac и Android, что называется «из коробки». А тут еще и миниотпуск на работе получился, взяв кувалду побольше гайд потолще и большую чашку кофе, я начал переводить ремейк на новый «движок».
Не хочу утомлять читателя техническими подбробностями переезда, просто у самой библиотеки с приходом аппаратной поддержки изменилась идеология работы, что поначалу доставляло определенные трудности, пока я к ней не привык. Переезд растянулся на неделю вечеров и под конец представлял собой исправление оставшихся недочетов и графических артефактов. Переделки были закончены и подготовлены сборки для «больших» ОС, и опять появилась необходимость повторного чтения мануалов по сборке приложения под Андроид, потому как libsdl-android нормально адаптирован для работы с SDL1.2, а поддержка SDL2 похоже заброшена (о чем сами авторы и пишут в ридми)

Скрытый текст

The libsdl.org now has an official SDL 1.3 Android port, which is more recent and
better suited for creating new applications from scratch, this port is focused mainly
on SDL 1.2 and compiling existing applications, it"s up to you to decide which port is better.
Also this port is developed very slowly, although the same is true for an official port.

Осознал я правдивость этого текста, когда было потрачено несколько часов в попытке запустить порт в старой конфигурации через libsdl-android. Ну что ж, отрицательный опыт - тоже опыт: буду использовать доступные инструмены.

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

0. копирование примера из поставки SDL2

Потраченного времени на создание порта не жаль точно, получен определенный опыт и много положительных эмоций, когда игра взлетела. Тем, кто ещё раздумывает пробовать или нет, однозначно пробовать, не откладывайте на потом!

З.Ы. За развитием проекта всегда можно посмотреть .

Теги:

Добавить метки