私のアプリケーションは外部ハードウェアからデータを受け取り、それをパネルにプロットします(実際には "コントロール"の他の子かもしれません)。ペイントは現在、 "OnPaint"コールバックで行われます。リストは最近受信したデータを格納するために使用され、OnPaint内のグラフ全体を再描画して、比率などを得ることができます。ウィンドウのサイズが変更されます。C++/CLI/Windows Formsで25 FPSでパネル上のグラフを更新するには?
グラフ自体は、2つのデータ点の間の線を使用してe->Graphics
要素で描画されます。
これはうまくいきますが、50msごとに新しいデータが到着すると(グラフ全体を再描画)、すぐにグラフがちらつき始めます。より多くのデータをプロットする必要があるほど、ちらつきが強くなります(コントロールの右側に到達すると、データキャッシュがクリアされるので、グラフには最大限のデータポイント数が存在します)。
私のコードの主要な部分:私はちらつきを取り除くために絵を最適化する方法
void Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e)
{
Size^ s = m_Control->Size;
Bitmap^ bmp = gcnew Bitmap(s->Width, s->Height);
Graphics^ g = Graphics::FromImage(bmp);
for each(double y in m_Data)
{
/* ...calculations etc... */
g->DrawLine(Pens::Blue, recentX, recentY, currentX, currentY);
}
e->Graphics->DrawImageUnscaled(bmp, 0, 0);
}
任意の提案?前もって感謝します!
フォームコンストラクターで、this-> DoubleBufferedプロパティーをtrueに設定します。簡単なピースの方法。 –
@ハンス:はい、そうではありませんが、フォームの代わりにパネルに設定すべきではありませんか?そして、既存のコードはすでにダブルバッファされています... –
パネル上の "DoubleBuffered"にアクセスしようとするとエラーが発生します。 @HansPassantそれはそれをより良くしたが、問題を解決しなかったありがとう、ありがとう。 – Niko