1

我正在开发一个基于 Qt 的 MacOS/X 音频计量应用程序,其中包含音频计量小部件(可能很多),每个小部件都应该每 50 毫秒更新一次(即 20 赫兹)。

该程序有效,但是当一次更新大量仪表时,它会占用大量 CPU 时间并且可能会陷入困境(旋转色轮,哦不!)。

奇怪的是:最初这个应用程序只会在仪表值更改时调用仪表小部件上的 update(),因此整个仪表小部件将每 50 毫秒重绘一次。但是,我认为我会很聪明,只计算实际需要重绘的仪表区域,并且只重绘小部件的那部分(例如 update(x,y,w,h),其中 y 和 h 是根据仪表的旧值和新值计算)。然而,当我实现它时,它实际上使 CPU 使用率提高了四倍(!)......即使应用程序每秒绘制的像素减少了 50%。

谁能解释为什么这种优化实际上是一种悲观化?我在这里发布了一个简单的示例应用程序来演示效果:

http://www.lcscanada.com/jaf/meter_test.zip

当我编译 (qmake;make) 上面的应用程序并像这样运行它时:

$ ./meter.app/Contents/MacOS/meter 72 
Meter:  Using numMeters=72 (partial updates ENABLED)

... top 显示了使用 ~50% CPU 的进程。

当我禁用 smart-partial-updates 逻辑时,像这样运行它:

$ ./meter.app/Contents/MacOS/meter 72 disable_partial_updates
Meter:  Using numMeters=72 (partial updates DISABLED)

... top 显示了仅使用 ~12% CPU 的进程。嗯?这种情况不应该占用更多的CPU,而不是更少吗?

我尝试使用 Shark 分析应用程序,但结果对我来说意义不大。FWIW,我在 8 核 Xeon Mac Pro 上运行 Snow Leopard。

4

2 回答 2

2

GPU绘图让CPU计算要重绘的部分要快得多(至少对于OpenGL来说,这考虑到了,我得到了Book OpenGL superbible,它声明OpenGL是为了不重绘而构建的,因为这可能是一个还有很多工作要做)。即使您使用软件渲染,这些库也经过高度优化,可以正确快速地完成工作。所以只是重绘是最先进的。

于 2010-02-23T00:13:11.883 回答
1

top我的 Linux 机器上的FWIW显示 ~10-11% 没有部分更新,12% 使用部分更新。不过,我必须请求 400 米才能获得 CPU 使用率。

也许只是 Qt 设置绘画区域的开销实际上使您的绘画时间相形见绌?毕竟你的绘画真的很简单,它只是两个矩形填充。

于 2010-02-22T21:55:24.727 回答