タイトルJava Watch on the X》5 _ ハードウエアアクセラレータをチェック(2)カテゴリーJava, Java Watch on the X
作成日2002/3/6 14:12:7作成者新居雅行
前回は、AWTのコンポーネントを使ったアプリケーションでベンチマークをしたが、効果がないという結論であった。今回は、Swingのコンポーネントを使ってテストを行ってみたが、数字の上では効果が現われた。だが、体感上は数値ほどの違いはみられなかったというサンプルを示したい。だが、アクセラレーションの動作がそこそこ見える感じがするので、以下のサンプルをダウンロードして確かめてもらいたい。

 http://mdonline.jp/figs/02/028/SwingAccelTest2.sit

実は前日のプログラムに手を加えているのであるが、JFrameのウインドウに、やはりJPEG画像をたくさん出すということを行っている。そのために、JLabelにImageIconによるアイコンを組み込み、そのJLabelコンポーネントをランダムな位置にランダムな大きさで100個追加した。だから、写真の断片がウインドウ上にずらりと並ぶ感じだ。だが、Swingはだぶるバッファを用いているため、なかなかベンチマークとして意味のあるポイントをどこに見るかは難しいのであるが、JFrameのpaintメソッドに要する時間と、JLabelのpaintメソッドの合計時間あたりを求められるようにしてみた。たとえば、ウインドウを表示するときはもちろんとしても、ウインドウのサイズを変更したときにはpaintメソッドが呼び出されて、JLabelの描画処理を行うことになる。そこで、JFrameにpaintメソッドをオーバーライドし、その中で、super.paint(g);に要した時間を測定してみた。また、100個のJLabelの描画にかかる時間も同様にサブクラスを定義してpaintメソッドをオーバーライドして測定してみた。プログラムの詳細は、ソースを御覧いただきたい。

アクセラレーションを有効にする場合としない場合で、極めて大きな数値の違いが見られた。JFrameのpaintメソッドに要する時間は、有効にすると、100〜200ミリ秒程度だ。ところが無効にすると、4000秒程度になる。もちろん、これは出来過ぎた結果である。なお、いずれの場合も、約80〜90%の時間はJLabelのpaintメソッドで消費している点は違いはなかった。
ただ、アクセラレーションを有効にしても、無効にしても、画面の再描画が始まってから、写真がどっと画面に出て来るまでの時間は、4秒程度と違いはなかった。ここで、コンソールに出てくる情報のタイミングがえらく違っていることに気が付いた。アクセラレーションを有効にした場合、すぐにベンチマーク結果がコンソールに出る。つまり、JFrameのpaintメソッドはすぐに終了するのであるが、描画結果に出るのに時間がかかっているのである。一方、無効にした場合には、ベンチマークの終了、つまりpaintメソッドの終了と同時に画面の再描画が終了する。
ここからは想像であるが、アクセラレーションは、Swingのダブルバッファリングの描画メカニズムを高速化しているのではないだろうか。ただし、そのダブルバッファから、実際のウインドウへの転送という作業に実際に時間がかかっているのか、体感的な違いが出て来ないということになっていると考えられる。そうすると、オフスクリーンでの重たい描画処理をするとなると、大きな違いが出るような感触があるが、機会があればテストをしてみたい。ただ、その一方で、単にアクセラレーションの有効と無効で、描画処理の流れが違うだけということも考えられる。
いずれにしても、アクセラレーションをどう使うのかといったことは一概には決定できそうにないが、Swingを使わないのならオフにしておくのが無難だと思われる。一方、Swingを使うのならオンにするのが基本的には良い結果を期待できるということには変わりない。ただ、やはりAppleからは、どんな場面で有効なのかと言った具体的な情報を示して欲しいところだ。

∽∽∽∽∽∽∽この項、以上∽∽∽∽∽∽∽[新居雅行]∽∽∽∽∽∽∽
関連リンク