Я подготовил для вас серию статей о разработке мобильных игр, основываясь на полученном опыте и пройденных граблях.
В первой статье речь пойдет о создании собственного кроссплатформенного движка для мобильных игр.
По правде говоря, не только мобильные и не только игры.
Содержание
Часть 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 |
В 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 самого проекта)
- Конфигурация (файл настроек проекта для строителя)
- iOS
Разработчик проекта
Сборщик проекта отвечает за подготовку ресурсов, форматов и упаковки.А именно:
- Берет иконки (или даже одну иконку максимального размера 1024x1024) из Assets/Icons, делает остальные размеры (от 16x16 до 1024x1024) и копирует их в папки по платформе [Platform]/Icons
- То же самое относится и к стартовым экранам из «Активы/Запуск».
- Берет ресурсы приложения из следующих папок:
- Ресурсы/Общее
- Ресурсы/Шейдеры
- Ресурсы/Звуки/MP3, OGG
- Ресурсы/Текстуры/[необходимый формат текстуры]
- Ресурсы/Платформа/[платформа]
- Ресурсы/Язык/Шрифты
Я использую следующие преобразования:
- 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
-
Jira Как Система Поддержки
19 Oct, 24 -
Взгляните На Lenovo Ideapad Y550 59-028174
19 Oct, 24 -
Не Нужен Глонасс?
19 Oct, 24 -
Прошивка От С6 На 5800
19 Oct, 24 -
Конференция Разработчиков Orenconf
19 Oct, 24