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

9
我的应用程序允许用户随时切换语言。我发现大约有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: 尝试使用软件(非OpenGL)Qt Quick 2渲染器,通过设置QMLSCENE_DEVICE=softwarecontext 参考文档; 仍然出现了字形损坏的问题。
1个回答

6
在这种情况下,我正在使用的平台上的OpenGL驱动程序存在一个错误。它会影响到FBO读取。在环境中设置QML_USE_GLYPHCACHE_WORKAROUND=1强制Qt在RAM中保留字形缓存的额外副本(由于无法从图形硬件中读取当新字形添加时)。
这意味着虽然渲染将是正确的(因为我们正在使用第二个缓存,它不会损坏),但性能会略有降低,因为CPU上有一个额外的副本并且字形缓存将使用两倍的内存。渲染质量不受影响。
Qt支持能够指导我并确认与QML_USE_GLYPHCACHE_WORKAROUND相关的含义。

性能会稍微下降。当每50毫秒渲染不同的文本时,如果没有GLYPHCHACHE_WORKAROUND,有时会出现停滞,但使用它后,文本渲染似乎更加一致。 - SketchBookGames
渲染质量不受影响,但渲染指标似乎也略有变化。例如,我的文本内容宽度从500变为502,高度从40变为46。 - SketchBookGames

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接