35

編集:リアルタイム描画を行うために、openglとopenclの間の「相互運用性」でjmonkeyengineとjoclのベースであるlwjglの使用を開始し、100k個の粒子をリアルタイムで計算して描画できるようになりました。たぶん、jmonkeyエンジンのマントルバージョンは、このドローコールオーバーヘッドの問題を解決することができます。

数日間、Eclipse(java 64ビット)でjMonkeyエンジン(ver:3.0)を学び、GeometryBatchFactory.optimize(rootNode);コマンドを使用してシーンを最適化する方法を試してきました。

最適化なし(球の位置を変更する機能あり):

ここに画像の説明を入力してください

さて、1fpsのみがpci-express帯域幅とjvmオーバーヘッドの両方から発生します。

最適化あり(球の位置を変更する機能なし):

ここに画像の説明を入力してください

三角数を増やしても29fpsになりました。

Java3DにはsetCapability()、最適化された形式でもシーンオブジェクトを読み書きできるようにするメソッドがありました。jMonkey engine 3.0はこの主題に対応している必要がありますが、その痕跡は見つかりませんでした(チュートリアルと例を検索しましたが、失敗しました)。

質問: jMonkey 3.0でシーンread/write position/rotation/scaleのノードの機能を設定するにはどうすればよいですか?optimized最初の質問に答えられない場合、最適化コマンドを使用すると三角数が増える理由を教えてください。グラフィックカードにアクセスして変数を自分で変更するための新しいメソッドを作成する必要がありますか(joglかもしれませんか?)?

シーン情報:16kパーティクル(16x16解像度の球)+ 1ポイントライト(およびその4096の解像度のシャドウ)。

pci-expressを介して、ミリ秒で数千のフロート番号を簡単に送信できると確信しています。

  • 追加情報:10ミリ秒かかる粒子位置を更新するためにAparapi-kernelsを使用しています(力を計算するために16k * 16kの相互作用)(最適化モードでは何も変更されません:()aparapiはそれらの最適化されたデータにアクセスできますか?

最適化の場合、batchNode.batch();オブジェクト番号を減らした1fpsを次に示します。

ここに画像の説明を入力してください

オブジェクト数は数百になりましたが、fpsはまだ1です!

球の位置だけをgpuに送信し、頂点の位置を計算させる方が、cpuで頂点を計算し、さらに巨大なデータをgpuに送信するよりも優れている可能性があります。

誰も助けてくれませんか?すでにbatchNodeを試しましたが、十分に役立ちませんでした。

jMonkeyの人々はすでに車輪の再発明を行っており、現在の状況に満足しているため、3DAPIを変更したくありません。もう少しパフォーマンスを絞り込もうとすると(シャドウをキャンセルすると100%の速度が得られますが、品質も重要です!)。

このJavaプログラムは、LOD(数百万の粒子)を使用したマーチングキューブアルゴリズムを備えた小惑星衝突シーンシミュレーター(小惑星のサイズ、質量、速度、角度の選択があります)になります。

マーチングキューブアルゴリズムは、三角数を大幅に減らします。質問に答えられなかった場合は、Java用のマーチングキューブ(またはO(n)凸包)アルゴリズムが受け入れられます!データ:ソースとしてのx、y、z配列、およびターゲットとしての三角ストリップ配列(等値面メッシュポイント)

ありがとう。

ストリームに関するいくつかのサンプルを次に示します(はるかに低い解像度)。

1)重力による立方体の岩のグループの崩壊: ここに画像の説明を入力してください

2)排除力が現れ始めます: ここに画像の説明を入力してください

3)排除力+重力により、グループはより滑らかな形状になります。 ここに画像の説明を入力してください

4)グループは球を形成します(予想通り): ここに画像の説明を入力してください

5)次に、大きな恒星の体が近づきます: ここに画像の説明を入力してください

6)触れようとしています: ここに画像の説明を入力してください

7)衝撃の瞬間: ここに画像の説明を入力してください

Barnes-Huttアルゴリズムと切り捨てられたポテンシャルの助けを借りて、粒子数は10倍(おそらく100倍)多くなります。

マーチングキューブアルゴリズムではなく、nbodyを包むゴーストクロスは、低解像度の船体を与えることができます(BHよりも簡単ですが、より多くの計算が必要です)

ゴーストクロスはnbody(重力+除外)の影響を受けますが、nbodyはそれを包む布の影響を受けません。Nbodyはレンダリングされませんが、クロスメッシュはより少ない三角形の数でレンダリングされます。

ここに画像の説明を入力してください ここに画像の説明を入力してください

MC以上が機能する場合、これにより、プログラムは約200倍多くのパーティクルの包装布をレンダリングできます。

4

2 に答える 2

4

JMonkeyEngine wikiには、参照している変換を利用する方法についてかなり詳しく説明しているかなり堅実なドキュメントのセットがあります。これは、AdvancedSpatialConceptsにあります。

さらに、ここで表示できるメッシュとそのレンダリングに関するかなりの情報があります:ポリゴンメッシュ

于 2012-11-21T22:13:08.843 に答える
4

すみません...

静的なままのシーン(またはサブノード)内のすべてのジオメトリをバッチ処理できます。

バッチ処理とは、同じマテリアルを持つすべてのジオメトリが1つのメッシュに結合されることを意味します。この最適化は、使用するマテリアルの総数が少ない(約32まで)場合にのみ効果があります。見返りは、ゲームが初期化されるときにバッチ処理に余分な時間がかかることです

したがって、三角形の変更は、すべてが1つのメッシュに組み立てられているためです。これが必要な場合の唯一の提案は、メッシュを取得してポイントを変更することですが、その時点では、検出。

おそらく、別の最適化方法を試してください。

幸運を祈ります。JMonkeyを少し使用していませんが、他の人が使用し、その継続的な成長を見ることができてうれしいです。

編集

ところで、数学を最小化する方法は、立方体の半分の球を使用することかもしれません、地球への影響はおそらく反対側に影響を与えません(球が地球ではなく、すでに地球の小さなサンプルが球)..。

おそらく、インパクトサーフェスとして2Dシェイプを試してみてください。これは最善の選択ではないことはわかっていますが、シェイプの数がどのように影響し、どれほど壮大であるかがわかる場合があります。もしそうなら、あなたが心配する必要がなければ、道はいくつかの粒子を取り除く方法を検討することかもしれません。私はそれがそうなるとほぼ確信しています。

ついに:

おそらくリアルタイムでレンダリングしませんか?フレームをバッファに描画してから再生するのに1分かかります。再生するまでに、さらに40程度のフレームなどがあります。必要なのは、約30秒の価値だけです。

于 2012-11-21T19:01:26.273 に答える