我是使用wxWidgets的新手,我正在寻找一个连续的实时情节。我已经对可用于wxWidgets的实时(连续)绘图工具进行了一些研究。 我最感兴趣的是使用 mxMathPlot 进行绘图,并支持 mpFXYVector 以获取点数。 (我知道还有Numerix库,但似乎没有太多的文档)
但是,我想做 100次更新?或者在一秒钟内出现100个新点。
这是使用带有mpFXYVector的mxMathPlot可行的,还是这种方法太慢?
或者应该考虑OpenGL吗?
答案 0 :(得分:2)
使用wxMathPlot显示以100 Hz更新更新的数据的实时图表是可行的。
以下是使用三个wxMathplot实例的应用程序的屏幕截图,所有实例都显示正在以128Hz更新的数据
如果你想要那种旧数据在左边消失的实时图表,因为新数据出现在右边,但是显示的数据量在最后10秒是不变的,那么mpFXYVector很尴尬使用。有关如何处理此问题的讨论,请参阅this answer.
然而,对于第一遍,这个框架应该让你开始
... 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赫兹。
这有关系吗?
恕我直言,事实并非如此。人眼无法理解以100Hz更新的图形。重要的是图表显示了以100Hz采集的数据,没有任何损失或滞后,但图表显示不需要如此频繁地更新。因此,在本答案的顶部和我开发的其他类似应用程序中生成屏幕截图的应用程序中,图表正在以10Hz更新,wxWidgets框架在维护时没有任何问题,并且数据采集发生在另一个线程或进程中的频率要高得多。图形显示代码每秒十次,复制在此期间获取的数据并更新显示。