- 我的应用程序使用
QPainter
在一个widget
上绘制街道地图.- 这个
widget
是由QPainterPaths
创建的,其中包含了要绘制的预计算路径 - 当前的
widget
是一个QWidget
,而不是QGLWidget
,但这可能会改变。
- 这个
- 我试图将绘画移出屏幕并分成分块作业。
- 我想将每个块绘制到
QImage
上,最后将所有图像绘制到widget
上 QPainterPaths
已经被分块了,所以这不是问题- 问题是,在
QImages
上绘制比在QWidget
上绘制慢5倍
- 我想将每个块绘制到
- 一些基准测试
- 时间值是多次运行的平均值四舍五入而来
- 测试块包含100个
QPainterPaths
,每个路径大约有150个线性线段 - 大约15k条路径使用
QPainter::Antialiasing
渲染提示进行绘制,QPen
使用圆形端点和圆形连接。
- 请记住,我的源是
QPainterPaths
(以及线宽和颜色;一些绘制,一些填充)- 我不需要
QPainter
支持的所有其他类型的绘图 - 是否可以将
QPainterPaths
转换为其他可在OpenGL buffer
上绘制的东西,这将是一个好的解决方案。 - 我不熟悉
OpenGL
离屏渲染,我知道有不同类型的OpenGL buffers
,其中大多数不是用于2D图像渲染而是用于顶点数据。
- 我不需要
Paint Device for chunk | Rendering the chunk itself | Painting chunk on QWidget
-----------------------+----------------------------+--------------------------
QImage | 2000 ms | < 10 ms
QPixmap (*) | 250 ms | < 10 ms
QGLFramebufferObj. (*) | 50 ms | < 10 ms
QPicture | 50 ms | 400 ms
-----------------------+----------------------------+--------------------------
none (directly on a QWidget in paintEvent) | 400 ms
----------------------------------------------------+--------------------------
(*) 这两行是后来添加的,是解决问题的解决方案!
如果可以的话,最好能告诉我一个非基于OpenGL的解决方案,因为我想编译出两个版本的应用程序:OpenGL
和非OpenGL
版本。
此外,我希望这个解决方案能够在非GUI线程中进行渲染。
有没有一种有效的方法可以将区块高效地绘制到屏幕之外?
是否存在与QGLWidget
(一个OpenGL
屏幕外缓冲区)对应的屏幕外版本,可以作为QPainter
的绘制设备使用?