Портирование программного обеспечения

На конференции разработчиков игр (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)

Создание игры процесс захватывающий и познавательный. Особенно это заметно, когда ремейк «классики» делаешь сам, руководствуясь идеями оригинала и десятками часов, потраченных на прохождение кампании. У меня не было сколь-нибудь значимого опыта разработки для 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

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

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

Теги:

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

Создание игры процесс захватывающий и познавательный. Особенно это заметно, когда ремейк «классики» делаешь сам, руководствуясь идеями оригинала и десятками часов, потраченных на прохождение кампании. У меня не было сколь-нибудь значимого опыта разработки для 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

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

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

Теги:

  • caesaria
  • caesar iii remake
  • c++
  • game developement
  • android development
Добавить метки

Network Media — одна из немногих отечественных компаний, которая занимается портированием игр на заказ. Мы понимаем, что важно сохранить "то, что цепляет" в игре и деликатно провести геймплейную и функциональную адаптацию на новой платформе.

Мы работаем как с частными заказчиками, так и с издательствами.

Что Вы получите

Чему Network Media уделяет повышенное внимание при портировании игр

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

  • новые идеи: без права на вторичность

Мы понимаем, что главное - удобство игры для пользователя, однако не стоит забывать о возможностях новой платформы: оригинальность и удобство может быть достигнуто за счет новаторского подхода к графическому оформлению и/или геймплею, а также с помощью нового функционала и среды разработки

  • вовлечение: невозможно оторваться

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

  • играбельность: все для удобства геймеров

Вы получите продукт, в котором игроку будет предельно комфортно, другими словами, в игру будет удобно играть. Специально под платформу и жанр игры мы максимально адаптируем систему управления, функционал, игровой интерфейс, графику и многое другое. Чтобы понять, насколько важно юзабилити, достаточно поиграть на обычном компьютере в игру, которая изначально была выпущена, к примеру, для игровых консолей (Devil May Cry 3, Onimusha 3: Demon Siege - убитое управление на PC; Tom Clancy"s Ghost Recon: Future Soldier - неработоспособность PC клиента игры у множества игроков; Alone in the Dark - ужасная камера, которая постоянно переключалась автоматически от 1 лица на 3, и меняла систему управления, и наоборот; Dark Souls на PC - собрал в себя проблемы всех примеров: ужасная оптимизация, прыгающая камера, японское управление). Мы понимаем важность данной характеристики для успеха продукта, и, поэтому, уделим особое внимание взаимодействию платформы и игрока

  • геймплей: сбалансирован и отлажен

Мобильная игровая индустрия начала свое более стремительное развитие с того момента, когда появился первый официальный порт известной игры с ПК на смартфоны и планшеты под управлением 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 квестов.
 
Статьи по теме:
Ликёр Шеридан (Sheridans) Приготовить ликер шеридан
Ликер "Шериданс" известен во всем мире с 1994 года. Элитный алкоголь в оригинальной двойной бутылке произвел настоящий фурор. Двухцветный продукт, один из которых состоит из сливочного виски, а второй из кофейного, никого не оставляет равнодушным. Ликер S
Значение птицы при гадании
Петух в гадании на воске в большинстве случаев является благоприятным символом. Он свидетельствует о благополучии человека, который гадает, о гармонии и взаимопонимании в его семье и о доверительных взаимоотношениях со своей второй половинкой. Петух также
Рыба, тушенная в майонезе
Очень люблю жареную рыбку. Но хоть и получаю удовольствие от ее вкуса, все-таки есть ее только в жареном виде, как-то поднадоело. У меня возник естественный вопрос: "Как же еще можно приготовить рыбу?".В кулинарном искусстве я не сильна, поэтому за совета
Программа переселения из ветхого и аварийного жилья
Здравствуйте. Моя мама была зарегистрирована по адресу собственника жилья (сына и там зарегистрирован её внук). Они признаны разными семьями. Своего жилья она не имеет, признана малоимущей, имеет право как инвалид на дополнительную жилую площадь и...