【问题标题】:OpenGL vs. wxMathPlot for real time plotting in wxWidgets?OpenGL 与 wxMathPlot 在 wxWidgets 中的实时绘图?
【发布时间】:2013-03-01 16:09:40
【问题描述】:

我是使用 wxWidgets 的新手,我希望做一个连续的实时绘图。我对可用于 wxWidgets 的实时(连续)绘图工具进行了一些研究。 我最感兴趣的是使用 mxMathPlot 进行绘图,并支持 mpFXYVector 输入点。 (我也知道有 Numerix 库,但似乎没有太多关于它的文档)

但是,我想每秒更新 100 次?或 100 个新点即将到来。

使用带有 mpFXYVector 的 mxMathPlot 是否可行,或者这种方法是否太慢?

还是应该考虑 OpenGL?

【问题讨论】:

  • 您的显示器最好也至少达到 100Hz!

标签: real-time wxwidgets


【解决方案1】:

使用 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 Hz。

这有关系吗?

恕我直言,它没有。人眼无法欣赏以 100Hz 更新的图形。重要的是,图表显示的是在 100Hz 下采集的数据,没有任何损失或滞后,但图表显示不需要如此频繁地更新。

因此,在生成此答案顶部屏幕截图的应用程序和我开发的其他类似应用程序中,图表以 10Hz 更新,wxWidgets 框架可以轻松维护,数据采集发生在在另一个线程或进程中的频率要高得多。图形显示代码每秒十次复制同时获取的数据并更新显示。

【讨论】:

  • 太棒了!我实际上看到了你的一些帖子,我想给你发消息问这个问题,所以我很高兴你回复了。您使用 MPFXYVector 来帮助输入数据,对吧?
  • 好的,太好了。非常感谢!我会开始深入研究它。只是想确保我在做这件事之前做出了正确的决定。
  • 嘿 ravenspoint,只需快速跟进以确保我走在正确的道路上。我已经设置了一种方法,可以一次将一个点添加到 mpFXYvector 类中。我正在尝试通过输入点数来测试它。到目前为止,我所做的只是在 OnInit 中实现一个 while 循环(我也尝试覆盖 MainLoop),它增加 x,y 点并将它们添加到 mpFXYVector,然后在 plot 上调用 Fit(),但是,当我启动时,应用程序只是冻结。不知道有没有更好的测试方法?或者因为我对 wxWidgets 不熟悉,所以我完全错了。
  • 我很抱歉,我想我一定是解释错了。我确实创建了一个 wxFrame,并在其中放置了一个 wxPanel,其中有一个绘图。我遵循了 mathplot 中的一个示例。我试图绘制一个简单的正弦函数,它工作得很好。然而,它是一个静态图。我无法弄清楚在哪里输入连续点?这更有意义吗?很抱歉我说错了。
  • 好的,听起来不错。添加了基本代码框架来回答,展示了第一次通过的解决方案。
猜你喜欢
  • 2010-11-02
  • 2023-04-06
  • 2020-12-29
  • 2010-12-27
  • 1970-01-01
  • 2010-09-06
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多