0

私は、たくさん (数百) の 3D モデル (3ds と obj) を使用する Java 3D プログラムを持っています。使用するモデルの数が増えるほど (そして実際にそうしなければならないのは、現実世界のオブジェクトの 3D モデルのようなものです)、プログラムはより重くなり、1 つの操作を完了するのに何年もかかるようになります。

CPU 消費量が 50% に達することはめったになく、ほとんどが 10% から 30% の間で推移していますが、メモリ消費量は 3D モデルが追加されるたびに (明らかに) 増加しています。

c++/c プログラムのメモリ インプリントを最小限に抑える方法は知っていますが、Java の GC では、-Xmx で JVM のメモリを増やす以外にできることはありますか? 私はすでに -xMx512Mb で実行しています。

GCViewer を使用して GC ログを確認しましたが、疑わしいものは見つかりませんでした。

SOに関する非常によく似た質問をいくつか知っていますが、私の質問に正確に答えたものはありません。

私のIDEはIntelliJ 11です。

4

3 に答える 3

4

作成するオブジェクトの数を減らす簡単な方法が 2 つあります。いずれかまたは両方の方法が目的に合っている可能性がありますが、仕様がないと確信が持てません。

1) 非常に変更可能なオブジェクトを操作します。相互に作用する必要はないが、類似性が非常に高い多数のものをシミュレートする必要がある場合 (たとえば、毎回わずかに異なる粒子で相互作用する 12 個の粒子の 10 万回のシミュレーション)、次に、同じ十数個のオブジェクトを何度も使用し、ミューテーター関数を使用して負荷を CPU に移します。ただし、Java には既に組み込みのガベージ コレクションがあることを考えると、多くのオブジェクトを順番に使用することが問題になるとは思いません。

2) 類似オブジェクト間の類似点を独自のクラスにします。たとえば、多くのオブジェクトが必要であり、それらのかなりの部分が多くのメモリを集中的に使用する特性を共有していることに気付いた場合、それらの特性を独自のクラスに格納し、そのクラスの単一のインスタンスをすべてのオブジェクトで参照します。まったく同じフィールド値を持つオブジェクト。例として、Apple オブジェクトのセットを考えてみましょう。GrannySmithApples、MackintoshApples、RedDeliciousApples に対して、クラス全体で共有される特性のための独自の静的フィールドを持つさまざまなクラスを作成することができます (たとえば、RedDeliciousApples には、抽象クラス Apple で宣言され、"red" に設定された静的な String フィールドがあります)、または (より多くを許可するため)実行時の柔軟性) 各クラスは CoreCharacteristic のインスタンスを持つことができます。

CoreCharacteristic c = new CoreCharacteristic(<some parameters>);
Apple apple1 = new Apple(c);
Apple apple2 = new Apple(c);
Apple apple3 = new Apple(c);
Apple apple4 = new Apple(c);

は、4 つのリンゴすべてに対して 1 つの CoreCharacteristic のみを使用し、それ以外の場合は各リンゴに対して複製される CoreCharacteristic のフィールドを格納するために必要なメモリ量を 4 分の 1 に減らします。

于 2012-06-16T18:27:51.420 に答える
1

私の観点からは、次の 2 つのオプションがあります。

  1. 不変にすることで新しいオブジェクトの作成を減らし、変化しない場合は再利用します
  2. Flywieght パターンを使用する - 新しいオブジェクトを何度も作成する代わりに、作成されたオブジェクトを再利用し、それらのセッターを使用して作業します。 html - カラー サークルの作成に関するものです。Flyweigh を使用しないと、2.5 倍の時間がかかり、メモリ消費量は最大 200 倍になりました。それを試してみてください。
于 2012-06-16T18:33:25.443 に答える
1

あなたの問題を処理するために私が考えることができる2つの異なるアプローチがあります:

  1. GC が起動するタイミングを制御する:ガベージ コレクターを制御する方法と、メモリをクリーンアップするために使用されるさまざまなアルゴリズムを説明する完全な記事を次に示します。このアプローチは、アプリケーションが 1 分間に何千もの DTO を作成する場合に非常に役立つことがわかりました。
  2. アプリケーションが作成するオブジェクトが多すぎてすぐに破棄されない場合は、モデルを確認して効率を改善することをお勧めします。3D ビジュアライゼーションを扱う場合、重要なのはシーン グラフをどのように構築するかということです。

ちなみに、OpenGL ベースのソリューションを使用する場合、3D ビジュアライゼーションはそれほど CPU を消費しません。これは主に、CPU ではなく、シーン グラフのレンダリング時に GPU が大きく関与するという事実によるものです。

于 2012-06-16T18:30:15.183 に答える