温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c++ - To paint some small tiles on the screen, should I use QQuickItem or QQuickPaintedItem?
c++ qml QT qtquick2 qquickitem

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

发布于 2020-04-08 12:31:03

本质上,我需要在内存中加载一个大小为16K的4色图块贴图,可能每秒对3个图块进行动画处理3次,然后将几个图块渲染到一个相当小的盒子中,我可能会说100个左右要显示在QML / Qt Quick中,像素宽度可能高达80像素(非常接近内存)(可以从内存中大致获取),我可以使用该scale属性在QML中将其放大

无论如何,我都对如何执行此操作感到茫然,但是我认为C ++对此是最好的选择,这对我来说是个好主意,经过研究后,我发现有2个主要选项QQuickItem和QQuickPaintedItem。

现在,我知道QQuickPaintedItem较旧且速度较慢,因为它先吸取CPU,然后再复制到视频卡中,所以它不是最佳解决方案。推荐的选项是QQuickItem,它可以使用OpenGL在图形卡上渲染。

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

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

预先感谢您对解决此问题的任何帮助。

查看更多

提问者
June
被浏览
924
June 2020-02-01 11:41

像往常一样,我正在寻找最适合自己需求的解决方案,并找到了它。

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

那是困难的部分,因为有大量的处理和后处理,但是通过这种方式,我创建了一个QQuickImageProvider,它充当了某种松散的桥梁,并允许在“ id”中添加其他选项,例如由于Qt Quick没有调用,因此在id中指定比例大小const QSize& requestedSize这很容易做到。

将其注册到QML后,我只需输入一个id字符串,该id字符串指定了我希望引擎如何从动画帧,某些叠加层,哪个tileet等等渲染tileset的所有选项,以及id字符串告诉提供者我是否要缩放比例,还是要整个tileet图像还是仅需要单个tile ID。这也非常容易,非常有趣。

然后,为了获得更多乐趣,我在QML中加入了一个计时器,并要求动画中的所有帧都一一对应,然后循环播放。在这里,我可以观看动画以及图块或图块栩栩如生并生动活泼。

整个过程非常简单,容易并且充满乐趣。唯一困难的部分是引擎在像素处理方面确实很坚韧,但是QImage,QPaint,QPixelmap和QColor占用了大量工作量,因此如果不是Qt的便利类的话,可能会更加困难。

我很高兴自己从未碰过任何OpenGL东西或我的原始计划,即QQuickItem或QQuickPainted Item。这个解决方案既简单又完美,适合我需要做的所有事情,