要在屏幕上绘制一些小块,我应该使用 QQuickItem 还是 QQuickPaintedItem?

To paint some small tiles on the screen, should I use QQuickItem or QQuickPaintedItem?

基本上我需要在内存中加载一个大小正好为 16K 的 4 色瓦片地图,每秒为其中的 2 个瓦片设置动画 3 次,然后将一些瓦片渲染到一个相当小的盒子中,我会假设可能有 100 像素左右的宽度和 80 像素的高度(非常粗略地来自内存)显示在 QML/Qt Quick 中,我可能会使用 scale 属性 在 QML 中将其放大

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

现在我明白 QQuickPaintedItem 更旧更慢,因为它先在 CPU 中绘制然后复制到视频卡,所以这不是最佳解决方案。最推荐的选项是 QQuickItem,它使用 OpenGL 在显卡上呈现。

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

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

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

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

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

那是困难的部分,因为有相当多的处理和 post-处理,但是我创建了一个 QQuickImageProvider,它作为一种松散的桥梁并允许为"id" 中的额外选项,例如在 id 中指定比例大小,因为 Qt Quick 没有调用 const QSize& requestedSize。这很容易做到。

注册到 QML 后,我只需放入一个 id 字符串,该 id 字符串指定了我希望引擎如何从动画帧、某些叠加层、哪个 tileset 等渲染 tileset 的所有选项...并且 id 字符串还告诉提供者我是否想要它缩放或者我是否想要整个 tileset 图像或只是一个单一的 tile id。这也超级简单有趣。

然后为了更有趣,我在 QML 中加入了一个计时器,并逐一请求动画中的所有帧并让它循环播放。在这里,我可以观看动画和 tileset 或 tiles 栩栩如生。

整个过程非常简单、容易,而且充满乐趣。唯一困难的部分是引擎,它在像素操作方面非常坚韧,但 QImage、QPaint、QPixelmap 和 QColor 承担了大部分工作,所以如果不是 Qt 的便利性,它可能会更加困难 class es.

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