0

本质上,我需要在内存中加载一个大小正好为 16K 的 4 色 tilemap,以每秒 3 次的速度对 2 个图块进行动画处理,然后将一些图块渲染到一个相当小的盒子中,我会说可能是 100 个左右在 QML/Qt Quick 中显示像素宽和可能 80 像素高(非常粗略地来自内存),我可能会使用该scale属性在 QML 中将其放大

无论如何,我对如何做到这一点有点不知所措,但我认为 C++ 是最好的选择,这对我来说很好,在研究之后我发现有 2 个主要选项,QQuickItem 和 QQuickPaintedItem。

现在我知道 QQuickPaintedItem 更老更慢,因为它首先在 CPU 中绘制,然后复制到视频卡,所以它不是最好的解决方案。最推荐的选项是使用 OpenGL 在图形卡上呈现的 QQuickItem。

但我不需要过分的东西,我的意思是我在这里处理 ~100 x 80 像素,没有线条或形状操作,没有着色器,没有这些。这只是一堆像素,所以我想知道使用 QQuickPaintedItem 是否会更好。

但是,我不知道所有这些可能还有另一种解决方案,在这种情况下我很想听听,也许有一种更简单的方法来解决所有这些问题。

任何帮助解决这个问题都会很棒,在此先感谢。

4

1 回答 1

0

像往常一样,我正在寻找适合我需要的最简单的解决方案,并且我找到了它。

我创建了一个 TilesetEngine 类,它在 QImages 中加载图块(因为它非常简单),处理它们,然后将它们转换为 QPixmaps,在那里它们被分解成单独的图块并缓存在内存中以提高速度(微小的简单 8x8 图块的好处,没有内存占用)。该引擎允许您直接请求帧号,它将使用与请求的帧号匹配​​的动画图块渲染静态图像。

这是困难的部分,因为有相当多的处理和后处理,但是我创建了一个 QQuickImageProvider 作为一种松散的桥梁,并允许在“id”中提供额外的选项,例如由于 Qt Quick 没有调用const QSize& requestedSize. 这很容易做到。

将其注册到 QML 后,我只需放入一个 id 字符串,id 字符串指定我希望引擎如何从动画帧渲染图块集、某些叠加层、哪个图块集等的所有选项......以及 id 字符串也告诉提供者我是想要缩放它还是想要整个图块集图像或只是一个图块 id。这也很容易很有趣。

然后为了更有趣,我在 QML 中加入了一个计时器,并一一请求动画中的所有帧并让它循环播放。在这里,我可以观看动画和图块集,或者图块变得栩栩如生并具有动画效果。

整个过程非常简单、简单,而且非常有趣。唯一困难的部分是引擎,它在像素处理方面非常坚韧,但 QImage、QPaint、QPixelmap 和 QColor 完成了大部分工作,所以如果不是 Qt 的便利类,它可能会更加困难。

我很高兴我从来没有破坏过任何 OpenGL 的东西或我原来的计划,一个 QQuickItem 或 QQuickPainted Item。这个解决方案完美而简单,适合我需要做的一切,

于 2020-02-01T03:41:21.897 回答