9

私の質問は、JFrame で直接描画する場合と比較して、JPanel で描画する場合、同じスイング カスタム ペインティング ルーチンが約 16 倍高速なのはなぜですか? ダブルバッファリングだけですか?ありえないですよね?

背景: JFrame が非表示になっている場合 (特に部分的にのみ非表示になっている場合)、カスタム ペインティングが更新されないという問題がありました。SO を検索した後、JPanel のサブクラスをブラディ NetBeans フォーム デザイナー フォームに接続する方法を見つけ出すことにしました。

同じ状況にある人のために: NetBeans では、たまたま JPanel を拡張する新しい標準クラス (JPanel フォームではない) を作成し、そこにすべてを手動でコーディングする必要があります (古き良き時代のような GUI デザイナーは必要ありません)。はぁ)。次に、標準の JPanel をフォームに追加し、サイズを設定します。次に、右クリックして「コードのカスタマイズ」を選択し、コンボボックスで「カスタム作成」を選択します...ここで、新しい javax.swing.JPanel を作成し、そのサブクラスを置き換えます。

だから...これにより、フォームに直接ではなく、「適切に実行」してコンポーネントにペイントすることができました。また、パネルのキーリスナーは、フレームのキーイベントディスパッチャーをハイジャックするよりもはるかに優れたソリューションです。

とにかく、プロファイラーは、JPanel の paintComponent() で JFrame の paint() を並置した場合とまったく同じカスタム ペイント コードがほぼ 16 倍高速に実行されることを示しています。

前もって感謝します。キース。


編集:この質問は、MISINTERPRETED METRICS に基づいています。プロファイラーは JPanel の paintComponent() メソッドを AWT-EventQueue スレッドに含めたり報告したりしませんが、私のベースライン プロファイルには JFrame の paint() メソッドが含まれています。ばかげた質問をする前に、もっと注意深く見るべきでした。私の悪い。

4

2 に答える 2

1

JFrame は aw.Frame を拡張する最上位のコンテナであり、描画のためにネイティブ リソースを必要としますが、JPanel は UI スレッド自体によってレンダリングされるスイング コンポーネントです。

于 2013-10-10T10:02:39.120 に答える
0

「Swing は描画に Java2D API を使用します。この Java SE 7 トラブルシューティング ガイドによると、Java2D は一連のレンダリング パイプラインを使用します。これは、プリミティブをレンダリングするさまざまな方法として大まかに定義できます」。より具体的には、Java2D レンダリング パイプラインはクロスプラットフォームの Java コードを、ハードウェア アクセラレーションをサポートするネイティブ グラフィック ライブラリ (OpenGL、X11、D3D、DirectDraw、GDI) に接続します。

Java 1.6.0_10 (別名 6u10) では、Swing および Java2D アプリケーション (デフォルトで有効) でのレンダリング パフォーマンスを向上させるために、Direct3D に基づく「完全にハードウェア アクセラレーションされたグラフィックス パイプライン」が Windows 用の Java2D に追加されました。

デフォルトでは、Windows システムで Java2D が使用される場合、この Direct3D パイプラインと DirectDraw/GDI パイプラインの両方がデフォルトで有効になります (それぞれ異なる目的で使用されていると思います)。

続きを読む: Swing アプリケーションの起動時に JFrame コンストラクターの最初の呼び出しに時間がかかる (java.awt.Window() が原因で)

于 2013-08-20T13:28:50.703 に答える