Qt会不会是游戏的好选择?

sam*_*moz 41 qt

我想制作一款2d塔防游戏.我目前有一个使用XNA制作的C#版本,但认为学习Qt以及在其他平台上运行我的游戏可能会很有趣.图形不是太强烈(只有2d精灵),但基础计算可以得到相当强大的处理器,特别是如果屏幕上有很多敌人和塔一次.

如果Qt能够很好地填补这个角色,我有点好奇.有没有人在游戏开发中使用Qt的经验或建议?

Len*_*and 93

我已经花费了十多年的时间开发各种基于C++的2D和3D游戏,适用于大大小小的不同引擎.我还有一个短暂但相当激烈的Qt5(写作时间为1.5年).到目前为止,Qt已经把我所有的整齐堆叠的跨平台和性能功能让我震惊,因此我计划在时间允许的情况下将我最大的游戏项目移植到Qt.

说实话,我对Qt在游戏中不是更普遍的原因感到有点困惑.我认为主要原因在于其相当歪曲的许可历史以及它没有在游戏中销售的事实.Qt毕竟主要是针对来自嵌入式和更高版本的许多平台上的跨平台UI +实时图形的ace.现在digia接手并且使用新的QML/QtQuick功能可能会很快出现基于Qt的游戏,谁知道呢?我当然希望更多游戏开发者能够发现Qt并开始在他们的项目中使用它.

为了回答你的问题,我将尝试将Qt的产品与不同类型游戏的需求相匹配.

2D的性能图形

在传统的Qt中,存在不同的图形抽象.对于一些较小的嵌入式平台,它只能依赖于简单的2D子系统.但对于大多数桌面平台(Windows/MacOSX/Linux)和移动平台(Android/OSX)而言,2D抽象整齐地位于基于OpenGL或OpenGL ES的高性能3D堆栈之上.

这是一个真正的宝石,并且由于经过深思熟虑的架构,您可以选择想要接近图形编程的高低级别,从而使图形编程变得更加愉悦.

有很多课程可以让你像往常一样使用众所周知的概念,如颜色,线条粗细和形状,同时知道它将在引擎盖下进行3D加速.

http://doc.qt.io/qt-5/graphicsview.html

http://doc.qt.io/qt-5/coordsys.html

然后有全新的东西"QtQuick"或"QML".一种声明性语言与java脚本一起提供了最快捷,最简单的方法来消除我在这个星球上所知道的交互式UI和游戏.在我设法用5行代码制作完整的钢琴键后,在15分钟内我被卖掉了.

http://doc.qt.io/qt-5/qtquick-index.html

3D性能图形

编辑23/2-17更正确.有关本节中的更改,请参阅SO历史记录.

Qt传统上与OpenGL有着非常强大的联系,而且这种结合服务器Qt非常好,因为OpenGL可以在各种平台上轻松移植.然而,随着人们意识到OpenGL正在展示它的时代,以及在微软平台上与DirectX的可比性以及像Vulkan在不久的将来潜伏的新技术的出现这一问题,Digia已经做出明智的战略举措,开始先于先发制人将硬件抽象层推广到图形硬件.所以现在Qt必然会受到OpenGL的限制,但很快就会支持许多其他的图形抽象,让你作为游戏开发者获得巨大的好处.

在我们等待的时候,Qt中也没有任何东西可以阻止你在微软平台上使用DX和Qt.Qt竭尽全力不干扰任何平台上的其他库,因此它可以与许多其他工具包和引擎一起使用,甚至可以通过直接暴露Qt的OpenGL上下文在Qt中嵌入基于OpenGL的游戏引擎.对于使用Qt移植到两个值得注意的移动平台的游戏,保持相同的代码库将在没有DX的情况下更加简单.

但是,除了管理OpenGL特殊功能(如VBO,FBO,加载纹理和着色器等)的所有便利类之外,Qt中的任何地方都没有完整的3D引擎.

