2009-05-02 18 views
0

私はたくさんのものを描くパネルを持っています。描画が効率的になるように、BufferedImageを使用しているので、何かが起こるたびにすべて描画する必要はありません。ここで状態パターンを適用する必要がありますか?

文「の場合」マイpaintComponentのみにあります

if(!extraOnly) //paint something 

paint something 

if(listener.getRectangle() != null) // Paint something 

は私が状態パターンを使用してのアイデアを好きですが、私はその右の瞬間はそれを使用することを確認していませんか?私はextraOnlyのブール値を設定しなければならないというアイデアは気に入らず、多分私の中でパターンの熱がありました:)。各状態には1つのメソッドdraw(Graphics g)しかありません。

これはMVCパターンのアプリケーションのビュー部分であるため、状態パターンを使用しているかどうかもわかりません。ビューではなくモデルの一部であるべきではないか?

+0

extraOnlyがどのようなものなのか、それが状態と関係があるのか​​は少し不明です。あなたは精緻化できますか? –

+0

最短経路発見。 extraOnlyは私のイメージの上に最短のパスを描く必要がある場合のみです。 –

答えて

1

ビューに状態があることは間違いありません。これは明らかにモデルと同じ状態ではありません。

例はウェブブラウザです。この場合のモデルはウェブページDOMであり、ブラウザビューはDOMをスクリーンプレゼンテーションにレンダリングしている。 Webページをスクロールすると、各フレームにDOMをレンダリングするのは非常に非効率的です。バッファされた状態がこれに対する解決策であることは明らかです。基本となるDOMが変更された場合にのみ、状態を更新する必要があります。

+0

答えのためのThx: 私はmvcによってここで少し混乱しています。それで、ビューの状態を変えるのはコントローラーですか? –

+0

はい、多少間接的です。コントローラタスクは、ビューがプレゼンテーションロジックを管理する必要がある間に、機能ロジックを管理することです。だからコントローラはモデルが最短経路で更新されたことをビューに伝えます。ビューはアクションを実行し、最短経路を表示することができます。 これが何らかの明確なものを作ったかどうかは分かりません... –

+0

それはありました。再びThx :) –

0

各レベルはzレベルで汚れていますか? ので、あなたの塗料はのようになります。

paint() 
{ 
    sort(drawables, by z-level) 
    foreach(drawable in drawables) 
     if (drawable.isDirty()) 
      drawable.paint() 
} 

あなたは重複したオブジェクトを汚す検討する必要がありますが、一般的に、このアプローチは、実装が非常に簡単です。

編集: hmm、あまり単純ではありません。 オブジェクトを移動する場合、オブジェクトの下のサーフェスを再描画する必要があります。 背景要素と地面要素がはっきりと区別されている場合は、それらを別の画像バッファに描画することができます。これにより、背景を再描画することなく素早く背景を再描画できます。

0

一般的な大きな質問は効率的な絵画をどのようにするかと思われますか?

パーシャルペインティングは、描画が遅い場合にパフォーマンスを改善するための良い方法です。

しかし、まず描画が遅いことを証明してください!プロファイリングで図面が問題であることが示された場合は、部分的な更新に移行できます。

1つのアプローチは、「汚れた矩形の追跡」を使用することです。これは非常に広く使用されており、用語は「無効化」(再描画が必要な領域)と「検証」(汚れたビットを描画する行為)です。ウィンドウ処理システムはこれをほぼ確実に行っているので、これをピギーバックすることができます。 Java Swing RepaintManagerは、ダーティリージョンの境界矩形を保持します。

しかし、自分で簡単にロールすることができます。次のペイントで更新される領域を表すために、メンバ変数(「領域」またはベクトルの矩形のリストまたは境界の四角形)を持つことができます。コンストラクタまたはサイズが変更されたハンドラで、これを初期化して全体の領域にします。パネルの一部を再描画したいときはいつでも、ダーティ領域に長方形を追加することでその部分を無効にします。塗装するときは、汚れた部分にのみ部品を引き出し、汚れた部分を取り除きます。このような部分描画は、例えば、中間イメージとしてバッファリングされたイメージでうまくいく。簡単!

関連する問題