内容提要
Qt 6.12 推出 QML 新元素 Canvas2D(技术预览),基于 Qt Canvas Painter 通过 QRhi 在 GPU 上渲染,性能远超 CPU 版 Qt Quick Canvas,实测快 40 倍以上。它兼容 W3C Canvas 2D API,网页 canvas 代码大多可直接运行,并新增 Path2D 路径缓存、盒渐变、盒阴影、网格图案、颜色效果、可调抗锯齿等特性,与 C++ API 语义一致,便于移植。
延伸解读
技术预览阶段的注意事项
Canvas2D 在 Qt 6.12 中仍为技术预览,API 可能变更,且不保证源码或二进制兼容性。这意味着在生产环境中使用需谨慎,建议关注后续版本更新,并积极通过 Qt 错误跟踪器或论坛反馈使用体验,以影响最终 API 设计。
与 HTML Canvas 的兼容性取舍
Canvas2D 实现了 W3C Canvas 2D API 的大部分功能,网页 canvas 代码通常可直接运行,但为保持 GPU 性能,省略了路径裁剪、虚线、路径测试、文本描边、滤镜、多种合成模式及内置阴影等特性。若项目依赖这些功能,需评估替代方案或继续使用 Qt Quick Canvas。
性能优势与适用场景
基于 Qt Canvas Painter 和 QRhi,Canvas2D 在 GPU 上渲染,实测比 CPU 版 Qt Quick Canvas 快 40 倍以上。它适合动画、自定义可视化、仪表盘、图表等动态内容,且每帧自动重绘,无需手动 clearRect。但若画布内容静态或依赖缺失特性,Quick Canvas 仍是可行选择。
从 Qt Quick Canvas 迁移的简易性
迁移到 Canvas2D 通常只需导入 QtCanvas2D 模块并将 Canvas 重命名为 Canvas2D,大部分代码无需修改。但需注意行为差异:Canvas2D 每帧从头重绘,且不支持 setLineDash 等特性。建议使用 Canvas 2D Tester 示例验证兼容性和性能。
Q&A
Canvas2D 是什么?它和 Qt Quick Canvas 有什么主要区别?
Canvas2D 是 Qt 6.12 引入的 QML 元素,基于 Qt Canvas Painter 在 GPU 上通过 QRhi 渲染,性能远超 CPU 版 Qt Quick Canvas。它兼容 W3C Canvas 2D API,并新增 Path2D 路径缓存、盒渐变、盒阴影、网格图案、颜色效果、可调抗锯齿等特性。
Canvas2D 的性能比 Qt Quick Canvas 快多少?
根据 QCPainterBench 基准测试,在相同 JavaScript 代码下,Canvas2D 达到 165 FPS,而 Qt Quick Canvas 只有 4 FPS,Canvas2D 快 40 倍以上。
如何将现有的 Qt Quick Canvas 代码迁移到 Canvas2D?
迁移很简单:导入 QtCanvas2D 模块,并将 Canvas 元素重命名为 Canvas2D 即可。例如,将 `Canvas { ... }` 改为 `Canvas2D { ... }`,并添加 `import QtCanvas2D`。
Canvas2D 支持哪些 HTML Canvas 没有的新特性?
Canvas2D 新增了 Path2D 路径缓存、可调抗锯齿、盒渐变、盒阴影、网格图案、颜色效果(亮度、对比度、饱和度)、孔洞子路径、文本换行、额外形状(圆、椭圆等)以及 Transform2d 矩阵对象。
Canvas2D 与 QCanvasPainter C++ API 之间如何移植代码?
两者 API 语义一致,方法名和参数顺序匹配。C++ 使用 setter 方法和 Qt 值类型,QML 使用属性和 JavaScript 参数。移植时只需将 setter 改为属性赋值,将 QCanvasPath 改为 path2d,将 QRectF 参数改为 x, y, width, height 等。
Canvas2D 目前缺少哪些 HTML Canvas 功能?
Canvas2D 目前不支持:路径裁剪(仅支持矩形裁剪)、虚线描边、路径测试(isPointInPath/isPointInStroke)、文本描边、SVG 滤镜、多种合成模式(仅支持 source-over、source-atop、destination-out)以及内置阴影属性(用盒阴影和抗锯齿替代)。