torutkのブログ

ソフトウェア・エンジニアのブログ

JavaFX 雑多メモ

JavaFX 勉強会(第7回)

日本JavaFXユーザグループ主催で7/2に開催された勉強会に参加してきました。

LTの資料はtogetterから。

スレッディング

OTN Discussion Forumsに投稿されていたRichard Bairさんの記事より抜粋

Presently in JavaFX, although we have a render thread and application thread, they both essentially run synchronous. I have a patch going into 3.0 as soon as the repo opens that allows us to run multithreaded, where the FX app thread and render thread will be running in parallel except for the brief period of time where they synchronize during the pulse.

適当訳

JavaFXは内部に描画スレッドとアプリケーションスレッドと2つスレッドがるけど、逐次的に実行しないといけないんだ。でも3.0に向けて描画スレッドとアプリケーションスレッドがほんの短い同期期間を除いて並行に実行する修正をしているよ。

Swingも含めて大半のGUIライブラリはシングルスレッドが原則なので、

  • アプリケーション側は時間のかかる処理をGUIスレッド上ではやってはいけない
  • 描画処理が重いときはアプリケーション側の処理が待たされる(遅れる)

といった問題があり、別スレッドで実行しスレッドを載せ替える*1といった面倒な実装が必要でした。

ですが、この投稿を見ると、JavaFXではアプリケーションスレッドと描画スレッドが並行して動くようになるらしいので、将来的には面倒なプログラミングが減るのではないかとちょっと期待します(違うかも)。

GPUのサポート

JavaFXは、グラフィックスハードウェアの描画処理を利用するので、JavaFXの性能は、実行しているマシンのグラフィックスハードウェアの能力に左右されます。

JavaFX 2.1.1のシステム要件のドキュメント(次のURL)に対応するGPUが記載されています。

オンボードグラフィックまたはCPU統合グラフィック

多分、性能的に一番厳しく、かつ利用者が多いので(不満の)声が大きいのがこのタイプのPCと思います。

ドキュメント上は、次の記載です。

Intel
Mobile GPUs: GMA 4500MHD and GMA HD
Desktop GPUs: GMA 4500 and GMA HD

ノートPCでは、GMA 4500MHDが搭載されるのは、Wikipedia(日)によると、チップセットにGL40, GS40, GM45, GS45とあります。

これらのチップセットCore 2 Duo用で、2008年半ばのリリースです。ノートPCで2008年秋冬モデル以降であれば、対応している可能性が大です。

GMA HDは、Sandybridgeと呼ばれるCore iシリーズのCPUに内蔵されるGPUです。

デスクトップPCでは、GMA 4500が搭載されるのは、同Wikipedia(日)によると、チップセットにB43, Q43, Q45, G41, G43, G45 とあります。
これらはCore 2 Duo用です。

GMA HDは、同様にSandybrige系のCore iシリーズです。

ただ、JavaFXが対応をうたっているとはいえ、GMA 4500系は性能的に厳しいかなぁと思います。

あと、JavaFX(Prism)でサポートされていないグラフィックスチップの場合、Java 2Dに描画処理がゆだねられ、ここでJava 2Dがサポートする(古めの)GPUでのレンダリングが走るかもしれません。

Java起動時に次のオプションを指定すると、GPU活用状況詳細が出力されます。

$ java -cp /java/javafx/rt/lib/jfxrt.jar:. -Dprism.verbose=true Hello
Prism pipeline init order: d3d j2d 
Using t2k for text rasterization
Using dirty region optimizations
Prism pipeline name = com.sun.prism.d3d.D3DPipeline
Loading D3D native library ...
        succeeded.
Direct3D initialization succeeded
(X) Got class = class com.sun.prism.d3d.D3DPipeline
Initialized prism pipeline: com.sun.prism.d3d.D3DPipeline
OS Information:
        Windows 7 build 7601
D3D Driver Information:
        ATI Radeon HD 5700 Series
        \\.\DISPLAY1
        Driver aticfx64.dll, version 8.17.10.1124
        Pixel Shader version 3.0
        Device : ven_1002, dev_68B8, subsys_1482174B
EmbeddedStage.setBounds: x=0.0 y=0.0 xSet=false ySet=false w=-1.0 h= cw=149.0 ch=31.0
EmbeddedStage.setBounds: x=0.0 y=0.0 xSet=false ySet=false w=-1.0 h= cw=-1.0 ch=-1.0

*1:Swingで言えば、SwingUtilities#invokeLaterメソッドやSwingWorkerクラスを使う