c++ - wxWidgets画波形比qt更好是因为原生函数支持吗?

标签 c++ qt wxwidgets

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

简单的事情。我想像 Audacity 一样快速地绘制波形。我尝试了与在 Audacity 中完全相同的方法,但我只得到了接近 Audacity 的性能,但仍然不如 Audacity 快。

我的想法是,Qt 对于具有 令人难以置信的 性能/反馈的位图绘制来说不是最佳选择。 来自 Audacity 文档:

The screen update uses a mixture of direct drawing and indirect paint events. The "normal" way to update a graphical display is to call the Refresh() method when something invalidates the screen. Later, the system calls OnPaint(), which the application overrides to (re)draw the screen. In wxWidgets, you can also draw directly to the screen without calling Refresh() and without waiting for OnPaint() to be called.

所以提到这一点,可以像使用 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 值大于最大/最小值。我稍后再补充。

enter image description here

不分离地绘制曲线会大大提高性能吗?

更新:

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

最佳答案

很遗憾,我只能针对windows系统回答这个问题。

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

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

相比之下,Qt 使用双缓冲(目前我知道)不能在 Windows 系统上禁用(但在 linux 系统上可以)。

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

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

关于c++ - wxWidgets画波形比qt更好是因为原生函数支持吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40983762/

相关文章:

c++ - 从 qtextedit 中读取多个值并将它们作为不同的数字

python - 在我的 Qt C++ 应用程序中使用 Anaconda 的 Python

qt - 如何将 Windows 桌面应用程序转换为 Mac 桌面应用程序?

c++ - 在 wxWidgets 中关闭 wxDialog

c++ - 使用 extern const 的函数初始化 const

c++ - 将预处理器定义添加到 cmake 外部项目

c++ - 在 Linux 中记录和绘制引导过程信息

c++ - 当我 push_back 到 vector 时调用析构函数

c++ - 可以在 OSx 中使 QDialog 抖动

c++ - 回溯没有给我完整的堆栈跟踪