我正在开发一个基于Qt的MacOS / X音频测量应用程序,它包含音频测量小部件(可能很多),每个小部件应该每50ms更新一次(即20Hz)。 / p>
该程序可以工作,但是当一次更新大量的仪表时,它耗费了大量的CPU时间并且可以陷入困境(spinny-color-wheel,哦不!)。
奇怪的是:原来这个应用程序只要在仪表值改变时调用仪表小部件上的update(),因此整个仪表小部件将每50ms重绘一次。但是,我认为我会聪明并只计算实际需要重绘的仪表区域,并且只重绘小部件的那部分(例如更新(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的过程。
当我禁用聪明的部分更新逻辑时,通过这样运行它:
$ ./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。
答案 0 :(得分:2)
GPU绘图比批次更快,然后让CPU重新绘制部件进行重绘(至少对于OpenGL来说,考虑到这一点,我得到了Book OpenGL,并且它表明OpenGL是为了重绘而构建的不是,绘制delta,因为这可能是 lot 更多的工作要做)。即使您使用软件渲染,库也会得到高度优化,无法正常工作并且快速。所以重新绘制是最先进的。
答案 1 :(得分:1)
我的Linux机器上的FWIW top
显示~10-11%没有部分更新,12%使用部分更新。我不得不要求400米才能获得CPU使用率。
也许只是Qt建立一个油漆区域的开销实际上使你的油漆时间相形见绌?毕竟你的绘画很简单,它只是两个矩形填充。