为什么我的QML CJK文本使用损坏的字形呈现?

Mat*_*lds 6 qt glyph text-rendering cjk qml

我的应用程序允许用户即时切换语言.我发现大约有10%的时间用户切换到中文或日文,UI文本的字形呈现不正确.

此应用程序在iMX6平台上的Linux下运行.Qt 5.5.0正在使用中.QML用于呈现UI.使用QML Text控件呈现损坏的文本.

损坏的字体渲染示例

正在使用的字体是Source Hans Sans Regular.我尝试使用QML FontLoader加载它,并将它在C++端加载到应用程序字体数据库中(两种方法都表现出问题).我尝试过使用(公认的非常强烈相关的)Noto字体; 同样的问题.

在使用Roboto进行非CJK文本时,我从未见过文本呈现的损坏,如上所述,这对CJK/Source Hans Sans来说更常见.

腐败是有趣的,因为它看起来像是在渲染的位图级别,而不是字形定义级别(请注意一些字形如何使下半部分正确,但上半部分已损坏).

腐败确实有时会进展.这让我认为字形位图缓存内存正在被进一步覆盖(只是一个理论,因为我不确定Qt如何进行字体渲染).我认为可能是QML垃圾收集做了一些奇怪的事情,但在C++端加载字体没有什么区别.

接下来,我将尝试使用"本机渲染"进行QML Text控件.

谁看过这个吗?任何人都可以确认FreeType用于Qt 5.5.0下的字体管理/渲染吗?有没有办法影响字体位图缓存的管理方式?

谢谢!

更新:使用'renderType:Text.NativeRendering'并没有消除问题(虽然腐败表现略有不同).而且,鉴于该模式的局限性,最终导致文本渲染效果差(软,缩放等等 - 如文档所述).

更新2:我建立了Qt(据我所知)所有禁用的字形缓存 - shouldDrawCachedGlyphs()在我的本地构建中为我能够找到的那个调用的四个实例返回false - 但仍然遇到字形损坏.

更新3:尝试通过设置QMLSCENE_DEVICE = softwarecontext per docs切换到使用软件(非OpenGL)Qt Quick 2渲染器; 字形腐败仍然发生.

Mat*_*lds 5

在这种特殊情况下,我正在使用的平台上的 OpenGL 驱动程序中存在错误。它会影响 FBO 回读。在环境中设置 QML_USE_GLYPHCACHE_WORKAROUND=1 会强制 Qt 在 RAM 中保留一个额外的字形缓存副本(因为当添加新字形时无法从图形硬件读回它)。

这意味着虽然渲染将是正确的(因为我们使用的是未损坏的第二个缓存)性能会稍微降低,因为 CPU 上有一个额外的副本并且字形缓存将使用两倍的内存. 渲染质量不受影响。

Qt 支持能够为我指明正确的方向并限定与 QML_USE_GLYPHCACHE_WORKAROUND 相关的含义。