- 在我的应用程序中,我
QPainter
使用widget
- 由
QPainterPaths
包含要绘制的预先计算的路径制成 - 当前
widget
是 aQWidget
,而不是 aQGLWidget
,但这可能会改变。
- 由
- 我正在尝试将绘画移出屏幕并将其拆分为分块作业
- 我想将每个块绘制到 a 上
QImage
,最后将所有图像绘制到widget
QPainterPaths
已经分块,所以这不是问题- 问题是,绘图
QImages
比绘图慢 5 倍QWidget
- 我想将每个块绘制到 a 上
- 我做过的一些基准测试
- 时间值是多次运行的四舍五入平均值
- 测试块包含 100 个
QPainterPaths
,每个块有大约 150 个线性线段 QPainter::Antialiasing
使用渲染提示绘制大约 15k 条路径,QPen
使用圆帽和圆连接
- 请记住,我的来源是
QPainterPaths
(和线宽+颜色;一些绘制,一些填充)- 我不需要所有其他类型的绘图
QPainter
支持 - 可以
QPainterPaths
转换为可以在 a 上绘制的其他东西OpenGL buffer
,这将是一个很好的解决方案。 - 我不熟悉
OpenGL
离屏渲染,我知道有不同类型的 OpenGL 缓冲区,其中大多数不是用于 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
----------------------------------------------------+--------------------------
(*) These 2 lines have been added afterwards and are solutions to the problem!
如果您也可以告诉我一个非基于 OpenGL 的解决方案,那就太好了,因为我想在两个版本中编译我的应用程序:OpenGL
和non-OpenGL
version.
另外,我希望解决方案能够在非 GUI 线程中呈现。
有没有一种有效地在屏幕外绘制块的好方法?
是否有QGLWidget
(OpenGL
屏幕外缓冲区)的屏幕外计数器部分可以用作绘画设备QPainter
?