Java2Dの大幅な高速化その2

昨日の続き。

昨日はfillRectしか試していなかったが、今度はいろいろと変えて実行してみる。昨日と同様に256000回のループで。

円描画

描画部分を以下のように変更。

g.fillOval(x*24, y*24, 16, 16);

結果

  • update6 4700ms
  • update10 3600ms

update10のほうが速いことは速いが、割合としての差は減ったようだ。差の絶対値としてfillRectのときと同じくらいの差があるようだ。ということはもしかして純粋にレンダリング性能以外の例えばページフリッピング等の処理に差がついたということか?

描画なし

ということで今度は描画を一切なしでテスト。

  • update6 40ms
  • update10 190ms

今度はupdate10の方が遅くなった。どうやらレンダリング以外が早くなったというわけではないらしい。Direct3DよりDirectDrawのほうがスループットは劣るがレスポンスがいいというのは常識なのでこれは納得する結果かな。

文字の表示

今度は文字を表示してみる。固定で"ABC"という文字列を繰り返したところあまりの差がでて驚いた。ここまで差がつくとキャッシュの問題とかバグかもしれない。というわけで'A'から順番に文字を描画してみた。

描画部分を以下のように変更。

char c = (char)('A'+x);
g.drawString(Character.toString(c), x*24, y*24);
  • update6 14400ms
  • update10 400ms

やっぱりとんでもない差がついた。ひらがなや漢字に変更したり表示する文字の範囲を増やしたりしたが、どれも同じくらいの結果になった。これだけ文字の描画が早いからこそSwingのアプリが快適になってるのだなぁと認識した。


やっぱりupdate10はすごいっす。5.0以降0.1単位はなくすると宣言したためただのupdateになったが、本来だったら6.1という名前がついていたのだろうなぁと改めて思った。逆に今までクライアントに対してどれだけ力を入れてなかったのかがわかる。

Java同士での比較だけではなくてネイティブな描画との比較もできると面白いかも。もしくはupdate10のDirect3Dに対して、JOGLのOpenGLによる描画とか。