0

私はたくさんのものを描くパネルを持っています。描画を効率的にするために、何かが起こるたびにすべてを描画する必要がないように、BufferedImage を使用しています。

私の paintComponent は「if」ステートメントのみを必要とします:

if(!extraOnly) //paint something

paint something

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

状態パターンを使用するというアイデアは気に入っていますが、それを使用する適切なタイミングがわかりません。私は、extraOnly にブール値を設定しなければならないという考えが好きではありません。また、パターン フィーバーも発生している可能性があります :)。各状態には draw(Graphics g) という 1 つのメソッドしかありません。

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

4

3 に答える 3

1

ビューに状態があることに問題はありません。ただし、これは明らかにモデルと同じ状態ではありません。

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

于 2009-05-02T09:31:31.633 に答える
0

それぞれ az レベルとダーティ フラグを持つドローアブルのリストはどうですか? ペイントは次のようになります。

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

オーバーラップするオブジェクトをダーティにすることを検討する必要がありますが、一般に、このアプローチは実装が非常に簡単です。

編集:うーん、それほど単純ではありません。オブジェクトを移動する場合は、その下のサーフェスを再ペイントする必要があります。背景要素と前景要素が明確に区別されている場合は、それらを別の画像バッファーに描画することをお勧めします。これにより、背景を再レンダリングせずにすばやく再描画できます。

于 2009-05-02T09:28:05.887 に答える
0

一般的なより大きな問題は、効率的な塗装を行う方法のようです。

部分的なペイントは、描画が遅い場合にパフォーマンスを向上させる良い方法です。

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

1 つのアプローチは、「ダーティ レクタングル トラッキング」を使用することです。これは非常に広く使われているもので、「無効化」(再描画が必要な領域) と「検証」(ダーティ ビットを描画する行為) という用語があります。ウィンドウ システムはほぼ確実にこれを既に行っているため、Java Swing RepaintManager がダーティ リージョンの境界矩形を保持するなど、これをピギーバックできる可能性があります。

ただし、自分で簡単に転がすことができます。次のペイントで更新される領域を表すメンバー変数 (「領域」、ベクトル内の単に四角形のリスト、または境界四角形) を持つことができます。コンストラクターまたはサイズが変更されたハンドラーで、これを領域全体に初期化します。パネルの一部を再描画したいときはいつでも、四角形をダーティ領域に追加してその部分を無効にします。ペイントするときは、汚れた領域のパーツのみを描画し、汚れた領域をクリアします。この方法での部分的な描画は、たとえば、バッファリングされた画像を仲介としてうまく機能します。簡単!

于 2009-05-02T09:38:04.660 に答える