Qt 为什么我的QML CJK文本呈现为损坏的图示符?

Qt 为什么我的QML CJK文本呈现为损坏的图示符?,qt,qml,cjk,text-rendering,glyph,Qt,Qml,Cjk,Text Rendering,Glyph,我的应用程序允许用户动态切换语言。我发现,在用户切换到中文或日文的情况下,大约有10%的用户界面文本的字形呈现不正确 此应用程序在iMX6平台上的Linux下运行。正在使用Qt 5.5.0。QML用于呈现UI。正在使用QML文本控件呈现损坏的文本 所使用的字体是常规字体。我曾尝试使用QML FunToLoad加载该文件并将其加载到C++字体数据库中(两种方法都显示了问题)。我曾经尝试过使用Noto字体(当然是非常相关的);同样的问题 在使用Roboto处理非CJK文本时,我从未见过文本呈现的损

我的应用程序允许用户动态切换语言。我发现,在用户切换到中文或日文的情况下,大约有10%的用户界面文本的字形呈现不正确

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

所使用的字体是常规字体。我曾尝试使用QML FunToLoad加载该文件并将其加载到C++字体数据库中(两种方法都显示了问题)。我曾经尝试过使用Noto字体(当然是非常相关的);同样的问题

在使用Roboto处理非CJK文本时,我从未见过文本呈现的损坏,如前所述,这在CJK/源代码SAN中更为常见

损坏很有趣,因为它看起来像是在渲染位图级别,而不是glyph定义级别(请注意,有些glyph的下半部分是正确的,但上半部分是损坏的)

腐败有时的确会进步。这让我认为glyph位图缓存内存正在被进一步覆盖(这只是一个理论,因为我不确定Qt如何进行字体渲染)。我认为这可能是QML垃圾收集做了一些奇怪的事情,但是在C++端加载字体没有什么区别。 接下来,我将尝试对QML文本控件使用“本机呈现”

以前有人见过这个吗?有人能确认Qt5.5.0下的字体管理/呈现使用了FreeType吗?有没有办法影响字体位图缓存的管理方式

谢谢

更新:使用“renderType:Text.NativeRendering”并没有消除问题(尽管损坏的表现略有不同)。而且,考虑到该模式的局限性,最终的结果通常是文本呈现不佳(软、缩放不良等)

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


更新3:通过设置QMLSCENE_DEVICE=softwarecontext,尝试切换到使用软件(非OpenGL)Qt Quick 2渲染器;glyph损坏仍在发生。

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


这意味着,虽然渲染将是正确的(因为我们使用的是第二个未损坏的缓存),但性能将略有下降,因为CPU上有一个额外的副本,glyph缓存将使用两倍的内存。渲染质量不受影响


Qt支持能够为我指明正确的方向,并限定与QML_使用GLYPHCACHE_解决方案相关的含义。

“性能将略微降低”我感觉到性能似乎有所提高,当每50毫秒呈现不同的文本时,在没有GLYPHCACHE_解决方案的情况下,它有时会暂停,因此,文本呈现的性能似乎更为一致。“呈现质量不受影响”呈现指标似乎也因此略有变化。在一个例子中,我的文本contentWidth是500,现在是502,contentHeight是40,现在是46