1

私は wxWidgets を初めて使用し、連続リアルタイム プロットを実行しようとしています。wxWidgets で使用できるリアルタイム (連続) プロット ツールについて調査しました。ポイントをフィードするためのmpFXYVectorをサポートするプロットにmxMathPlotを使用することに最も興味があります。(Numerix Library もあるのは知っていますが、ドキュメントはあまりなかったようです)

ただし、1秒間に約100回の更新を行いたいですか? または 1 秒間に 100 個の新しいポイントが追加されます。

これは mpFXYVector で mxMathPlot を使用して実現可能なものですか、それともこのアプローチは遅すぎますか?

または、OpenGL を検討する必要がありますか?

4

1 に答える 1

2

wxMathPlot を使用して、100 Hz 更新で更新されたデータのリアルタイム グラフを表示することは可能です。

以下は、3 つの wxMathplot インスタンスを使用するアプリのスクリーンショットで、すべて 128Hz で更新されているデータを示しています

ここに画像の説明を入力

古いデータが右側に表示され、新しいデータが右側に表示されるようなリアルタイム グラフが必要であるが、表示されるデータの量が最後の 10 秒間で一定である場合、mpFXYVector は使いにくいです。これに対処する方法については、この回答を参照してください。

ただし、最初のパスでは、このフレームワークで開始する必要があります

... in Myframe constructor

vector <double> xs, ys;
mpFXYVector * data_layer
mpWindow * graph;

// initialize

...

 // Set up 100 Hz timer

...

MyFrame::OnTimer( ... )
{

// add new data point(s)

 ...

// copy data into layer

data_layer.SetData(xs,ys);

// redraw

graph->Fit();

/*  Note that at this point we have requested a redraw
 But it hasn't taken place yet
 We need to return so that the windows system can update the screen etc
 We will back in 1/100 sec to do it all again.
 */

}

では、問題は、この計画をどれだけ早く進めることができるかということです。呼び出された回数を追跡するだけのタイマー イベント ハンドラーを試してみました。

void MyFrame::OnTimer2(wxTimerEvent& )
{
    static int ticks = 0;
    ticks++;

    static clock_t start;
    if( ticks == 1 ) {
        start = clock();
    }
    if( ticks == 1000 ) {
        double duration = (double)(clock() - start) / CLOCKS_PER_SEC;
        wxMessageBox(wxString::Format("1000 ticks in %f secs\n",duration));
        myTimer->Stop();
        return;
    }

}

強力なデスクトップでこれを実行できる最速は 66 Hz です。

これは問題ですか?

私見、そうではありません。100Hz で更新されるグラフを人間の目で認識できる方法はありません。重要なことは、グラフが 100Hz で取得されたデータを損失や遅れなく表示することですが、グラフ表示をそれほど頻繁に更新する必要はありません。

したがって、この回答の上部にあるスクリーンショットを作成したアプリと、私が開発した他の同様のアプリでは、グラフは 10Hz で更新されており、wxWidgets フレームワークはこれを問題なく維持しており、データ取得ははるかに高い速度で行われています。別のスレッドまたはプロセスでの頻度。グラフ表示コードは、その間に取得したデータを 1 秒間に 10 回コピーし、表示を更新します。

于 2013-03-01T16:34:52.367 に答える