Как Это Сделано: Мобильный Кроссплатформенный Движок

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

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

По правде говоря, не только мобильные и не только игры.



Как это сделано: мобильный кроссплатформенный движок



Содержание

Часть 1. Мобильный кроссплатформенный движок Часть 2. Рендеринг текста UTF-8 с использованием шрифта SDF Часть 3. Рендеринг капли с прозрачностью и отражениями




Вам вообще нужен собственный двигатель?

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

Давайте посмотрим на плюсы и минусы: плюсы

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

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

  • Вы можете самостоятельно добавить поддержку новых платформ и добавить новые сторонние SDK.
  • Вы можете использовать любые удобные для вас форматы хранения данных (графика, звуки, ресурсы).

  • Вы не ограничены никакими лицензиями.

Минусы
  • Вам придется все писать самостоятельно, а также вникать во все нюансы каждой платформы.

    Этот процесс займет довольно много времени, поэтому не стоит делать это просто «для развлечения».

    Другое дело, если вы профессионально занимаетесь разработкой игр и планируете выпустить довольно много игр.

    Практика показывает, что большинство игровых студий рано или поздно создают собственный SDK.

  • Если вы занимаетесь индивидуальными проектами, то не все клиенты довольны вашими самодельными решениями.

    Ведь не исключено, что поддерживать проект придется совсем другим людям.

  • Многие популярные движки имеют встроенные визуальные 2D/3D-редакторы.

    Можно долго спорить об их удобстве, но даже этого у вас не будет на первом месте.

Конечно, каждый увидит свои плюсы и минусы.

Моя задача — предупредить.

Идти!

Из чего это сделано?

Речь идет в первую очередь о разработке мобильных игр, поэтому в основе обязательно будет лежать С++/OpenGL .

Никаких вариантов! Однако без второстепенных языков тоже не обойтись.

Давайте посмотрим, что используется на каждой платформе:

Платформа Основа обертка Графика
iOS С++ ObjectiveC или Swift OpenGL
Андроид С++ (НДК) Джава OpenGL
Windows Phone С++ С# OpenGL через оболочку или DirectX
твОС (Apple TV) С++ ObjectiveC или Swift OpenGL
ОС X С++ ObjectiveC или Swift OpenGL
Линукс С++ С++ OpenGL
Как видите, C++ и OpenGL встречаются повсюду.

В ObjectiveC/Java/C# вам останется только написать обертку для работы с системой устройств.

Код ваших проектов будет одинаковым — на C++.

На этой ноте скажем: «Прощай, мучительное портирование!»

OpenGL

Я настоятельно рекомендую использовать OpenGL 2.0 и выше.

Времена OpenGL 1.1 давно прошли, а переход с 1.x на 2.x вы будете вспоминать в кошмарах.

Однако не спешите использовать последнюю версию OpenGL, не убедившись, что все целевые платформы ее поддерживают. В большинстве случаев OpenGL 2.0 вполне достаточно, и все платформы его поддерживают.

С++

Та же ситуация применима и к C++11/14. Если вы уверены, что все компиляторы с ним дружат, отлично.

Мне достаточно C++98, так что когда добавят новую платформу - а есть планы по поддержке консолей - я буду спокоен.



IDE



Как это сделано: мобильный кроссплатформенный движок

Xcode – для iOS, OSX, tvOS. Плагины через Какао-стручки .



Как это сделано: мобильный кроссплатформенный движок

Android-студия — для Андроид. Плагины через Градл .



Как это сделано: мобильный кроссплатформенный движок

Визуальная Студия – все для Windows.

Конструкция двигателя

Прежде всего, движок и проекты должны храниться на диске аккуратно и логично.

В итоге я пришел к такой структуре:

  • Двигатель (все что связано с двигателем)
    • Классы (файлы движка .

      h, .

      cpp)

    • Модули (модули и сторонние SDK, которые нужны не во всех проектах)
      • Рекламные SDK
      • Аналитика
      • Игровой центр
      • Изображений
      • Социальные сети
      • … и т. д.
    • Платформы (классы для конкретной платформы)
      • Андроид
      • iOS
      • ОС X
      • ТВОС
      • .

        другие платформы

  • Тестовый проект
    • iOS
      • Проект.xcworkspace
      • Иконки (значки приложений, *auto — эти папки компоновщик проекта заполняет сам)
      • Запуск (картинки при запуске приложения, *auto)
      • Res (готовые ресурсы приложения, *auto)
      • Стручки
      • .

        другие файлы проекта iOS, plist, build и т. д.

    • Android, OSX, tvOS .

      папки с одинаковым значением для разных платформ и IDE. Android Studio имеет собственную структуру проекта.

    • Ресурсы
      • Иконки (значки приложений всех размеров)
      • Запуск (запусковые экраны всех размеров)
    • Ресурсы (исходные ресурсы проекта)
      • Общие (основные ресурсы для всех платформ)
      • Ланг (шрифты и локализация)
        • Fonts (папка со шрифтами SDF)
        • Lang.xls (файл с переводами)
      • Платформа (ресурсы для конкретной платформы)
        • iOS
        • Андроид
        • .

          другие платформы

      • Шейдеры
      • Звуки
        • MP3 (для треков)
        • OGG (для звуков)
      • Текстуры (ресурсы по форматам текстур)
        • АТИ
        • И Т.

          Д

        • ПВРТС
        • С3ТК
    • Источник (файлы .

      h, .

      cpp самого проекта)

    • Конфигурация (файл настроек проекта для строителя)


Разработчик проекта

Сборщик проекта отвечает за подготовку ресурсов, форматов и упаковки.

