Ответ 1
Я потратил более десяти лет на различные игры на C++, как на 2D, так и на 3D, для нескольких разных двигателей, больших и малых, и у меня также был короткий, но довольно интенсивный запуск с Qt5 (1,5 года на момент написания). Пока Qt сдул меня со всеми его аккуратно сложными кросс-платформенными и функциональными возможностями, и поэтому я планирую портировать свой крупнейший игровой проект на Qt, как только время позволит мне.
Честно говоря, я немного смутил себя тем, почему Qt не более распространен в играх. Я думаю, что основной причиной является его довольно кривая история лицензирования вместе с тем фактом, что она просто не продается для использования в играх. Qt, в конце концов, сделан главным образом для туза в кросс-платформенной графике UI + в реальном времени на многих платформах из встроенных и выше. Теперь, когда digia взяла верх и с новыми функциями QML/QtQuick, возможно, скоро появится бум Qt, кто знает? Я уверен, что больше разработчиков игр обнаружит Qt и начнет использовать его в своих проектах.
Чтобы ответить на ваш вопрос, я постараюсь сопоставить предложения Qt с потребностями разных типов игр.
Графика производительности для 2D
В традиционном Qt существуют различные абстракции для графики. Для некоторых небольших встроенных платформ он может основываться только на простой 2D-подсистеме. Но для большинства настольных платформ (Windows/MacOSX/Linux) и мобильных платформ (Android/OSX) 2D-абстракция аккуратно опирается на высокопроизводительный 3D-стек на основе OpenGL или OpenGL ES соответственно.
Это настоящая жемчужина и делает графическое программирование радостью благодаря хорошо продуманной архитектуре, которая позволяет вам выбирать, как высоко или низкоуровневое вы хотите подходить к графическому программированию.
Существует множество классов, которые позволяют вам выполнять свой рисунок, как обычно, с известными понятиями, такими как цвет, толщина линии и форма, зная, что все это будет 3D ускорено под капотом.
http://doc.qt.io/qt-5/graphicsview.html
http://doc.qt.io/qt-5/coordsys.html
Тогда появляется совершенно новая вещь "QtQuick" или "QML". Декларативный язык, который вместе с java script обеспечивает самый быстрый и самый скудный способ разыгрывать интерактивный интерфейс и игры, о которых я знаю на этой планете. После того, как мне удалось совершить полный полет клавиш фортепиано в 5 строках кода, и менее чем за 15 минут я был продан.
http://doc.qt.io/qt-5/qtquick-index.html
Графика производительности для 3D
EDITED 23/2-17, чтобы быть более правильным. См. S.O. историю изменений, которые были изменены в этом разделе.
Qt традиционно имеет очень сильную связь с OpenGL, и эта связь имеет сервер Qt очень хорошо, так как OpenGL переносима и работает на широком спектре платформ. Однако с осознанием того, что OpenGL показывает возраст, постоянно возникающий вопрос о сопоставимости с DirectX на платформах Microsoft и появление новых технологий, таких как Vulkan, скрывается в ближайшем будущем, Digia сделала мудрый стратегический шаг, начиная с предварительное превентивное обобщение уровня абстракции оборудования в сторону графического оборудования. Итак, теперь Qt привязан к OpenGL, но вскоре он будет поддерживать многие другие графические абстракции, к вашей большой выгоде в качестве разработчика игр.
Пока мы ждем, в Qt также нет ничего, что помешало бы вам использовать DX вместе с Qt на платформах Microsoft. Qt подходит для того, чтобы не мешать другим библиотекам на любой платформе, поэтому он будет работать с множеством других наборов инструментов и движков, и вы можете даже встроить движки игр на основе OpenGL внутри Qt, открыв контекст Qt OpenGL напрямую. Также сохранение такой же кодовой базы для игры, которая портирована на две примечательные мобильные платформы с Qt, будет намного проще без DX.
Но помимо всех классов удобства для управления эффектами OpenGL, такими как VBO, FBO, загрузкой текстур и шейдеров и т.д., на самом деле нет полноценного 3D-движка в любом месте Qt.
ОБНОВЛЕНИЕ 2016-01-29: С тех пор как я впервые написал этот ответ, я пришел к выводу, что прилагаются большие усилия для обеспечения полномасштабного 3D-движка в Qt. Он называется Qt3D 2.0 и является полным переписанием старого Qt3D, который был частью Qt4.x и был частью только одного релиза, прежде чем он был удален из-за политических причин (Nokia отбросила Qt).
У этого есть внушительный набор особенностей, и много хорошего мышления пошло в это API, чтобы гарантировать, что это может использовать весь потенциал современного графического оборудования, сохраняя при этом гибкость и эффективность. Еще одна хорошая новость заключается в предварительном просмотре технологий. Это означает, что вы можете опробовать его сегодня, и он скоро станет частью основной линии Qt. Вы можете прочитать об этом здесь.
Math
Как часть 3D-стека, Qt имеет полный набор математических функций, таких как матрица, вектор, кватернионы, точка, прямоугольник и т.д.
Общие функции stl math, такие как sqrt, floor, sin и т.д., также обертываются в уровень независимости от платформы.
http://doc.qt.io/qt-5/qtmath.html
Нет поддержки для продвинутой математики, такой как полномасштабный физический движок, обнаружение столкновения или ответ.
Для этого вас может заинтересовать следующее:
https://github.com/junggon/gear
Управление активами
Qt имеет полноценную систему управления ресурсами, которая компилирует ресурсы в ваш двоичный файл. Это кросс-платформа и поддерживает любой тип файла, который вам нужен, с особой поддержкой для общих форматов изображений, svg, звуков, шрифтов, HTML, CSS. И загрузка и использование ресурсов действительно просты, так как все Qt файлы handlign orutines принимают URL-адреса, указывающие на эти ресурсы. Действительно удивительный.
Пользовательские интерфейсы
Код GUI - это Qt forte. Он имеет отличные инструменты для работы с графическими интерфейсами, что для некоторых небольших 2D-игр на самом деле можно использовать в качестве редакторов уровней.
Поддержка кросс-платформы
ОБНОВЛЕНИЕ 2016-01-29:. Это часть основных значений для Qt как агностики платформы. Qt поддерживает основные настольные платформы, основные мобильные платформы и множество встроенных аппаратных средств, о которых вы никогда не слышали. Пожалуйста, ознакомьтесь с официальным списком поддерживаемых сообществом платформ (free/open source) здесь. Это позволит вам принести свою основную неизмененную базу кодов на все платформы, которые вам нравятся, что сэкономит вам много времени, денег и усилий в тот день, когда вы решите сделать "версию iOS".
Интеграция платформы
Qt завершает всю платформу интеграции кросс-платформенным способом. Это включает в себя:
- Значки запуска
- Конфигурационный файл (с должным образом абстрагируемыми особенностями платформы, такими как местоположение и формат).
- Всплывающие
- Управление буфером обмена
- Перетащите
- Полноэкранный/принудительный режим.
- Поддержка нескольких дисплеев
- Всплывающие
- Внешний вид платформы
2D-анимация
Qt имеет полную структуру для работы с государственными машинами. Вдобавок к этому существует полная структура анимационных свойств, которые могут быть использованы для создания интерактивного интерфейса в 2D (или даже 3D, если вы правильно играете в карты). В нем есть все, что вы ожидаете, как облегчение, автоматический переход состояния и множество удобных оберток и способы делать интересные вещи. Это похоже на работу с jQuery, но на С++. Для некоторых игр это все, что вам нужно.
http://doc.qt.io/qt-5/qtquick-statesanimations-animations.html
Контейнеры
Qt имеет кучу STL-подобных контейнерных классов с расширениями для размещения специфических функций Qt. Эти классы включают в себя все: от списков до карт до массивов и буферов.
http://doc.qt.io/qt-5/containers.html
Строки
Строка string Qt является моей любимой на любом языке. Он имеет свои причуды, но он дает вам массу возможностей и функций, и, как обычно, кросс-платформу вместе со всеми ее друзьями:
http://doc.qt.io/qt-5/string-processing.html
Таймеры, потоки и события
Вся структура Qt реализована вокруг асинхронной архитектуры на основе циклов событий со светлыми событиями, называемыми "сигналы".
http://doc.qt.io/qt-5/qtqml-syntax-signals.html
Qt поддерживает несколько уровней concurrency от потоков низкого уровня, через пулы управляемых потоков до современных сокращений карт и "фьючерсов". Он также имеет кросс-платформенный высокопроизводительный механизм блокировки, такой как мутации, блокировки, условия ожидания, блокировка, материал для атома и целая куча других вещей, которые у меня пока не получилось проверить.
http://doc.qt.io/qt-5/examples-threadandconcurrent.html
Конечно, Qt имеет поддержку таймеров, которые хорошо вписываются во все это с множеством удобных функций, таких как настройка точности, запуск одного кадра и т.д.
http://doc.qt.io/qt-5/timers.html
Ввод
Ввод с сенсорных экранов, мышей и клавиатур обрабатывается с использованием архитектуры событий, и Qt действительно имеет это завернутое в корзину. Qt совсем недавно (23/2-17) получил экспериментальную поддержку джойстиков и игровых приставок.
http://doc.qt.io/qt-5/eventsandfilters.html
Существует также поддержка датчиков, таких как положение, давление, компас, вращение, температура, поэтому вы также можете делать клоны без клона.
http://doc.qt.io/qt-5/qtsensors-index.html
И есть поддержка синего зуба для подключения и обмена игровыми данными по воздуху без доступа к Wi-Fi.
http://doc.qt.io/qt-5/qtbluetooth-index.html
И есть поддержка камеры для того, что вы, возможно, захотите использовать в игре.
http://doc.qt.io/qt-5/cameraoverview.html
Все кросс-платформенные.
Сценарии
Qt имеет встроенный высокопроизводительный механизм ECMA (a.k.a. java script), привязанный к его ядру. О, и вы получите плотно встроенный порт входящего в комплект google веб-кит, если вам это нужно.
http://doc.qt.io/qt-5/qtscript-index.html
Воспроизведение мультимедиа
Qt обертывает gstreamer и другие медиа-библиотеки для поддержки воспроизведения мультимедийных файлов, таких как видео и звук. Это позволяет разработчику выбирать, на каком уровне они хотят взаимодействовать со средствами массовой информации. На высоком уровне вы можете просто поместить виджет и запустить .play() на низком уровне, вы получите доступ к буферам видео и аудио для удовольствия от обработки.
http://doc.qt.io/qt-5/multimediaoverview.html
Кодирование носителей
В зависимости от активного back-end Qt также дает вам доступ к кодированию потоков в сеть/диск и т.д.
Классы полезности
С чего начать?
- MD5/SHA другие безопасные алгоритмы хеширования
- Алгоритмы сжатия/декомпрессии
- Алгоритмы шифрования/дешифрования
- Работа с файлами как с блокировкой, так и без блокировки, с отображением и т.д.
- Работа с файловой системой, например копирование, перемещение, переименование файлов
- Мониторинг изменений файлов
- HTTP-клиент
- Высокопроизводительное программирование сокетов
- Генерация синтетических пользовательских интерфейсов
- Время и дата
- Доступ к DNS
- Вход
- Сообщения об ошибках
- Обработка MIME и URL-адресов
- json parser/generator
- распознавание жеста
- Скомпилированное регулярное выражение
- Последовательный IO
- XML-парсер/генератор
- SSL
- Отменить/Повторить
Список действительно продолжается и далее... Смотрите сами:
http://doc.qt.io/qt-5/classes.html
Интернационализация
Внедрение интернационализации посредством использования ICU со всеми расширенными функциями, такими как поддержка RTL в текстовых виджетах и т.д.
http://doc.qt.io/qt-5/internationalization.html
Обновления/плагины
Qt имеет подключаемую архитектуру. Это означает, что вы можете разбить исполняемый файл на биты и обновить их отдельно, перезагружая каждый бит динамически во время выполнения.
http://doc.qt.io/qt-5/plugins-howto.html
Тестирование модулей
Qt имеет очень собственную структуру модульного тестирования, встроенную в нее. Этот пост становится длинным, поэтому я не буду вдаваться в подробности.
http://doc.qt.io/qt-5/qttest-index.html
Документация
Qt имеет действительно хорошую документацию, и она постоянно совершенствуется. Если вы нажали некоторые из моих ссылок, которые вы уже знаете.
Стабильность
Qt был впервые выпущен в 1998 году и, таким образом, долгое время стабилизировался. Он имеет огромный набор регрессионных тестов, который запускается перед каждым выпуском, и он тщательно протестирован на множестве компиляторов, платформ и устройств. По какой-то причине это не входит в число многих списков разработчиков игр.
http://en.wikipedia.org/wiki/List_of_Qt_releases
Это оказалось одним из чертовски длинного поста с большей частью Qt PRO, но я полагаю, что это то, что нужно, чтобы судить о платформе, прежде чем вы ее протестируете. Удачи вам в вашем проекте!