vingareの高速化

 ちょっとPC間で画面を共有したい用事ができたので、vinagreというVNCクライアントを使ってみることにした。しかし、このVNCクライアントが非常に重い。Pentium M 2GHzのマシンだと、重くて使い物にならない。Core2 Duoのマシンでもかなり重い。
 マシンパワーが足りないという訳ではなく、xtightvncviewerだとなんの問題もなくつながる。しかし、xtightvncviewerだとTLSでの暗号化がサポートされてないので、できればvinagreが使いたい。ダメならSSHでポートフォワードしてxtightvncviewerを使うという手があるので、絶対にvinagreが使いたいんだというほどでもないけど。
 vinagreはVNCの部分にはgtk-vncというウィジェットを使用している。どうもこれが重いみたいだ。
 ということで、sysprofやらgoogle-perftoolsやらで調べてみたら、いくつかの関数からgvnc_readという関数が3byteとかそんな単位で非常に頻繁に呼び出されていて、さらにその中でmemmoveを呼び出している部分がボトルネックになっていた。
 いくつかの関数というのは、画面をアップデートするために一万ピクセルぐらいをreadするもので、これがピクセル単位ではなく行単位とかでピクセル情報を読み込むようにすれば高速化できそうだった。と言うわけで、高速化するパッチを作ってみた。パッチを当てることによる変更点は以下の通り。

  • 1ピクセル単位でgvnc_readを呼び出している関数を減らした。(まだ無くなったわけではない。)
  • set_pixel_atを使って1ピクセル単位に画面にピクセルをセットしているところをbitblt使って書き直した。

 インタラクティブなアプリケーションなので、数値でどれぐらい高速化されたというのは難しいのだけれど、体感的な速度はだいぶ改善された。まだパッチとしては不完全なところがいくつかあるので、それを修正してからupstreamに送る予定。