34

Java 2D ゲームを作成中です。私は組み込みの Java 2D 描画ライブラリを使用して、JFrame の Canvas の BufferStrategy から取得した Graphics2D に描画しています (これは時々フルスクリーン表示されます)。BufferStrategy はダブル バッファリングされます。再描画は、タイマーを介して積極的に行われます。ただし、特に Linux では、いくつかのパフォーマンスの問題があります。

Java2D には、グラフィックス バッファを作成し、グラフィックスを描画する方法が非常に多くあるため、自分が正しいことを行っているかどうかわかりません。私は、有望に見えるgraphics2d.getDeviceConfiguration().createCompatibleVolatileImageを試してきましたが、描画コードをそれに切り替えればもっと速くなるという本当の証拠はありません。

あなたの経験では、Java 1.5+ で 2D グラフィックスを画面にレンダリングする最速の方法は何ですか? ゲームはかなり先のことなので、OpenGL やゲーム エンジンなど、まったく別の描画方法に切り替えたくありません。私は基本的に、Graphics2D オブジェクトを使用して画面に描画する最速の方法を知りたいと思っています。

4

9 に答える 9

34

この投稿への回答、Consty'sへの回答、および私自身の調査の統合:

機能するもの:

  • GraphicsConfiguration.createCompatibleImage描いているものと互換性のある画像を作成するために使用します。これは絶対に必要です!
  • 経由でダブルバッファ描画を使用しCanvas.createBufferStrategyます。
  • 可能な場合は使用-Dsun.java2d.opengl=Trueして、描画を高速化します。
  • スケーリングに変換を使用しないでください。代わりに、使用するイメージのスケーリングされたバージョンをキャッシュします。
  • 半透明の画像は避けてください。ビットマスクされた画像は問題ありませんが、Java2D では透過性が非常に高くつきます。

私のテストでは、これらの方法を使用して、10 倍から 15 倍の速度向上が得られ、適切な Java 2D グラフィックスが可能になりました。

于 2008-10-14T09:23:12.837 に答える
16

私はあなたと同じ問題を抱えていると思います。ここで私の投稿をチェックしてください:

Java2D のパフォーマンスの問題

パフォーマンス低下の理由とその修正方法を示します。ただし、すべてのプラットフォームでうまく機能することは保証されていません。その理由は投稿でわかります。

于 2008-10-13T07:23:08.977 に答える
12

ここに私の頭の上からいくつかのヒントがあります。あなたがより具体的で、あなたが何をしようとしていたかを教えていただければ、私はより多くのことを助けることができるかもしれません. ゲームのように聞こえますが、推測したくありません。

必要なものだけを描く!いつもやみくもに repaint() を呼び出さないでください。repaint(Rect) や repaint(x,y,w,h) などの兄弟を試してみてください。

画像/プリミティブをブレンドするにはコストがかかる操作になる可能性があるため、アルファブレンディングには十分注意してください。

可能な限りプリレンダリング / キャッシュするようにしてください。同じ方法で何度も円を描いている場合は、BufferedImage に描画してから、BufferedImage だけを描画することを検討してください。速度のためにメモリを犠牲にしています (ゲーム/高パフォーマンス グラフィックスの典型)

OpenGL の使用を検討し、LWJGL の JOGL を使用します。JOGL はより Java に似ていますが、LWJGL は OpenGL アクセスに加えてより多くのゲーム機能を提供します。OpenGL は、(適切なハードウェアとドライバーを使用して) Swing よりも桁違いに描画できます。

于 2008-10-01T11:50:38.310 に答える
1

Javaを使用していくつかの基本的な描画アプリケーションを実行しました。グラフィックを多用する作業は行っていませんが、すべての「再描画」呼び出しを適切に処理することをお勧めします。親コンテナに対する追加の再ペイント呼び出しは、レンダリングの量を2倍にする可能性があります。

于 2008-09-29T12:50:44.563 に答える
1

誰かがあなたに私のよりも良い答えを提供してくれることを期待して、私はこの質問を見てきました.

その間、jdk 1.4 のベータ版リリース後に書かれた次のSun ホワイト ペーパーを見つけました。ランタイム フラグ (記事の下部) など、微調整に関する興味深い推奨事項がいくつかあります。

" Solaris および Linux のランタイム フラグ

SDK のベータ 3 リリース、バージョン 1.4 以降、Java 2D は、ローカルまたはリモート表示環境で作業しているかどうかにかかわらず、DGA が使用できない場合、デフォルトで画像をピックスマップに保存します。pmoffscreen フラグを使用して、この動作をオーバーライドできます。

-Dsun.java2d.pmoffscreen=true/false

このフラグを true に設定すると、DGA が使用可能であっても、オフスクリーン ピックスマップ サポートが有効になります。このフラグを false に設定すると、オフスクリーン ピックスマップのサポートが無効になります。オフスクリーン ピックスマップ サポートを無効にすると、一部のレンダリングの問題を解決できます。"

于 2008-09-30T14:28:58.687 に答える
0

純粋なJava2Dを使用したくない場合の代替手段は、GTGEやJGameなどのゲームライブラリを使用して(Googleで検索)、グラフィックスに簡単にアクセスできるようにし、ダブルバッファリングとはるかに単純な描画コマンドを提供することです。

于 2008-11-17T05:22:21.263 に答える
0

必ずダブルバッファリングを使用してください。最初にメモリ内の1つの大きなバッファに描画し、すべての描画が完了したら画面にフラッシュします。

于 2008-09-29T12:37:30.650 に答える
0

覚えておく必要があることがいくつかあります

1)このリンクを更新すると、再描画を呼び出すための適切なオプションである可能性のあるスイングタイマーの使用方法が示されます。再描画を理解する (以前の投稿者が言ったように重要なので、あまり作業をしません)。

2) 1 つのスレッドでのみ描画を行っていることを確認します。複数のスレッドから UI を更新すると、厄介な問題が発生する可能性があります。

3) ダブルバッファリング。これにより、レンダリングがよりスムーズになります。 このサイトには他にも役立つ情報があります

于 2008-09-29T13:17:21.800 に答える