ビットマップを使用する独自のユーザー コントロールには 2 つの問題があります。
- .NET の「Refresh」メソッドで再描画するとちらつきます。
- 性能が悪いです。
コントロールは、次の 3 つのビットマップで構成されます。
- 静的背景画像。
- 回転するローター。
- ローターの角度によって別のイメージ。
使用されるすべてのビットマップの解像度は 500x500 ピクセルです。コントロールは次のように機能します: https://www.dropbox.com/s/t92gucestwdkx8z/StatorAndRotor.gif (gif アニメーションです)
ユーザー コントロールは、新しいローター角度を取得するたびに自分自身を描画する必要があります。したがって、次のようなパブリック プロパティ 'RotorAngle' があります。
public double RotorAngle
{
get { return mRotorAngle; }
set
{
mRotorAngle = value;
Refresh();
}
}
Refresh
イベントを発生させPaint
ます。イベント ハンドラは次のOnPaint
ようになります。
private void StatorAndRotor2_Paint(object sender, PaintEventArgs e)
{
// Draw the three bitmaps using a rotation matrix to rotate the rotor bitmap.
Draw((float)mRotorAngle);
}
しかし、このコードを使用すると (他の独自のユーザー コントロールでうまく機能します)、コントロールが を介してダブル バッファリングされている場合、ユーザー コントロールはまったく描画されませんSetStyle(ControlStyles.OptimizedDoubleBuffer, true)
。このフラグを true に設定しないと、再描画時にコントロールがちらつきます。
コントロールコンストラクターで設定しました:
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.ContainerControl, false);
// User control is not drawn if "OptimizedDoubleBuffer" is true.
// SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
まず、コントロールが描画されるたびに背景がクリアされるため、ちらつくと思いました。したがって、設定しSetStyle(ControlStyles.AllPaintingInWmPaint, true)
ました。しかし、それは役に立ちませんでした。
では、なぜちらつくのでしょうか。他のコントロールは、このセットアップで非常にうまく機能します。そして、なぜコントロールが描画されないのですかSetStyle(ControlStyles.OptimizedDoubleBuffer, true)
?
Draw
プロパティを変更した直後にメソッドを呼び出すと、コントロールがちらつかないことがわかりましたRotorAngle
。
public float RotorAngle
{
get { return mRotorAngle; }
set
{
mRotorAngle = value;
Draw(mRotorAngle);
}
}
しかし、これは特に全画面モードで非常に悪いパフォーマンスをもたらします。コントロールを 20 ミリ秒ごとに更新することはできません。自分で試すことができます。完全な Visual Studio 2008 ソリューションを以下に添付します。
では、なぜこんなにパフォーマンスが悪いのでしょうか。他の (自分の) コントロールを 20 ミリ秒ごとに更新しても問題ありません。それは本当にビットマップのせいですか?
2 つの問題を示すために、簡単なビジュアル Visual Studio 2008 ソリューションを作成しまし た。
ディレクトリ に実行可能ファイルがありますbin\Debug
。
ご協力いただきありがとうございます。