【问题标题】:Will Qt be a good choice for a game? [closed]Qt 会是一个不错的游戏选择吗? [关闭]
【发布时间】:2011-06-21 18:30:40
【问题描述】:

我想做一个 2D 塔防游戏。我目前有一个使用 XNA 制作的 C# 版本,但我认为学习 Qt 以及在其他平台上运行我的游戏可能会很有趣。图形并不太密集(只有 2d 精灵),但底层计算可能会变得相当密集,尤其是当屏幕上同时有很多敌人和塔时。

我有点好奇 Qt 是否能很好地担任这个角色。有没有人有关于在游戏开发中使用 Qt 的经验或建议?

【问题讨论】:

  • “基础计算”可能与 Qt 无关,而且很可能没有您想象的那么重。您是否分析过您的逻辑以查看它需要多少 CPU 时间?
  • 好奇,你有没有制作过基于 Qt 的游戏?
  • 我做到了,玩了一段时间,玩得很开心:)

标签: qt


【解决方案1】:

我是 Qt 的忠实粉丝,而且我认为在其中编程很有趣。不过,它的重点主要是 UI,而不是图形。它确实有图像绘画支持,甚至动画支持,但我不确定它们是否适合游戏 - 我似乎记得我在弄乱它们时出现的闪烁问题,尽管那是几年前......

如果你真的想用 Qt 做图形,那么真正合法的方法就是用 OpenGL。 Qt 通过QtOpenGL 拥有出色的 OpenGL 支持(只是 QGLWidget 的子类,而您已经了解了大部分情况),但您需要了解 OpenGL——而且 OpenGL 没有最用户友好的 API,没有siree...

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

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

对于这两个方面的初学者,我想我建议从 SDL 开始 - 它更容易上手。最终,我会说转向 Qt + OpenGL,因为它们比 SDL 对应物更强大,但尝试同时掌握两者确实是一个陡峭的学习曲线。您将从 SDL 获得一些技巧和窍门,这会让您在前进的道路上保持良好的心态。

【讨论】:

  • Qt 有很多辅助函数用于绘制形状、文本、图像等。您甚至可以将 qt 窗口和小部件嵌入到 OpenGL 中。
【解决方案2】:

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

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

当然,去吧,Qt 对于任何开发来说都是非常好的平台。

【讨论】:

  • 实际上 Qt 有大量的 OpenGL 集成,所以选择 DX 而不是 OGL 有点令人惊讶。
  • @Tuukka Lindroos 您的参考资料在哪里?
  • 不幸的是,这些参考文献都丢失了,因为答案是六年前的。如果我没记错的话,他们在发布时的网页中对此进行了描述。
【解决方案3】:

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

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

【讨论】:

  • 这对我来说就像是一种方式。从那以后一直在Qt,以前认为我应该直接跳到Unity,但现在看来我可以在Qt中使用我的专长了。谢谢大佬!
  • 在您跳转到 Felgo (V-Play) 之前,请考虑该项目是否仍处于活动状态。他们的 Slack 频道显示被遗弃的聊天记录(几个月内没有回复问题),他们的“社区论坛”似乎缺乏社区——没有/很少有用户回答问题。 2 位 Felgo 项目所有者之一对上述答案做出了贡献,请自行检查。我们正在直接试验 Qt+Box2D,这具有相当大的潜力,并且支持这两个部分的大量用户。
【解决方案4】:

我相信它可以。我正在使用纯 Qt 开发自己的 2D 游戏引擎 SDXM,Saelee Deus Ex Machine。我没有任何实质性内容可供任何人下载来支持我的声明,但我正在进行测试。

以下是我记录的一些实际测试:

3000 个非用户控制的 + 1 个用户控制的精灵 http://youtu.be/AHdhg3Nw88w

具有真实 3D QTransform 的 F-Zero 类型游戏 http://youtu.be/KuTBzhBqU4Y

*使用 Phonon 实现了音频演示

因此,为 SNES 创建类似游戏的东西是完全可能的。

