Подтвердить что ты не робот

Будет ли Qt хорошим выбором для игры?

Я хочу сделать 2d, игру защиты башни. В настоящее время у меня есть версия на С#, сделанная с использованием XNA, но подумал, что было бы интересно узнать Qt, а также запустить мою игру на других платформах. Графика не слишком интенсивная (всего 2d спрайтов), но базовые вычисления могут получить интенсивный процессор, особенно если на экране одновременно есть много врагов и башен.

Мне немного любопытно, сможет ли Qt заполнить эту роль или нет. Кто-нибудь имеет опыт или советы по использованию Qt в разработке игр?

4b9b3361

Ответ 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, но я полагаю, что это то, что нужно, чтобы судить о платформе, прежде чем вы ее протестируете. Удачи вам в вашем проекте!

Ответ 2

Новая большая MMORPG под названием Rift фактически выполняется с использованием Qt + DirectX. Это, по крайней мере, для меня первая крупномасштабная игра, которую я нашел, которая создана с Qt. Конечно, есть и DirectX, что не является большим сюрпризом. Жаль, потому что сам Qt будет мультиплатформенным, а DirectX - нет.

Домашняя страница Rift: http://eu.riftgame.com/en/

Итак, убедитесь, что Qt действительно очень хорошая платформа для любой разработки.

Ответ 3

V-Play (v-play.net) - это кросс-платформенный игровой движок, основанный на Qt/QML со многими полезными пользовательскими V- Играйте в игровые компоненты QML для обработки нескольких разрешений дисплея и пропорций, анимаций, частиц, физики, поиска путей и многое другое. ссылка на API. Ядро ядра написано на родном С++, в сочетании с пользовательским рендерером, игры достигают прочной производительности 60 кадров в секунду на всех устройствах.

Squaby - игра с защитой башни, созданная с помощью V-Play, и полный исходный код доступен здесь: Исходный код Squaby

Ответ 4

Я уверен, что это возможно. Я работаю над своим собственным 2D игровым движком SDXM, Saelee Deus Ex Machine, с чистым Qt. У меня нет ничего существенного для кого-либо, чтобы скачать, чтобы поддержать мои претензии, но я работаю над тестами.

Вот несколько фактических тестов, которые я записал:

3000 не управляемых пользователем + 1 управляемый пользователем спрайт http://youtu.be/AHdhg3Nw88w

Игра F-Zero с реальным 3D QTransform http://youtu.be/KuTBzhBqU4Y

* Произошла демонстрация аудио с помощью Phonon

Так что вполне возможно создать что-то вроде игр для SNES.

Ответ 5

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

Если вы действительно хотите сделать графику с Qt, действительно законным способом сделать это будет с OpenGL. Qt имеет отличную поддержку OpenGL через QtOpenGL (только подкласс QGLWidget, и вы больше всего там), но вам нужно знать OpenGL - и OpenGL не имеет самого удобного API, без сири...

С другой стороны, SDL. Он написан на C, но из-за него он используется на С++ и имеет множество других привязок. Он имеет аналогичный цикл событий для Qt ( "облегченная" версия, действительно), и намного проще в целом. Основное внимание уделяется графике на основе спрайтов, поэтому она должна быть ближе к тому, к чему вы привыкли, чем к OpenGL. И это тоже кросс-платформенный. Но это не так хорошо в пользовательском интерфейсе.

Если вам нужен супер-приятный интерфейс (кнопки, меню файлов и т.д., как и приложение для настольных компьютеров), используйте Qt. Если вы просто хотите привязать несколько клавиш к функциям и перейти прямо к графике, используйте SDL.

Для новичков в обоих, я думаю, я бы рекомендовал начать с SDL - это намного проще впрыгнуть и начать. В конце концов, я бы сказал, перейдем к Qt + OpenGL, так как они более мощные, чем их SDL-коллеги, но это была бы крутая кривая обучения, чтобы попытаться забрать оба одновременно. Вы получите несколько советов и трюков из SDL, и это сделает вас неровно на вашем пути.