2015-10-20 8 views
6

私のアプリケーションでは、ユーザーは即座に言語を切り替えることができます。ユーザーが中国語または日本語に切り替える時間の約10%が表示されていますが、UIテキストのグリフが不適切にレンダリングされています。QML CJKテキストが壊れたグリフでレンダリングされるのはなぜですか?

このアプリケーションは、iMX6プラットフォーム上のLinuxで動作しています。 Qt 5.5.0が使用されています。 UIをレンダリングするためにQMLが使用されます。破損したテキストは、QML Textコントロールを使用してレンダリングされます。

Example of corrupt font rendering

質問で使用されているフォント

は、通常のソースハンス・サンセリフです。私はこれをQML FontLoaderを使ってロードし、アプリケーションフォントデータベースにC++側でロードしてみました(両方のメソッドが問題を呈していました)。私はNotoフォントを使ってみました。同じ問題。

CJK以外のテキストにRobotoを使用するとテキストレンダリングが破損することはありませんでした。前述のように、CJK/Source Hans Sansの方が頻繁に動作します。

グリフの定義レベルではなく、レンダリングされたビットマップレベルにあるように見えるので、破損は面白いです(グリフの下半分は正しいが、上半分は壊れていることに注意してください)。

腐敗が進行することがあります。これにより、グリフビットマップキャッシュメモリがさらに上書きされていると思うようになります(Qtがフォントレンダリングを行う方法がわからないので理論だけです)。私はそれが奇妙な何かをしているQMLのガベージコレクションかもしれないと思ったが、C + +側でフォントを読み込むことは違いをもたらさなかった。

次に、QML Textコントロールに「ネイティブレンダリング」を使用してみます。

誰もこれまで見たことがありますか? FreeTypeがQt 5.5.0でのフォント管理/レンダリングに使用されていることを誰でも確認できますか?フォントビットマップキャッシュの管理方法に影響する方法はありますか?

ありがとうございます!

更新: 'renderType:Text.NativeRendering'を使用しても問題は解決されませんでした(ただし、破損はわずかに異なります)。そして、そのモードの限界を考えれば、一般的にレンダリングされていないテキスト(ソフト、スケーリング不足など - as documented)で終わっただけです。

アップデート2:私は(私の知る限り)を無効グリフキャッシュのすべてのQtを構築しました - shouldDrawCachedGlyphsを()私は見つけることができた、その呼び出しの4つのインスタンスのために私の地元のビルドにはfalseを返します - - でもグリフの破損が発生しました。

更新3:softwarecontext QMLSCENE_DEVICE = per docsを設定することにより、ソフトウェア(非OpenGLの)Qtのクイック2レンダラーを使用するように切り替える試みました。グリフの破損がまだ発生しました。

+0

[mcve]を入力してください。 – Meefte

答えて

4

この特定のケースでは、私が作業しているプラ​​ットフォーム上のOpenGLドライバにバグがあります。これはFBOリードバックに影響します。環境内でQML_USE_GLYPHCACHE_WORKAROUND = 1を設定すると、Qtはグリフキャッシュの追加コピーをRAMに保持します(新しいグリフが追加されたときにグラフィックスハードウェアから読み戻すことはできません)。

これは、レンダリングは正しく行われますが(壊れていない2番目のキャッシュを使用しているため)、CPUに余分なコピーがあり、グリフキャッシュが使用するため、パフォーマンスはわずかに低下します2倍のメモリ。レンダリングの質には影響ありません。

Qtサポートは正しい方向に私を指摘し、QML_USE_GLYPHCACHE_WORKAROUNDに関連する影響を修飾することができました。

+0

"パフォーマンスが若干低下する"パフォーマンスが向上するように見えるのは、50ミリ秒ごとに異なるテキストをレンダリングすると、GLYPHCHACHE_WORKAROUNDを使わないで時間がかかることがあり、テキストレンダリングがより一貫して機能するように見えるということです。 – SketchBookGames

+0

"レンダリングの品質には影響ありません"レンダリングメトリックは結果としてわずかに変化するようです。一例では、私のテキストcontentWidthは500であり、現在502であり、contentHeightは40であり、現在は46である – SketchBookGames

関連する問題