由于本机功能支持,wxWidgets是否更适合绘制波形而不是qt?

时间:2016-12-05 21:34:32

标签: c++ qt wxwidgets

我只是想知道,wxWidget是否比qt更快地满足我的特殊需求

简单的事情。我想像Audacity一样快速绘制波形。我在Audacity中尝试了相同的方法,但是我的表演只接近Audacity,但仍然没有Audacity那么快。

我的想法是,对于使用令人难以置信的性能/反馈的位图绘制,Qt不是最理想的。 来自Audacity文档:

  

屏幕更新使用直接绘图和间接绘画的混合   事件。更新图形显示的“正常”方式是调用   某些内容使屏幕无效时的Refresh()方法。后来了   系统调用OnPaint(),应用程序覆盖(重新)绘制   屏幕。在wxWidgets中,您也可以直接绘制到屏幕上   调用Refresh()而不等待调用OnPaint()。

所以参考这个,我可以用Qt画出“更直接”的wxwidget,如果是这样的话真的更快? (我没有发现用Qt“直接”绘制到帧缓冲区的任何可能性

更新: 因为有人要求我提供我的绘图代码(使用qwt和自己的QwtPlotIntervalCurve实现。在这种状态下没有缓存/位图使用;随意建议优化;每个缩放阶段最多只能绘制1024个点)。此代码用于最小值/最大值和RMS值。

void WaveformWidget::QwtPlotIntervalCurveFast::drawTube(QPainter * painter, const QwtScaleMap & xMap, const QwtScaleMap & yMap, const QRectF & canvasRect, int from, int to) const
{
  painter->save(); //Not best performance but for some people it suits.
  painter->setPen(this->pen()); //Feel free to use it.
  std::vector<QwtIntervalSample> draw = getToDrawData(xMap, yMap);
  double x, y1, y2;
  std::vector<QLine> lines(draw.size());
  for (int i = 0; i < draw.size(); i++) {
      x = xMap.transform(draw[i].value);
      y1 = yMap.transform(draw[i].interval.minValue());
      y2 = yMap.transform(draw[i].interval.maxValue());
      lines[i] = (QLine(x, y1, x, y2));
  }
  painter->drawLines(lines.data(), lines.size());
  painter->restore();
}

更新2: 现在分析附件:)

抱歉它是德语。

CPU usage during resize of waveform (those tiny peaks)

更新3: 这就是这些东西的样子。这是一个没有任何噪音的罪恶波。在绘制真实信号之前,只需要1到2个缩放阶段(如果你可以请尝试给我一个反馈,看看它对你来说是什么样的。那会很好,花太多时间在“如何快速绘制波形和大”)。是的Audacity会使rms值大于max / min值。我稍后会补充一下。

enter image description here

绘制曲线是否会导致曲线性能提升很多?

更新

我在“调整波形小部件的大小”期间将我的应用程序的处理器使用情况与大胆进行了比较。在调整窗口小部件大小期间,Audacity至少比我的应用程序节省10%的处理器时间。在此类操作期间,大胆的总体使用率是我的计算机占20%(我的30%)。

1 个答案:

答案 0 :(得分:0)

很糟糕我只能回答Windows系统的这个问题。

我遇到wxWidgets在这种情况下比qt更快。

我认为这导致绘画可以独立于绘画事件应用,并且绘画直接在屏幕上完成。此外,如果需要双缓冲,wxWidgets可以使用特定于操作系统的加速(例如本机位图)。

相比之下,Qt使用双缓冲(目前为止我知道)在Windows系统上无法禁用(但在Linux系统上它可以禁用)。

因为这个问题只针对Windows系统回答,所以我不接受。

PS: 如果有人可以为Linux系统进行一些测试,请做或者联系我,我会提供代码。