2017-04-20 11 views
0

私は、JavaFX Canvasを使ってShapeオブジェクトとPolylineオブジェクトのモーションをアニメーション化しています。 現在、すべてのフレームで、リスト内の各シェイプまたはポリラインのXとYの位置が必要に応じて編集され、オブジェクトが移動されます。 これは約20-30fpsになります。JavaFX Canvas効率的なアニメーション

これまでの手法では、フレームごとにキャンバスをクリアし、各オブジェクトを再度描画してみました。オブジェクトのリストは保存されません。 これは60fpsになります。

この2つ目の方法ははるかに厄介なアプローチであり、はるかに優れたフレームレートを実現しています。

JavaFXキャンバスでアニメーション化するためのベストプラクティスまたは推奨される方法はありますか?きれいで推薦されたものはどれも良いフレームレートをもたらしますか?

多くのおかげ

+0

コードを投稿できますか? – Oswald

+1

私はあなたの最初の例でキャンバスを使用しているのではないかと思います。一部の図形のx/y位置を変更するだけでは、JavaFX Canvas上で何も移動することはできません。私はあなたがシーングラフについてここで話していると思います。これを明確にしてください。 – mipa

答えて

2

私はちょうどJavaLandの会議でこれらの問題についての講演を行いました。現在、キャンバスを使用したパスベースのシェイプ(ポリラインやポリゴンなど)を使用する一般的なアニメーションは、最も標準的なオプションです。これは、シーングラフを介したアニメーションを遅くするJavaFXのバグが原因です。私はこの問題を報告しており、バグ修正が途中で行われています。このJIRAの問題で

https://bugs.openjdk.java.net/browse/JDK-8178521

私は、ソフトウェアレンダリング対ハードウェアを参照してくださいが、キャンバスは、このバグによる影響を受けませんので、それはまた、キャンバスのレンダリング対シーングラフに影響を与えます。

+0

バグ報告の下のコメントは回避策を示唆しています: 'prism.cacheshapes'システムプロパティを' false'に設定してください。これはコマンドラインからVM引数 '-Dprism.cacheshapes = false'を使って行うことができます。これをプログラマチックにやりたいのであれば、 'Application'クラスがロードされる前に*明らかにそうする必要があります(私は理由はわかりません)。これは' System.setProperty( "prism.cacheshapes "、" false ");'次に 'Application.launch(MyApplicationSubclass.class);'。 –

+1

シェイプをアニメートする以外に何もしない限り、これは良いアイデアではないかと思います。通常はシェイプをキャッシュするのが理にかなっています。 – mipa