如何在 Qt Widgets 中比 QPainter.drawText 更快地绘制文本?

Ale*_*ter 7 c++ performance qt text-rendering qwidget

我正在实现一个自定义文本布局引擎,我需要一个简单的文本输出函数,它的功能类似于 WinAPI 的 TabbedTextOut。也就是说,它不应该包装单词或类似的东西。

为此,QPainter 的 drawText 似乎很慢。一般来说,它不是很快,但一些 Unicode 字符(笑脸)可能导致渲染耗时长达 500 毫秒(在 Ryzen 3900x 上)!与 TabbedTextOut 相比,它可能做了很多不必要的事情,这显然会导致巨大的问题。

我不想求助于依赖平台的解决方案。我认为应该有一种方法可以大大加快速度。

我试过的:

  • 准备要在工作线程中绘制为 QImage 的文本(实际上是 thead 池)。效果很好,但快速滚动会导致缓存未命中和跳帧。而且图片缓存占用大量内存!
  • QML 的列表视图。并没有那么快,我宁愿坚持只使用小部件的解决方案。
  • 使用 QStaticText。仍然没有解决缓存未命中的问题。
  • 使用 QTextLayout。同样的事情,缓存未命中会导致打嗝。

请提示我值得进一步探索的方向。谢谢!

PS 我在 Windows 10 上使用 Qt 5.15。