2016-08-31 10 views
0

JavaFX(8)3Dアプリケーションを構築しました。これは、一部のファイルからデータを読み取り、それを一部のシーンでレンダリングします。オブジェクトをレンダリングするためのJavaFX-3Dを使用してアニメーションを作成するときにメモリリークが発生する

は、私が使用します。

graphicsContainer.getChildren().add(some3dObject); 

私はこの行をコメントアウトすると、レンダリングを無効にするため、私はまったくメモリリークを持っていません。

しかし、この行が実行されると、アプリケーションはますます多くのメモリを消費します。私は毎秒30フレームを持っており、毎秒メモリ消費量は〜50MBに増加します。

これは私が使用するフレーム間が、勿論である。

graphicsContainer.getChildren().clear(); 

IはgraphicsContainerに割り当てる3Dオブジェクトは、ローカルの任意の静的/グローバルスコープに保存されません。それらはgraphicsContainerの子としてのみ保存され、すべてのフレームで消去されます。

graphicsContainerの子どもを毎回削除しても、JavaFX-3Dエンジンの何かが私の仕事を本当にクリアしてくれないようです。

JavaFX 3Dエンジンが過去の3Dオブジェクトとレンダリングをどのようにしてリリースするか考えてみましょうか?

+0

メモリリークの実際の証拠は何ですか?それは最終的に完全にメモリ不足ですか?ガベージコレクタが未使用のメモリ(まだ)を回収する必要があると判断していないことをどのように知っていますか? –

+0

Linuxでこれを実行していますか? JavaFXはいくつかの設定でLinux上でいくつかのメモリリークの問題を抱えています(技術的に漏れはJavaではなくMesaにありますが、JavaFXが唯一の場所です) – Itai

+0

Windows上にあります – SomethingSomething

答えて

0

私のシナリオでは、すべてのフレームに同じ3Dオブジェクトセットが含まれています。フレームごとに変化するのは、これらのオブジェクトの位置と変形だけです。

私が作成する各3Dオブジェクト(Sphere、Cylinderなど)をいくつかの配列に保存することでした - 各フレームに新しいGroupと新しい3Dオブジェクトを毎回作成するのではなく、その位置と変形を変更するだけです。

今のところメモリは約220MBです。

+1

シーングラフを使用する方法です。シーングラフAPIは即時モードレンダリングAPIではないので、グラフィックス全体を常に再作成することはお勧めできません。 – mipa

関連する問題