【しばらく編集不可モードで運営します】 編集(管理者用) | 差分 | 新規作成 | 一覧 | RSS | FrontPage | 検索 | 更新履歴

VectorDrawing - ベクタ描画: OpenGL シェーダと cairo

目次

ベクタ描画: OpenGL シェーダと cairo

ミステリー

少し前、Zack Rusin と、QT と Gnome/Gtkの描画スタックの違いについて話す機会があった。Zack は、CPUの馬力のごく一部を使って、ビジュアルツールキットの興味深いデモを見せてくれた。我々が始めた議論の一つは、テセレーションを行うために GPU ハードウェアを利用することだった ―― テセレーションを常にソフトウェア上で行っている cairo とは対照的に。このアイデアは、実際に役に立つかはわからないが、実に興味を惹くものだ。

GUADECで私は、cairo において、OpenGL と シェーダでハードウェアアクセラレーションされたテセレーションを行うことの可能性について何人かに訊ねた。そして、このアプローチの問題点や副作用について、建設的な、興味深い(しかしがっかりするような)フィードバックをもらった。これについての多くの(とても妥当な)指摘は、Tim Janik によって blog に書かれている。しかしながら、結果やパフォーマンスの改善の可能性についてはまだまだ不透明だ。

調査

そういうわけで、私は、どういうスピードの違いがあるか見るために、ちょっとしたベンチマークを書くことにした。とにかくこのゲームはやる価値があるのか見てみよう。実験台として、ベクターグラフィックスのもっとも基本的な要素の一つを選んだ ―― ベジェ曲線の描画アルゴリズムだ。私は 100% ハードウェアアクセラレーションされているバージョンをGPU上の頂点シェーダプログラムとして実装した。これを cairo のソフトウェア実装と、2つのシナリオで比較しよう。以下は実験条件:

とても大雑把な結果としては、OpenGL による ハードウェアベースのテセレーションを利用した描画は、既往の cairo のソフトウェア実装より30倍速かった。GIMP などで2つの結果を重ねると、ちょっとしたピクセルの差異があるようだ(たぶん、cairo の実装はより精密だ)。ただ、基本的に2つは同じだ。OpenGL の シェーダによる実装は全く最適化されていないので、頂点シェーダの代わりにジオメトリシェーダを使えばもっと速くなるかもしれない。

スピードだけではない

通常 CPU で行うことを GPU でやる意義はもう一つある。プロセッサ(CPU)を他のことに使えるということだ。私の実験では、cairo による実装でランダムな曲線を可能な限り速く描画すると、最高10fpsのアニメーションを行えた(曲線の数はフレームあたり100本だ)。このとき CPU 利用率は100%で、CPU に他のことをさせるとコマ落ちが発生した。

100% GPU による実装では、400fps が出た上に、CPU の利用率は30%を超えることはなかった(この30%の大半は、ランダム数の生成だろうと思う)

警告

とはいえ、私はこの結果は興味深いと思う。私はこの他に、ベタ塗りのベジェ図形を描画する実装(これはまた後ほど)をさっと作ってみた。パフォーマンスの差はいっそう大きく見えた。私の直感だと、プログラマブルなハードウェアによる描画は、解像度非依存のフルベクタ UI を実現する唯一の方法だろうと思う。特にモバイル分野では、CPU パワーは貧弱だし、スケーラブルではないし、CPU を酷使しないことは全て電池の長寿命化につながる。

コメント

Carl Worth

やあ、Michael。

私は、グラフィックのレンダリングをスピードアップすることにとても興味を持っている。将来的な話をすると、「テセレーションを常にソフトウェア上で行っている cairo」という一文には全く同意できない。もし、ハードウエアによる良質なテセレーション実装があれば、cairo で利用することは吝かではない。

あと、何点か:

 ―Carl