Qt 4.6.x под MacOS / X: загадка производительности обновления виджета - PullRequest
1 голос
/ 23 февраля 2010

Я работаю над приложением замера звука MacOS / X на основе Qt, которое содержит виджеты замера звука (потенциально их много), каждый из которых должен обновляться каждые 50 мс (т. Е. С частотой 20 Гц).

Программа работает, но при одновременном обновлении большого количества счетчиков она использует много процессорного времени и может зависнуть (spinny-color-wheel, о нет!).

Странная вещь заключается в следующем: изначально это приложение просто вызывало update () для виджета измерителя всякий раз, когда значение измерителя изменялось, и, следовательно, весь виджет-измеритель перерисовывался бы каждые 50 мс. Тем не менее, я подумал, что был бы умен и вычислил бы только ту площадь счетчика, которую нужно перерисовать, и перерисовал бы только ту часть виджета (например, update (x, y, w, h), где y и h рассчитывается на основе старых и новых значений счетчика). Однако, когда я это реализовал, он фактически увеличил загрузку ЦП в четыре раза (!) ... хотя приложение рисовало на 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% ЦП.

Когда я отключаю логику умного-частичного обновления, запустив ее так:

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

... top показывает процесс, использующий только ~ 12% ЦП. А? Разве в этом случае не нужно больше процессора, а не меньше?

Я пытался профилировать приложение с помощью Shark, но результаты не имели для меня большого значения. Я использую Snow Leopard на 8-ядерном Xeon Mac Pro.

Ответы [ 2 ]

2 голосов
/ 23 февраля 2010

GPU-рисование на лот быстрее, чем позволяет процессору вычислять часть для перерисовки (по крайней мере, для OpenGL это учитывается, я получил превосходную книгу Book OpenGL, и в ней говорится, что OpenGL собирается не перерисовывать) , чтобы нарисовать дельту, так как это потенциально лот больше работы). Даже если вы используете программный рендеринг, библиотеки оптимизированы для правильной работы и быстрая . Так что перерисовка - это состояние.

1 голос
/ 23 февраля 2010

FWIW top на моем компьютере с Linux показывает ~ 10-11% без частичных обновлений и 12% с частичными обновлениями. Мне пришлось запросить 400 метров, чтобы получить загрузку процессора.

Возможно, просто накладные расходы Qt на настройку области рисования на самом деле сокращают ваше время рисования? Ведь ваша картина действительно проста, это всего лишь две прямоугольные заливки.

...