我正在开发一个基于 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。