ダブル バッファリング テクノロジを使用して、winform フォーム コントロールのフリーズを解決します (dataGridView のデータのロードが遅い)。

1. 背景

C/S プロジェクトで作業している場合、完成したフォームのページ読み込み制御が遅く、フォームを拡大または縮小した後、フォームの読み込みが停止し、データのレンダリングが遅くなります。

2 番目に、ダブル バッファリング テクノロジを使用してこの問題を解決できます。では、ダブルバッファリングとは何でしょうか?

Baidu の紹介: 私たちがテレビを見るときに見ている画面は OSD レイヤーと呼ばれ、OSD レイヤーに表示されている場合にのみ画像を見ることができます。次に、描画 (点や線の描画など) を描画できる、非表示の仮想 OSD レイヤーを作成する必要があります。これをオフスクリーン (バック バッファー) と呼びます。このオフスクリーンはメモリ内に存在します。私たちはその上に絵を描きます。このオフスクリーン上にあるものは OSD レイヤーに表示できます。このオフスクリーンを作成し、ハンドル (整数ポインター)、幅、高さ、および新しいオブジェクトへのポインターを返す関数が必要です。このオフスクリーンのオフスクリーンデータ バッファへのポインタ このバッファは関数の外部で作成されたオフスクリーン データ バッファです。サイズは、オフスクリーンの高さ * 幅 * 各ピクセル データのサイズです。ちらつきは、グラフィックス プログラミングにおける一般的な問題です。複数の複雑な描画操作を必要とするグラフィックス操作では、レンダリングされたイメージがちらついたり、許容できない外観になったりする可能性があります。ダブルバッファリングを使用すると、これらの問題が解決されます。ダブル バッファリングはメモリ バッファを使用して、複数の描画操作によって引き起こされるちらつきの問題を解決します。ダブル バッファリングが有効な場合、すべての描画操作は、画面上の描画面ではなく、まずメモリ バッファーにレンダリングされます。すべての描画操作が完了すると、メモリ バッファが関連する描画面に直接コピーされます。画面上でグラフィック操作が 1 回だけ行われるため、複雑な描画操作による画像のちらつきが発生しません。

要約すると: コンピュータでは、アニメーションは、フレームごとの動的な画像で構成される、変化する画像シーケンスと見なされます。これらの画像は時間とともに変化します。画像の後のフレームは、画像の前のフレームを修正したものです。

シングルバッファアニメーションでは、グラフィックスは表示バッファに直接描画されますが、次のフレームの画像が表示されると画面を消去する必要があるため、制作プロセス中に画面を消去し続ける必要があります。ちらつき(フォームの読み込みが遅い)。ダブル バッファ アニメーションには 2 つのバッファがあります。表示バッファに加えてメモリ バッファもあります。制作プロセス中、グラフィックスは最初にメモリ バッファに描画され、次にメモリ バッファ内の画像がメモリ キャッシュにコピーされます。領域では、表示バッファはメモリ バッファの単なるイメージです。

例:

プロジェクターとホワイトボード。ただし、バッファ アニメーション: ホワイトボードを使用するときに、ホワイトボードがいっぱいでページを書き込む必要がある場合、ホワイトボード上のコンテンツを消去してからコンテンツを書き込むことしかできません。ダブルバッファアニメーション: プロジェクターを使用する場合、コンテンツを変更する必要がありますが、消去操作を避けるためにプロジェクター内のコンテンツを変更するだけで済みます。

3. 具体的な方法(コード表示)

1. C# winform フォームがスタックする場合の解決策

ページラグを引き起こすにはどのフォームを変更する必要がありますか? このメソッドを追加します

 protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;

                cp.ExStyle |= 0x02000000;

                return cp;
            }
           
        }

この方法では、ページ上のすべてのコントロールの読み込みが遅いという問題を解決できます。

上記のコードでは、CreateParams クラスが使用されており、特に画面の遅れや飛び散りの問題を解決します。次の情報を参照してください: CreateParams はフォームとコントロールのプロパティであり、これを使用すると、境界線、最大化、最小化、閉じる、ボタンの非表示、フォームのモーダライズ、ポップアップ モードなどのフォームまたはコントロールの一部の機能を簡単に制御できます。

2. 次に、次の方法を使用して、dataGridView でのデータの読み込みが遅くてスムーズでないという問題を解決することもできます。根本的な原因は、ダブル バッファリング テクノロジの使用にもあります。

DataGridView でのデータの読み込みの遅延を制御するには、フォームの対応するコンストラクターに次のコードを記述する必要があります。

this.SetStyle(ControlStyles.OptimizedDoubleBuffer //双缓冲
                | ControlStyles.ResizeRedraw 
               | ControlStyles.AllPaintingInWmPaint, //不擦除背景,减少闪烁
                true);
            this.UpdateStyles();

            //利用反射设置DataGridView的双缓冲
            Type dgvType = this.dgvwCustomerManagement.GetType();
            PropertyInfo pi = dgvType.GetProperty("DoubleBuffered",
               BindingFlags.Instance | BindingFlags.NonPublic);
            pi.SetValue(this.dgvwCustomerManagement, true, null);
          

4. まとめ

ダブルバッファリング技術は、2つのバッファを使用して画像のちらつきを軽減し、描画効率を向上させるグラフィカルインターフェイス描画の最適化技術です。ダブルバッファリングテクノロジーの概要は次のとおりです。

1. 原理: ダブルバッファリング技術は、画像の描画用と表示用の 2 つのバッファを使用します。画像はバックバッファに描画され、完了後に画像全体が一度にフロントバッファに描画されるため、画像のちらつきを回避できます。

2. 利点: ダブル バッファリング テクノロジーを使用すると、描画効率とグラフィカル インターフェイスのユーザー エクスペリエンスを向上させることができます。描画操作はバックグラウンドで行われるため、ユーザーは描画プロセスを要素ごとに見るのではなく、完全なイメージを確認できます。これにより、画像のちらつきが軽減され、ユーザーによるインターフェイスの認識が向上します。

3.実装方法:ダブルバッファリング技術の実装には、さまざまなプログラミング言語とグラフィックスライブラリを使用できます。一般的なアプローチは、ダブル バッファー描画オブジェクトを使用し、描画操作をバック バッファーに指示してから、バック バッファー全体をフロント バッファーに描画することです。

4. アプリケーション シナリオ: ダブル バッファリング テクノロジは、グラフィック エディター、ゲーム インターフェイスなどのグラフィカル インターフェイスの頻繁な描画が必要なシナリオに適しています。このようなシナリオでは、ダブル バッファリングを使用すると、描画効率とユーザー エクスペリエンスが向上し、画像のちらつきが軽減されます。

5. 注: ダブル バッファリング テクノロジを使用する場合は、メモリ消費とパフォーマンスのオーバーヘッドに注意する必要があります。バッファを 2 つ使用するため、メモリ使用量が増加する可能性があります。同時に、各描画ではバック バッファ全体をフロント バッファに描画する必要があるため、描画時間と CPU オーバーヘッドが増加する可能性があります。

ダブルバッファリング技術とは、簡単に言うと、2つのバッファを使用して画像のちらつきを軽減し、描画効率を向上させるグラフィカルインターフェース描画の最適化技術です。ダブル バッファリング テクノロジを使用すると、特にグラフィカル インターフェイスを頻繁に描画する必要があるシナリオで、ユーザー エクスペリエンスが向上します。ただし、ダブル バッファリング テクノロジを使用する場合は、メモリ消費とパフォーマンスのオーバーヘッドに注意する必要があります。

おすすめ

転載: blog.csdn.net/weixin_45309155/article/details/129503221