JDK 1.6 Update 10 の XORMode 描画が遅い件と対処法
個人的な趣味で書いた Java の金融解析ソフトを久しぶりに改修したとき、グラフの描画が異様に遅いことに気が付き、パフォーマンス解析をする事になりました。
最初は、Windows Vista 64bit版に移行したせいかな。とも思いましたが、そういう問題でもない様子。
あとは、超重い演算ロジックのせいなのかとも思いきや、これもシロ。
(※反復法しか解がない小難しい演算を、さらに繰り返し演算してグラフにプロットするという凶悪なロジック。。。。偉い数学者さん、解を発見してください(泣))
さらに調べたら、マウスカーソルに連動して動くラインの描画に、なんと 200ms 近く費やしているご様子。試しに setXORMode メソッドを呼んでる行をコメントアウトしたら普通の速さになった。なんじゃそりゃ。
いくら画面上の表示内容を持ってきて XOR 演算してから再度画面描画するとはいえ、最近のPCの演算能力でこの程度のパフォーマンスでは到底計算が合わないので、仕方なくいろいろ調べたら出てきました。
どうやら、Java VM での Direct3D パイプラインを無効にするとパフォーマンスが改善するらしい。
結局、Java アプリの起動バッチから、以下のプロパティを渡して解決しました。
-Dsun.java2d.d3d=false
この設定のおかげで元の速さに近くなりました。
今回のソースは Sun の公式フォーラム。
Java 2D – Problem drawing in XORMode with JDK1.6 Update 10 (英語)
XOR 矩形描画に2秒もかかる!なんでこんな仕様にしてるんやっ!とお怒りの方がお見えですなぁ。と、それはともかく、JDK 1.6 Update 10 のリリースノートには以下のような記述があるとのこと。
* To disable the Direct3D Pipeline, pass the following property to the Java VM: -Dsun.java2d.d3d=false
Alternatively, set the J2D_D3D environment variable to 'false' prior to starting your application (or set it globally).
* To get diagnostic information about the pipeline set the following environment variable prior to starting any GUI application from a command line console: J2D_TRACE_LEVEL=4. The tracing output will be printed into the console. Please provide this output when filing a bug or asking a question on the forums.
* Some operations not directly supported by Direct3D API may perform slower than with previous releases (*such as XOR paint mode or rendering on non-managed images*). See 6635462 and 6652116
* For more information about troubleshooting issues with Java2D consult Troubleshooting Java 2D .
なるほど、そのままズバリが書いてあるわけですね。まぁ、動くだけめっけもんという感じか。
該当する部分は、ゆくゆくは書き直したほうがいいのかなぁ。と思いながら、とりあえず動いたのでこれでよしとする事に。
関連記事