C++ 由于本机函数支持,wxWidgets是否比qt更适合绘制波形?

C++ 由于本机函数支持,wxWidgets是否比qt更适合绘制波形?,c++,qt,wxwidgets,C++,Qt,Wxwidgets,我只是想知道,wxWidget是否比qt更快地满足了我的特殊需求 简单的事情。我想以Audacity的速度绘制波形。我尝试了与《Audacity》中完全相同的方法,但我只获得了接近《Audacity》的性能,但仍然没有《Audacity》快 我的想法是,Qt对于具有难以置信的性能/反馈的位图绘制来说是次优的。 从Audacity文档中: 屏幕更新使用直接绘制和间接绘制的混合 事件。更新图形显示的“正常”方法是调用 当某些内容使屏幕无效时,使用Refresh()方法。后来, 系统调用OnPaint

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

简单的事情。我想以Audacity的速度绘制波形。我尝试了与《Audacity》中完全相同的方法,但我只获得了接近《Audacity》的性能,但仍然没有《Audacity》快

我的想法是,Qt对于具有难以置信的性能/反馈的位图绘制来说是次优的。 从Audacity文档中:

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

所以说到这里,可以像我使用Qt一样使用wxwidget“更直接地”绘制,如果是这样的话,这真的更快吗?(我还没有发现使用Qt将“直接”绘制到FrameBuffer的任何可能性)

更新: 因为它是被要求的,所以我给出了我的绘图代码(使用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();
}
void WaveformWidget::QwtPlotIntervalCurveFast::drawTube(油漆工*油漆工、常量QwtScaleMap&xMap、常量QwtScaleMap&yMap、常量QRectF&canvastrect、int from、int to)常量
{
painter->save();//不是最好的性能,但对某些人来说,它很适合。
画师->画笔(此->画笔());//请随意使用。
std::vector draw=getToDrawData(xMap,yMap);
双x,y1,y2;
std::矢量线(draw.size());
对于(int i=0;i绘图线(lines.data(),lines.size());
画师->还原();
}
更新2: 现在分析附件:)

对不起,这是德语

更新3: 这东西看起来就是这样的。这是一个没有任何噪音的正弦波。在绘制真实信号之前,只需进行1或2个缩放阶段(如果你能尝试给我一个反馈,告诉我它对你来说是什么样子。那太好了,在“如何快速绘制波形”上花费了太多时间)。是的,Audacity阻止rms值大于最大/最小值。我稍后再补充

绘制未经操作的曲线是否会大大提高性能

更新:


我将应用程序的处理器使用情况与audacity在“调整波形小部件的大小”过程中的使用情况进行了比较。Audacity在调整小部件大小时使用的处理器时间至少比我的应用程序少10%。在这些操作中,audacity的总使用率是我的计算机的20%(我的30%)。

我只能在windows系统中回答这个问题

在这种情况下,我发现wxWidgets比qt快。

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

相比之下,Qt使用双缓冲(据我所知)在Windows系统上无法禁用(但在linux系统上可以禁用)

因为这个问题只适用于Windows系统,所以我不接受

附言:
如果有人可以对Linux系统进行一些测试,请执行和/或与我联系,我将提供代码。

您是否分析了您的代码和Audacity的代码,并在底层工具包完成的位图绘制中发现了差异?如果是,请附加探查器结果。如果没有,请先配置文件。不要重复猜测。不管怎样:通过在小部件上设置
Qt::WA_PaintOnScreen
标志,可以直接在X11上的屏幕上绘制。这打破了其他东西,并不是最重要的优化(我们在2016年,双缓冲不再是一个问题),我认为这不会解决你的问题。调查后绘制波形并没有那么复杂。对于缩小,您只需将信号分成数据包,获取最大/最小值(可选rms),然后用垂直线绘制内容。这很清楚,应该很有效,不是吗?很抱歉,我明白你的意思,我不能给你更多,因为我缺少测试。在Windows系统上也有这种可能吗?好吧,Visual Studio中集成了一个CPU分析器,所以您可以从使用它开始。(或VTune,或其他一些CPU分析器)查看此代码。也许我已经做错了什么。但我明白,这应该已经很好地工作了。然而,当我放大它时,它可能会导致混乱。将来,我将把这段代码打包在一个自己的draw语句中,用于最小/最大值和RMS值,而不是像现在这样分开。是的,表演对其他人来说是很好的,但在我看来,与大胆相比,它可能会更好一些。谢谢大家的帮助和耐心@peppe!