Qt 5 を 64bit Linux で動かすと文字の描画が壊れることがある
このサンプル のスクリーンショットなのですが、「ホ」の描画が上下反転みたいな感じになっています。
タイミングによっては以下のように全体の文字がそれぞれ逆さまになったり、さらに酷いときにはもっと文字の描画がぐちゃぐちゃになったりする現象に悩まされていました。
会社で仕事で使っている 32bit の Ubuntu 12.04 では再現しないので、Gentoo でしか再現しないエラーとかめんどくさいなーと思っていたところ、64bit の Ubuntu で同じ現象が見られたので、少しやる気をだして調べることにしました。
このサンプルを作る試行錯誤の過程でなんとなくフォントの描画よりもフォントの描画のキャッシュの方が怪しいという気がしていたので、void QSGDistanceFieldGlyphCacheManager::insertCache(const QRawFont &font, QSGDistanceFieldGlyphCache *cache) の処理をコメントアウトし、キャッシュをしないようにしてみました。
これによってこの描画の不具合が発生しなくなりました。
キャッシュを一切使わなくすると、文字の描画は遅くなるので、もう少し根本的な原因に近づけないかなと調べたところ、あやしいフラグ を発見しました。
このフラグを使っているところ には、[QTBUG-29264] Rendering stalls in glyph cache のワークアラウンドだぜ!というコメント入り。
というわけで、このワークアラウンドを試すために環境変数「QML_USE_GLYPHCACHE_WORKAROUND」を「1」に設定してサンプルを動かしてみたところ、フォントの描画が壊れる現象は再現しなくなりました。
めでたしめでたし。
2013年04月21日追記:この環境変数でワークアラウンドを有功にするパッチ は 4月3日にとりこまれたばかりなので、5.0.2 や 5.1.0 のα版には含まれていません。試す場合には 自分で Qt 5 の stable をビルド してください。