0

私のアプリケーションは外部ハードウェアからデータを受け取り、それをパネルにプロットします(実際には「コントロール」の他の子にすることができます)。現在、ペイントは「OnPaint」コールバックで行われます。リストは、最近受信したデータを保存するために使用され、たとえばウィンドウのサイズが変更された場合に、グラフ全体をOnPaintで再描画して、比率を正しく取得できるようにします。

グラフ自体はe->Graphics、2つのデータポイント間の線を使用して要素で描画されます。

これは正常に機能していますが、50ミリ秒ごとに新しいデータが届くと(=グラフ全体を再描画すると)、グラフがすぐにちらつき始めます。ちらつきは、プロットする必要のあるデータが多いほど強くなります(コントロールの右側に到達すると、データキャッシュがクリアされるため、グラフ内のデータポイントの最大数は有限になります)。

私のコードの主要部分:

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);
}

ちらつきを取り除くために絵を最適化する方法について何か提案はありますか?前もって感謝します!

4

2 に答える 2

1

プラットフォームや言語に関係なく言えば、これは主にフレーム レートの管理と呼ばれる方法を使用して解決される一種の問題です。

ペイント メソッドを呼び出してから、ペイントにかかる時間を見積もります。これで、ステップ中に費やされた時間と、更新間隔の長さがわかりました。この場合は 40 ミリ秒です。(intervals - timespent) ミリ秒間スレッドをスリープさせることができます。

ところで、それは私の最初の答えであり、私は物事を説明するのがひどいことを知っています.

于 2012-04-09T00:01:34.510 に答える
1

ちらつきは、Paint ハンドラーを呼び出す前に WinForms が背景を消去することから発生します。

Panel から継承する独自のカスタム コントロールを記述し、OnPaintBackground何もしないようにオーバーライドする必要があります (特に、基本クラス バージョンを呼び出さないでください)。

于 2012-04-09T00:15:48.840 に答える