takeda_san’s blog

KotlinとVRを頑張っていく方向。

JavaFXで白い画面がでるので…

白い画面現象

JavaFXの画面の描画が止まって、真っ白なウィンドウが表示される。
という現象が、何回か起きてます。

原因としては次のどちらかでした。

  1. ヒープ領域がいっぱいだった
    コントローラーとか、UI部品などの大きなオブジェクトの中に参照が残っていて画面を閉じても
    GCされずにのこってしまう。
    リスナーをaddしたらちゃんとremoveしようねッ。という話。
    これが起きたらヒープダンプをとってvisualVMかなんかで参照を持ってるオブジェクトを確認すると良い。

  2. 描画スレッドで重たい処理をしていた、またはデッドロックしてた
    JavaFXはどうやら「JavaFX Application Thread」で描画しているようなのだけど
    このスレッドでサーバーの応答を待つとか、巨大ファイルを読み込んだりをするとその間、描画が止まります。
    ちゃんと、描画と関係ない重い処理は、別のスレッドで実行しようねッ。という話。

あと、同じくこのスレッドでデッドロックすると当然描画が止まる。
これが起きたらスレッドダンプをとって、デッドロックしてないか見てみると良い。

第三の敵

そして襲来した第三の敵。
ヒープ領域も余裕があるし、スレッドダンプを確認しても描画用のスレッドは動いている。
頭を悩ませていた時に、天から『もしかしたら、ハード依存かもよ・・・かもよ・・・』とのお告げが。

[JDK-8154847] Windows content is blank when using StageStyle.UNIFIED - Java Bug System

そして、こいつである。
原因としては、

  • Windows10とintelの特定のチップセット(Intel(R) HD Graphics 5xxと思われる)の組み合わせで
  • 「StageStyle.UNIFIED」をステージに設定

すると発生するとのこと。
類似のバグ報告を確認するとIntel(R) HD Graphics 520とIntel(R) HD Graphics 530で起きることは確認されているようだ。
で、グラフィックドライバのバグだからしょうがないネ。的な感じなのかな。

もう仕方ないので、ハードでの描画をあきらめてソフト側で描画処理をすることにしました。
このバグのコメント欄にもあるんだけれども、VMオプションで『-Dprism.order=sw』をしていするとソフト側で描画してくれるっポイ。
無事解決なんだけど、ちょっとモヤモヤ。