Meine Anwendung ermöglicht dem Benutzer, Sprachen im laufenden Betrieb zu wechseln. Ich sehe, dass etwa 10% der Zeit, die der Benutzer auf Chinesisch oder Japanisch wechselt, die Glyphen für den UI-Text falsch wiedergegeben werden.Warum wird mein QML-CJK-Text mit beschädigten Glyphen gerendert?
Diese Anwendung läuft unter Linux auf einer iMX6-Plattform. Qt 5.5.0 wird verwendet. QML wird zum Rendern der Benutzeroberfläche verwendet. Der beschädigte Text wird mit einem QML-Text-Steuerelement gerendert.
Example of corrupt font rendering
Die Schrift in Frage verwendet wird, ist Quelle Hans Sans Regular. Ich habe versucht, das mit einem QML FontLoader zu laden und es auf der C++ - Seite in die Anwendungsschriftarten-Datenbank zu laden (beide Methoden zeigten das Problem). Ich habe versucht, die (zugegebenermaßen sehr stark verwandten) Noto-Schriften zu verwenden; gleiches Problem.
Ich habe noch nie Korruption von Text-Rendering gesehen, wenn Roboto für Nicht-CJK-Text verwendet und, wie erwähnt, dies funktioniert mehr als nicht für CJK/Source Hans Sans.
Die Korruption ist interessant, weil es so aussieht, als wäre es auf der gerenderten Bitmap-Ebene, nicht auf der Glyphen-Definitionsebene (beachten Sie, dass einige Glyphen die untere Hälfte korrekt haben, aber die obere Hälfte ist korrupt).
Korruption läuft manchmal weiter. Das führt mich zu der Annahme, dass der Cache-Speicher der Glyph-Bitmap weiter überschrieben wird (nur eine Theorie, da ich nicht sicher bin, wie Qt Font-Rendering ausführt). Ich dachte, es könnte die QML-Garbage-Collection sein, die etwas Seltsames macht, aber das Laden der Schriftart auf der C++ - Seite hat keinen Unterschied gemacht.
Ich werde versuchen, 'natives Rendering' für die QML Text-Steuerelemente verwenden.
Hat jemand das schon mal gesehen? Kann jemand bestätigen, dass FreeType für Font Management/Rendering unter Qt 5.5.0 verwendet wird? Gibt es Möglichkeiten, zu beeinflussen, wie der Font-Bitmap-Cache verwaltet wird?
Danke!
Update: Verwenden von 'renderType: Text.NativeRendering' löste das Problem nicht (obwohl die Korruption etwas anders manifestiert). Und angesichts der Einschränkungen dieses Modus endete am Ende mit schlecht wiedergegebenen Text (weiche, schlechte Skalierung usw. - as documented).
Update 2: Ich baute Qt mit (soweit ich weiß) alle Glyphen-Caches deaktiviert - shouldDrawCachedGlyphs() in meinem lokalen Build für die vier Instanzen dieser Anruf false zurück finde ich konnte - - aber immer noch Glyph Korruption.
Update 3: Versuchte Schalt zur Nutzung der Software (Nicht-OpenGL) Qt Quick 2-Renderer von QMLSCENE_DEVICE Einstellung = softwarecontext per docs; Glyphkorruption ist immer noch aufgetreten.
Stellen Sie eine [mcve] bereit. – Meefte