2013-08-16 24 views
8

私の質問は、JFrameで直接描画した場合と比べてJPanelで描画すると、同じスイングカスタム描画ルーチンがほぼ16倍高速になるのはなぜですか?ダブルバッファリングですか?確かにできない?JFrameで描画するのがJPanelよりもずっと遅いのはなぜですか?

背景:JFrameが保護されていない(特に部分的にしか見えない)ときに、カスタムペイントがリフレッシュされないという問題がありました。 SOを検索した後、私はJPanelのサブクラスをbluddy-NetBeans-form-designerフォームに配線する方法を決定しました。

同じ状況の人:NetBeansでは、ちょうどJPanelを拡張する新しい標準クラス(JPanelフォームではない)を作成し、そこにあるすべてのコードを手作業でコーディングする必要があります(GUIデザイナーなし、オレ日、一息)。次に、標準のJPanelをフォームに追加し、サイズを設定します。右クリックして "コードのカスタマイズ"を選択し、コンボボックスで "カスタム作成"を選択します。ここで新しいjavax.swing.JPanelが作成され、そのサブクラスが置換されます。

だから、フォームに直接ではなく、コンポーネントを適切に操作してペイントすることができました。また、パネルのキーリスナーは、フレームキーイベントディスパッチャーを差し込むよりもはるかに巧妙な解決策です。

とにかく、JPanelのpaintComponent()でappotated JFrameのpaint()と同じカスタム塗りつぶしコードがほぼ同じ速度で実行されると、誰かがなぜ説明できるのか不思議でした。

ありがとうございます。キース。


EDIT:この質問は誤解メトリックに基づいています。プロファイラは、JPanelのpaintComponent()メソッドをAWT-EventQueueスレッドにインクルード/レポートしません。ここで、ベースラインプロファイルにはJFrameのpaint()が含まれています。私は愚かな質問をする前にもっと慎重に見ていたはずです。私の悪い。

+0

プロファイラVisualVM iircは、どのメソッドがより時間をかけているかを示す必要があります。それは何が起こっているのかを見つける良いスタートになるでしょう。 –

+0

@JonathanDrapeau:そうです!プロファイルは、 "AWT-Event-Queue"スレッドの一部としてpaintComponentを報告していません(JFrameペイントの場合)。したがって、2つのソリューションがどのように報告されるかの違いです。私の悪い! – corlettk

+0

これは非常に具体的な質問です。なぜなら、AWTコンポーネントへのペインティングは子どものSwing JComponentsの方が早い(ネイティブOSからのピア)ためですが、すでに先史時代について話しています。 Nimbusで使用されている新しいGraphicsコアと、JavaFXの基本として小さな変更を加えた同じ(AFAIK) – mKorbel

答えて

0

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

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

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

読む:First call to JFrame constructor takes a long time during Swing application startup (because of java.awt.Window())

+0

申し訳ありませんが、私はDirect3DがJPanelでペイントする方法がJFrameよりもずっと速く、視覚的に高速であることを理解していないので、間違いなく自分の「悪いプロファイリング」ではありません。私は、フレームが "未加工"である間に、コンポーネントがアクセラレータパイプラインを介して塗装されていると思います。フレームが一般的に、コンポーネントが "揮発性のコンテンツ"をすべてレンダリングするための "静的な背景"を提供することを考えると、ある意味があります...私は、JFrameがJFrameが "最高の利用可能な" JComponentと矛盾しないあなたの興味に感謝します。 – corlettk

1

のJFrameがJPanelのは、UIスレッド自体によってレンダリングされるスイング構成要素であるのに対し、描画用のネイティブリソースを必要aw.Frameに延びる最上位のコンテナです。

関連する問題