更新2016-01-29:自从我第一次写这个答案以来,我开始注意到在Qt中提供了一个完整的3D引擎.它被称为Qt3D 2.0,它完全重写了旧的Qt3D,它是Qt4.x的一部分,并且由于政治原因(诺基亚放弃了Qt)之前只有一个版本被删除.

它具有一系列令人印象深刻的功能,并且已经有很多好的思想,它确保它可以充分发挥现代图形硬件的潜力,同时保持灵活性和高性能.另一个好消息是技术预览.这意味着你今天可以尝试一下,它将很快成为主线Qt的一部分.你可以在这里阅读更多相关信息.

数学

作为3D堆栈的一部分,Qt有一整套性能数学例程,如矩阵,向量,四元数,点,矩形等.

常见的stl数学函数(如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的强项.它有很好的GUI工具,对于一些小型的2D游戏来说,它们实际上可以用作关卡编辑器.

跨平台支持

更新2016-01-29:这是Qt与平台无关的核心价值观的一部分.Qt支持主要的桌面平台,主要的移动平台和一堆你从未听说过的嵌入式硬件.请在此处查看社区支持(免费/开源)平台的官方列表.它允许您将大部分未更改的代码库带到您喜欢的所有平台,从而在您决定制作"iOS版本"的那一天节省大量的时间,金钱和精力.

平台集成

Qt以跨平台的方式包装了所有平台集成.这包括:

  • 启动器图标
  • 配置文件(具有适当抽象的平台细节,如位置和格式)
  • 弹出窗口
  • 剪贴板管理
  • 拖放
  • 全屏/静止模式切换.
  • 多显示器支持
  • 提示
  • 平台外观

2D动画

Qt具有使用状态机的完整框架.除此之外,还有一个完整的动画属性框架,可用于在2D中制作交互式UI(如果您正确地演奏卡片,甚至可以使用3D).它具有您期望的所有内容,如缓和,自动状态转换以及大量便利包装和执行内容的方式.这就像使用jQuery但在C++中.对于某些游戏,这就是您所需要的.

http://doc.qt.io/qt-5/qtquick-statesanimations-animations.html

集装箱

Qt有一堆类似STL的容器类,它们具有扩展以适应Qt特定的功能.这些类包括从列表到映射到数组和缓冲区的所有内容.

http://doc.qt.io/qt-5/containers.html

字符串

Qt的字符串类是我喜欢的任何语言.它有它的怪癖,但它为您提供了大量的性能和功能,并像往常一样与其所有朋友一起跨平台:

http://doc.qt.io/qt-5/string-processing.html

计时器,线程和事件

整个Qt框架是围绕基于事件循环的异步架构实现的,其中轻量级事件称为"信号".

http://doc.qt.io/qt-5/qtqml-syntax-signals.html

Qt支持从低级线程到托管线程池到现代map-reduce和"future"的多级并发.它还具有跨平台的高性能锁定机制,如静音,锁定,等待条件,无锁定的东西,原子操作以及其他一些我没有机会查看的东西.

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

并且支持蓝牙用于通过无线连接和共享游戏数据而无需访问wifi.

http://doc.qt.io/qt-5/qtbluetooth-index.html

并且有摄像头支持你可能想要在游戏中使用它的任何东西.

http://doc.qt.io/qt-5/cameraoverview.html

所有跨平台.

脚本

Qt有一个嵌入其核心的嵌入式高性能ECMA(又名java脚本)引擎.哦,如果你需要的话,你还可以获得一个紧密嵌入的谷歌网络套件端口.

http://doc.qt.io/qt-5/qtscript-index.html

媒体播放

Qt包装了gstreamer和其他媒体库,以支持播放视频和声音等媒体.它允许开发人员选择他们想要与媒体交互的级别.在高级别上,您可以放置​​一个小部件并在低级别运行.play(),您可以访问视频和音频缓冲区,以获得处理乐趣.

http://doc.qt.io/qt-5/multimediaoverview.html

媒体编码

根据活动的后端Qt,您还可以访问将流编码到网络/磁盘等.

实用课程

我从哪里开始?

  • MD5/SHA其他安全散列算法
  • 压缩/解压缩算法
  • 加密/解密算法
  • 文件处理阻塞,非阻塞,映射等.
  • 文件系统处理,如复制,移动,重命名文件
  • 文件更改监控
  • HTTP客户端
  • 高性能套接字编程
  • 合成UI事件生成
  • 时间和日期
  • DNS访问
  • 记录
  • 错误消息
  • MIME和URL处理
  • json解析器/生成器
  • 手势识别
  • 编译正则表达式
  • 串行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于1995年首次发布,因此需要很长时间才能稳定下来.它有一套大量的回归测试,在每次发布之前运行,并在一堆编译器,平台和设备上进行全面测试.出于某种原因,这不是许多游戏开发者列表中的首要问题.

http://en.wikipedia.org/wiki/List_of_Qt_releases

事实证明这是一个很长的帖子,主要是Qt PROs,但我认为这是在测试之前判断平台所需要的.祝你的项目好运!

  • 先生。这是一个答案的地狱。了不起的工作。 (3认同)
  • 通过 ICU 开箱即用的国际化也应该添加到列表中。许多游戏至少支持各种语言的书面翻译。 (2认同)

Tuu*_*oos 8

名为Rift的新Big MMORPG实际上是通过使用Qt + DirectX完成的.这至少对我来说是我发现的第一个用Qt创建的大型游戏.当然还有DirectX背后,不是什么大惊喜.太糟糕了,因为Qt本身就是多平台而DirectX则不是.

Rift主页:http: //eu.riftgame.com/en/

所以肯定去吧,Qt对于任何开发来说都是非常好的平台.

  • 实际上Qt有大量的OpenGL集成,所以选择DX而不是OGL有点令人惊讶. (3认同)

小智 8

Felgo(felgo.com)是一款基于Qt/QML的跨平台游戏引擎,具有许多有用的定制Felgo QML游戏组件,用于处理多种显示分辨率和宽高比,动画,粒子,物理,寻路等.API参考.引擎核心是用原生C++编写的,与自定义渲染器相结合,游戏在所有设备上都能达到60fps的稳定性能.

Squaby是一款使用Felgo制作的塔防游戏,其完整源代码可在此处获得:Squaby源代码


Xav*_*olt -2

我是 Qt 的忠实粉丝,我认为使用它进行编程非常有趣。不过,它的重点主要在于 UI,而不是图形。它确实有图像绘制支持,甚至动画支持,但我不确定这些是否适合游戏 - 我似乎记得当我弄乱它们时出现闪烁问题,尽管那是几年前的事了......

如果您确实想使用 Qt 进行图形处理,那么真正合法的方法是使用 OpenGL。Qt 通过QtOpenGL提供了出色的 OpenGL 支持(只是 QGLWidget 的子类,您已经完成了大部分工作),但是您需要了解 OpenGL - 而且 OpenGL 没有最用户友好的 API,不,先生们...

另一方面,还有SDL。它是用 C 编写的,但因此可以在 C++ 中使用,并且有许多其他绑定。它具有与 Qt 类似的事件循环(实际上是“精简版”),并且总体上要简单得多。它的重点是基于精灵的图形,因此它应该比 OpenGL 更接近您习惯的图形。而且它也是跨平台的。但它在 UI 方面却没有那么好。

如果您想要一个超级漂亮的 UI(按钮、文件菜单等,就像桌面应用程序一样),请使用 Qt。如果您只想将几个键绑定到功能并直接使用图形,请使用 SDL。

对于这两个领域的初学者,我想我建议从 SDL 开始 - 它更容易上手。最终,我会说转向 Qt + OpenGL,因为它们比 SDL 版本更强大,但尝试同时掌握这两种方法确实是一个陡峭的学习曲线。您将从 SDL 中学到一些提示和技巧,这将帮助您轻松上路。

  • Qt 有很多用于绘制形状、文本、图像等的辅助函数。您甚至可以将 qt 窗口和小部件嵌入到 OpenGL 中。 (2认同)