我是使用 wxWidgets 的新手,我希望做一个连续的实时绘图。我对可用于 wxWidgets 的实时(连续)绘图工具进行了一些研究。我最感兴趣的是使用mxMathPlot进行绘图,并支持mpFXYVector输入点。(我也知道有 Numerix 库,但似乎没有太多文档)
但是,我想每秒进行大约100 次更新?或一秒钟内获得 100 个新积分。
使用带有 mpFXYVector 的 mxMathPlot 是否可行,或者这种方法是否太慢?
还是应该考虑 OpenGL?
使用 wxMathPlot 显示以 100 Hz 更新的实时数据图是可行的。
以下是使用三个 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 框架可以轻松维护,并且数据采集发生在更高的频率在另一个线程或进程中的频率。图形显示代码每秒十次复制同时获取的数据并更新显示。