この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2007年1月)

2007年1月1日

Bug 5533 [Cairo][GTK2] pango_shapeの呼び出し回数の軽減すべき
初回投稿日時: 2007年01月01日11時36分42秒
カテゴリ: Mozilla Core
SNS: (list)

Linux版のテキストレンダリングはほぼ、基本的な機能の実装は終わっているが、パフォーマンスが非常に悪いというのが問題になっていた。WindowsとLinuxでほとんど同じ構造のコードを書いてLinuxだけ極端にパフォーマンスが悪いのでpangoの性能がWindowsのUniscribeに比べて極端に悪いとしか言いようがない。そこで、各APIのパフォーマンスを測定してみた結果、現在のコードでは極端に時間を食っているpango_shapeの呼び出し回数を抑えれば高速かできそうだ、という結論に至った。そんな訳で、何故か年を越しながらのパッチ作成になった。

pango_shapeは最低、一回は呼び出さないといけない。だが、グリフの存在確認にこれを利用していたのが間違いだったようだ。もし、一つ目のフォントで全てのグリフが存在しなかった場合、フォントが見つかるまでpango_shapeを繰り返さなくてはいけないからだ。ならば、描画時にはリガチャのためにpango_shapeが必要でも、グリフの存在確認だけならUnicodeの文字単位で問題のない言語に関しては、先により軽いAPIで一文字ずつ確認するようにすれば、pango_shapeは最後に、必ず成功する状況になってから一回だけ呼べば良いという状況を作りあげることができるはずである。

幸運にもpangoのリファレンスを再度読み返しているとそういうAPIがあった(名前から推測するに、直接ccmapにアクセスして高速に処理してそうなもの)。そこで、これを利用することで、よりシンプルなコードを書くことに成功した。

だが、世の中、そんなに甘いものでもなく、通常の描画はほとんど高速化しなかった。(ケースによっては逆に遅い場合もあるようだ。) しかし、テストを重ねてみると、文字化け時等のハングアップするような以上な文字列の処理速度が劇的に高速化できた。文字化けすると若干待たされるという程度で1分近く固まるという状況は見られなくなっている。こちらが改善できたのがむしろ良かったかもしれない。

他にもpango_shapeの呼び出し回数を削減するプランはあるので、complex script用にその辺の実装も暇を見つけてやっていきたいと考えている。

関連するかもしれないエントリ

bug 5533を含むエントリ

Bug 5533 [Cairo][GTK2] pango_shapeの呼び出し回数の軽減すべき #2