2015-10-20 19 views
6

我的應用程序允許用戶隨時切換語言。我看到大約10%的用戶切換到中文或日文時,用戶界面文本的字形呈現不正確。爲什麼我的QML CJK文本使用損壞的字形進行渲染?

這個應用程序是在Linux下iMX6平臺上運行。正在使用Qt 5.5.0。 QML用於呈現UI。正在使用QML文本控件呈現損壞的文本。

Example of corrupt font rendering

在問題被使用的字體是源漢斯三世普通。我曾嘗試使用QML FontLoader加載它,並將它加載到應用程序字體數據庫的C++端(這兩種方法都表現出這個問題)。我試過使用(承認非常強相關的)Noto字體;同樣的問題。

使用時的Roboto非CJK文字,提到我從來沒見過文本呈現的腐敗,這比不CJK /來源漢斯三世更經常地工作。

腐敗很有趣,因爲它看起來像是在呈現的位圖級別,而不是字形定義級別(請注意一些字形的下半部分是正確的,但上半部分已損壞)。

腐敗有時確實進步。這導致我認爲字形位圖緩存內存被進一步覆蓋(只是一個理論,因爲我不知道Qt是如何進行字體渲染的)。我認爲這可能是QML垃圾收集做一些奇怪的事情,但在C++端加載字體並沒有什麼不同。

我會使用「原生渲染」爲QML文本嘗試下一個控件。

有沒有人見過這個?任何人都可以確認FreeType用於Qt 5.5.0下的字體管理/渲染嗎?是否有方法來影響字體位圖緩存的管理方式?

謝謝!

更新:使用'renderType:Text.NativeRendering'沒有消除這個問題(雖然腐敗表現略有不同)。而且,鑑於剛剛結束了與一般呈現混亂的文本(軟擴展性很差,等等 - as documented)該模式的侷限性。

更新2:我建的Qt用(據我所知)所有的字形緩存禁用 - shouldDrawCachedGlyphs()在我的本地構建返回false該呼叫我能找到的四個實例 - - 但仍然遇到字形腐蝕。

更新3:嘗試通過設置QMLSCENE_DEVICE = softwarecontext切換到使用軟件(非OpenGL)Qt Quick 2渲染器per docs;字形腐敗仍然發生。

+0

提供[mcve]。 – Meefte

回答

4

在這種特殊情況下,我正在使用的平臺上的OpenGL驅動程序中存在一個錯誤。它影響FBO回讀。在環境力量的Qt設置QML_USE_GLYPHCACHE_WORKAROUND = 1,以保持字形緩存在內存中的其他副本(因爲在加入新的字形無法讀取圖形硬件背面)。

這意味着雖然渲染將是正確的(因爲我們使用的第二個緩存沒有損壞),因爲CPU上存在額外的副本,字形緩存將使用性能會稍微降低兩倍的內存。渲染質量不受影響。

Qt支持能夠讓我指出正確的方向,並且限定與QML_USE_GLYPHCACHE_WORKAROUND相關的含義。

+0

「性能會稍微降低」我發現看起來性能有所提高,每隔50毫秒渲染不同的文本時,它會在沒有GLYPHCHACHE_WORKAROUND的情況下停頓,而文本渲染似乎表現得更加一致。 – SketchBookGames

+0

「渲染質量不受影響」渲染指標也因此而略有變化。在一個例子中,我的Text contentWidth是500,現在是502,contentHeight是40,現在是46 – SketchBookGames

相關問題