А именно:

  • Берет иконки (или даже одну иконку максимального размера 1024x1024) из Assets/Icons, делает остальные размеры (от 16x16 до 1024x1024) и копирует их в папки по платформе [Platform]/Icons
  • То же самое относится и к стартовым экранам из «Активы/Запуск».

  • Берет ресурсы приложения из следующих папок:
    • Ресурсы/Общее
    • Ресурсы/Шейдеры
    • Ресурсы/Звуки/MP3, OGG
    • Ресурсы/Текстуры/[необходимый формат текстуры]
    • Ресурсы/Платформа/[платформа]
    • Ресурсы/Язык/Шрифты
Далее сборщик конвертирует ресурсы, шифрует их, упаковывает и помещает в [Platform]/Res. Самое главное здесь — конвертация файлов по расширению.

Я использую следующие преобразования:

  • PNG И JPEG превратиться в WEBP. Общие настройки конвертации (например, минимальное качество) можно разместить в настройках проекта Project/Config, а можно указать их непосредственно в имени файла.

    Например изображение~q100.png будет сжат с качеством 100, а изображение~less.png будет сжат без потери качества.

    Пресеты также хорошо зарекомендовали себя.

    Например, чтобы изображение~p1.png Будет применен первый пресет, который перевернет изображение как зеркальное и сохранит его с качеством 90%.

  • Текстовые файлы И шейдеры (.

    txt, .

    vs, .

    ps) шифруются простым способом.

    Простая защита от любопытных.

  • Файл локализация Resources/Lang/Lang.xls анализируется по языку, шифруется и упаковывается в двоичный формат.
  • Создано на лету атласы текстур .

    Например, все картинки будут взяты из папки папку~atlas и упакованы в одну картинку + сохранится файл с координатами.

  • Звуки конвертирован в формат OGG.
  • 3D модели преобразован во внутренний формат движка.

  • Файлы с именем file.pack преобразуются из текстового в двоичный .

    Это хорошо работает для всех видов игровых конфигураций, уровней и т. д.

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

Конкретно мой сборщик написан на PHP. Возможно, это не лучший выбор, но мне было проще.

Кроме того, его потенциально можно перенести на сервер для командной работы.



Форматы

Я бы рекомендовал использовать следующие форматы: ВЕБП для картинок.

Вряд ли этот формат будет для кого-то новым.

А для тех, кто впервые о нем слышит, webp может хранить изображение без потери качества как PNG, а также с потерями – как JPEG, но с заметно лучшим качеством, меньшим весом и прозрачностью.

Еще одним преимуществом является возможность масштабирования изображений на лету при чтении файла.

Компилирует libwebp под всеми платформами без проблем.

ОГГ для звуков.

Android изначально понимает формат OGG, а на iOS/OSX/tvOS я использую библиотеку Тремор (версия Ogg Vorbis с фиксированной точкой) для декодирования звуков в WAV и передачи их в OpenAL. Попытки использовать OpenAL на Android не увенчались успехом (звуки запаздывали).



Классы и модули

Давайте подробнее рассмотрим, какие классы содержит движок и для чего нужны модули? Правило «что ставить в модуль, а что в двигательЭ» очень просто:

Как это сделано: мобильный кроссплатформенный движок

Следуя этому правилу, я распределил классы следующим образом:



Как это сделано: мобильный кроссплатформенный движок

Двигатель

  • Работа с платформой.

    Здесь происходит инициализация приложения, а также передача внешних событий (пауза, тачскрин, кнопки) в основной класс движка.

  • Основной класс.

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

  • Работаем с 2D. Вывод картинок, атласов, постэффектов.

  • Работа с 3D моделями.

    Загрузка моделей, рендеринг, управление шейдерами.

  • Стандартные элементы пользовательского интерфейса.

    Окна, кнопки, прокрутка, уведомления.

  • Текстуры.

    Загрузка и выгрузка текстур.

    Сами декодеры расположены в модулях.

  • Вывод текста, рендеринг шрифтов SDF.
  • Математика.

    Всевозможные формулы, матрицы, кватернионы и т.д.

  • Социальное.

    Отправка писем, стандартный обмен, оцените меня.

    Сами социальные сети разделены на модули.

  • Чтение/запись файлов.

  • Работа со строками UTF8.
  • Работа с сетью.

  • Музыка/звуки.





Как это сделано: мобильный кроссплатформенный движок

Модули

  • Социальное
    • Фейсбук
    • Гугл плюс
    • Твиттер
    • ВК
  • Replay Kit (запись экрана для iOS)
  • JSON/XML
  • Декодеры изображений
    • ВЕБП
    • JPEG
    • PNG
  • В приложениях (внутренние платежи)
  • Игровой центр, Сервисы Google Play
  • Crashlytics (отслеживание сбоев)
  • Филиал (глубинные ссылки)
  • Аналитика
    • Гугл Аналитика
    • Игровая аналитика
    • Шквал
  • Реклама
    • Апподеал ( УПД недобросовестная компания)
    • Чартбуст
    • волокно
    • Адколония
    • UnityAds
    • Тапджой
    • Google Реклама
    • Хейзап
    • AdToApp
В следующих статьях я более подробно расскажу о конкретных классах и модулях с примерами и полезностью.

Особое внимание хотелось бы уделить отрисовке SDF-шрифтов (Signed Distance Field) и шейдеров в игре из шапки.

Теги: #движок #мобильная разработка #iOS #Android #tvos #osx #Разработка для iOS #C++ #Разработка мобильных приложений #Разработка для Android #Разработка для MacOS

Вместе с данным постом часто просматривают: