Bug 5533 [Cairo][GTK2] pango_shapeの呼び出し回数の軽減すべき
初回投稿日時: 2007年01月01日11時36分42秒
カテゴリ: Mozilla Core
SNS:
Tweet (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用にその辺の実装も暇を見つけてやっていきたいと考えている。