Java2Dの大幅な高速化その4 完結編

http://d.hatena.ne.jp/shin/20081118/p2の続き。

画像を表示

drawImageでテスト。画像サイズは64*64ピクセルでImageIOにて取得したもの。

J2SE5.0のときはアクセラレーションを効かそうとするとピクセルフォーマットを理解して設定する必要があってImageIOから取得しただけだとぜんぜん使えなかった(ちゃんと環境を理解している人のみが高速化できた)。JavaSE6からはその制限が大きく緩和されて比較的手軽に高速化するようになった(ここまではblog移行前の日記でいろいろと触れてます)が、update10ではまた別次元の速さを見せ付けてくれた。

256個の透過付画像を表示を1フレームとし、1000回フリッピングして時間を計測した。

update6 2860ms
update10 680ms

3倍もはえー。これだけ速いとマシンパワーがかなり低くてもJOGLを使わずに60fpsでのアクションゲームは余裕で作れそうな気がする。

拡大縮小


で、ここからが本題。拡大縮小をしてみる。

update6 24560ms
update10 680ms

えええええええええええええええええええええええええええ。

速度が変わってない。拡大縮小は完璧にアクセラレーションが効いているようだ。update6は9倍近く遅くなってるのに。

回転

update6 22960ms
update10 800ms

2桁違う結果が出ても、もう驚かないぞっ!

αブレンディング

update6 17680ms
update10 1380ms

ここも10倍以上の差がついた。


ちなみに


ちなみに、同じコードでbufferStrategy.getCapabilities().isPageFlipping()の実行結果が異なった。

update6 false
update10 true

注意されたし。

結論


update10ではJava2Dがおおむね3倍から10倍くらいの描画性能がアップしている。すごいの一言。

とはいえ、Java2Dがゲームやまともな各種描画用途に微妙なのは変わらない。αブレンディングが弱すぎるからだ。5.0、6とバージョンアップするたびにCompositeが増えるのではないかと期待していたのだが、見事に裏切られ続けられてきた。自前でCompositeを実装した場合ソフトウェアレンダリングになるうえに、パイプラインが中断、VRAM→メインメモリへの転送が大量に発生するのでこれも現実的ではない。

わかる人向けの説明とすれば、NEOGEOX68000のスペック程度のアクセラレーションはPureJavaでしっかり効くということ。もちろん、速度ははるかに今のPC+Javaのほうがはるかに速い上に制限がない。


テキスト描画などを考えるとJOGLとどっちを使うかというのは結構悩むところ。

ゲームが一番熱かった時期を考えるとNEOGEOやX68程度のスペックでも十分なのかもしれない。ShinGL1のようにJava2D用のゲームライブラリをまた作るのもいいかも。今度はオープンソースにすっかなぁ。でも需要無いからいらないか。