【讨论】:

    【解决方案5】:

    我花了十多年的时间为各种大小不同的引擎开发各种基于 C++ 的 2D 和 3D 游戏,我也曾在 Qt5 上进行过短暂但相当激烈的运行(1.5 年在写作时间)。到目前为止,Qt 以其所有整齐堆叠的跨平台和性能特性让我大吃一惊,所以我计划尽快将我最大的游戏项目移植到 Qt。

    说实话,我自己对为什么 Qt 在游戏中没有更流行感到有些困惑。我认为主要原因是它相当曲折的授权历史以及它只是没有被推向市场以用于游戏的事实。毕竟,Qt 主要是为了在嵌入式和更高版本的许多平台上的跨平台 UI + 实时图形方面表现出色。现在 Qt 已经成为它自己的公司,并且有了新的 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 更正确。请参阅 S.O.本节更改的历史记录。

    Qt 传统上与 OpenGL 有着非常紧密的联系,这种联系为 Qt 提供了很好的服务,因为 OpenGL 在各种平台上都具有可移植性和高性能。然而,随着人们意识到 OpenGL 已经过时,微软平台上与 DirectX 的可比性问题一直存在,以及 Vulkan 等新技术的出现在不久的将来潜伏,Qt 公司采取了明智的战略举措,开始@ 987654324@ 面向图形硬件。因此,目前 Qt 绑定到 OpenGL,但很快它将支持许多其他图形抽象,这对作为游戏开发人员的您大有裨益。

    在我们等待的同时,Qt 中也没有什么可以阻止您在 Microsoft 平台上将 DX 与 Qt 一起使用。 Qt 竭尽全力不干扰任何平台上的其他库,因此它可以与许多其他工具包和引擎一起使用,您甚至可以通过直接公开 Qt 的 OpenGL 上下文将基于 OpenGL 的游戏引擎嵌入到 Qt 中。此外,如果没有 DX,使用 Qt 移植到两个值得注意的移动平台的游戏保持相同的代码库会简单得多。

    但是,除了用于管理 OpenGL 特定功能(如 VBO、FBO、加载纹理和着色器等)的所有便利类之外,Qt 中确实没有成熟的 3D 引擎。

    2016-01-29 更新: 自从我第一次写这个答案以来,我注意到在 Qt 中提供一个成熟的 3D 引擎已经付出了巨大的努力。它被称为 Qt3D 2.0,是对旧 Qt3D 的完全重写,旧 Qt3D 是 Qt4.x 的一部分,在由于政治原因(诺基亚放弃 Qt)被删除之前,它只是一个版本的一部分。

    它具有一组令人印象深刻的功能,并且它的 API 中融入了许多优秀的思想,以确保它能够充分利用现代图形硬件的全部潜力,同时保持灵活性和高性能。另一个好消息是技术预览。这意味着你今天就可以试用它,它很快就会成为主线 Qt 的一部分。你可以阅读更多关于它的信息here

    数学

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

    sqrt、floor、sin 等常用的 stl 数学函数也封装在平台无关层中。

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

    不支持高级数学,例如成熟的物理引擎、碰撞检测或响应。

    您可能对此感兴趣:

    https://github.com/junggon/gear

    资产管理

    Qt 有一个成熟的资源管理系统,可以将资源编译到你的二进制文件中。这是跨平台的,支持您需要的任何文件类型,特别支持常见的图像格式、svg、声音、字体、HTML、CSS。加载和使用资源非常简单,因为 Qt 的所有文件处理程序都接受指向这些资源的 URL。真棒。

    用户界面

    GUI 代码是 Qt 的强项。它有很好的工具来处理一些小型 2D 游戏的 GUI,这些工具实际上可以用作关卡编辑器。

    跨平台支持

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

    平台集成

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

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

    二维动画

    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 和“futures”的多级并发。它还具有跨平台的高性能锁定机制,例如静音、锁定、等待条件、无锁的东西、原子操作和一大堆其他我还没有机会检查的东西。

    http://doc.qt.io/qt-5/examples-threadandconcurrent.html

    当然,Qt 支持计时器,这些计时器非常适合所有这些,并具有许多便利功能,例如调整精度、触发单次触发等。

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

    输入

    来自触摸屏、鼠标和键盘的输入是使用事件架构来处理的,而 Qt 真的把它包装在一个篮子里。 Qt 最近(23/2-17)收到了experimental support for joysticks and gamepads

    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 脚本)引擎。哦,如果你需要的话,你还可以得到一个紧密嵌入的 google web-kit 端口。

    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

    国际化

    通过使用具有所有高级功能(例如文本小部件中的 RTL 支持等)的 ICU 实现开箱即用的国际化。

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

    更新/插件

    Qt 有一个插件架构。这意味着您可以将可执行文件拆分为多个位并分别更新它们,在运行时动态重新加载每个位。

    http://doc.qt.io/qt-5/plugins-howto.html

    单元测试

    Qt 内置了自己的单元测试框架。它与众不同之处在于它与 Qt 紧密集成并支持用户界面的可视化测试。您可以模拟按键和鼠标点击,检查小部件和状态等的存在。

    它还具有分析、基准测试、数据驱动测试等模式。

    这篇文章有点长,所以我不会详细说明。

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

    稳定性

    Qt 最初是在1995 发布的,因此需要很长时间才能稳定下来。它有大量的回归测试,在每个版本之前运行,并且在一堆编译器、平台和设备上进行了彻底的测试。出于某种原因,这并不是许多游戏开发者的首选。

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

    文档

    Qt 有非常好的文档,而且还在不断改进。如果你点击了我的一些链接,你就已经知道了。

    社区

    自从 Qt 出现这么长时间以来,已经形成了一个由经验丰富的用户组成的大型社区。您将找到多种语言的博客文章、wiki 和论坛,并且对您可能正在处理的任何类型的问题都有丰富的知识。这是一个列表:

    https://wiki.qt.io/Online_Communities

    结果证明这是一篇非常长的帖子,其中大部分是 Qt PRO,但我认为这是在测试平台之前判断平台所需要的。祝你的项目好运!

    【讨论】:

    • 并且通过 ICU 开箱即用的国际化也应该添加到列表中。许多游戏至少支持各种语言的书面翻译。
    • 我已经添加了:)
    • 先生。这是一个地狱般的答案。很棒的工作。
    • 为什么谢谢你。我很高兴你喜欢它:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多