8

我将开始在 Qt 中编写一个基于 2D 瓦片的游戏,并阅读有关用于显示和处理大量 2D 对象的 QGraphicsScene 和 QGraphicsView 类。

我的问题是,使用 QGraphicsScene 创建一个包含大量图块的世界是否可行?我可以一次一个地添加整个世界,还是应该尝试实施一些东西来限制该区域?我读过 QGraphicsScene 可以处理“数以千计的项目”,但是 2D 平铺地图可以很容易地变得非常非常大(200x200 平铺?不是很多,但已经有 40,000 个物体,这已经很多了)。

该地图也几乎是静态的,因此可以将其绘制为一个大像素图,但这确实会阻止您使用 QGraphicsScene 中的所有花哨的东西,例如处理鼠标单击独立项目等。最重要的是,我m 将绘制不会与瓷砖网格对齐的玩家、NPC 等。是否有一些优化东西可以使用大量静态对象和一些动态对象?

使用 QGraphicsScene 和 QGraphicsView 甚至是一个好主意,还是我应该尝试在 Qt 中寻找替代方案,或者可能是一个不同的、更面向游戏的库?

提前致谢

4

4 回答 4

9

您应该使用 QGraphicsView。

Qt 文档中的40,000 Chips是您仔细检查的最佳示例。它处理大量元素的复杂性,以多种比例绘制它们等等。

玩这个例子,你会看到如果你缩小,所有的芯片实际上组成了一张大照片,你可以选择,在任何视图中拖放多个芯片,或者你可以放大到足以看到一些文本个别芯片。理解每个部分需要时间,但这是一个非常全面的例子。

chips.cpp源代码中,它显示了它如何仍然可以通过使用“LevelOfDetail”或基于存储在样式选项中的转换的lod 变量switch 语句快速运行。

Qt Graphics View 已经过优化,可以完成您在问题中谈到的很多事情,但需要一段时间才能了解如何处理它。

如果您仍然对要使用的地图大小有疑问,我会将平铺布局存储在硬盘驱动器上,并在需要时加载您需要的布局,并将不需要的布局从场景中移除必要的。

于 2012-02-03T00:17:34.720 回答
2

QGraphicsScene 能够仅绘制视图中表示的内容,其他所有内容都位于场景索引中。您有不同的选项来配置场景和视图的操作方式以优化您的特定用途。仅仅因为您的场景索引中有 40k 个图块,并不意味着您需要绘制那么多。您实际上只有在您的视图分辨率中显示的数量。

此外,如果您的项目是静态的,则有缓存选项,那么它们只需计算一次并且可以从像素图缓存中检索。

最终,我认为它完全值得您花时间尝试一下。你应该很容易模拟一个测试,在这个测试中你用大量的瓦片填充你的场景,然后简单地尝试在视图中滚动。我觉得这不是你有多少瓷砖的问题,而是图形在实际绘制的视图中的复杂程度。

于 2012-02-02T21:17:14.027 回答
2

我正在做一个类似的项目,我正在使用一个 30x30 的持久 QGraphicsPixmapItems 网格。当地图的视图发生变化时,QGraphicsscene 会遍历当前视图中的地图数组部分,在每个图块上调用 setPixmap 以将其更改为新的图块类型。它工作得非常顺利,到目前为止我没有任何性能投诉。

于 2013-01-18T21:35:05.253 回答
2

我同意所说的。多年来我一直在做基于 QGraphicsView 的游戏(如果你在 Linux 上,如果你愿意,请询问你的 KDiamond 或 Palapeli 的包管理器),虽然当 QGraphicsView 几年前首次出现时,渲染性能一直是个问题,但这些问题现在一般都解决了。

你应该关心的是内存消耗。芯片示例可能具有您想要的磁贴数量的芯片,但这些芯片不会作为像素图保存在内存中。如果每个图块都是固定大小的 50x50 像素图像,那已经是

32bits*50px*50px*200*200 = 381,9 MiB
于 2013-01-18T21:56:32.987 回答