3

В приложении появилась проблема. При некоторых режимах работы приложения слишком часто вызывается QWidgetBackingStore sync, который ест примерно 20-25% процессорного времени приложения. Результат работы профайлера на картинке: введите сюда описание изображения В документации по поводу QWidgetBackingStore::sync() сказано:

Synchronizes the backing store, i.e. dirty areas are repainted and flushed.

С чем может быть связан такой частый вызов QWidgetBackingStore::sync()? За что он отвечает? В каком случае он вызывается?

2 Answers2

1

Методы формирования списка областей перерисовки и собственно самой перерисовки содержимого виджетов вызываются всякий раз, как что-то меняется в этом самом содержимом. Чем чаще приходят события на необходимость обновления внешнего вида, тем соответственно чаще будут вызываться обозначенные методы.

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

Если Ваш виджет перерисовывается за 2 с половиной секунды и при этом его содержимое не статично (из-за необходимости частой перерисовки), то это уже говорит о том, что имеет смысл что-то перестроить. Например, если Вы используете QGraphicsScene, то это могла бы быть установка некоторых флагов оптимизации для сцены.

0

Посмотрите, у вас в начале стека вызов convertRGBA8888FromARGB32PM_sse4 видимо у вас на виджете QLabel с картинкой которую вы постоянно обновляете. При этом у исходного растра формат RGBA8888, а для ренедеринга на экран Qt нужен ARGB32PM.

Судя по времени, конвертация растра происходит быстро, да и syncBackingStore() тоже. А провал у вас начинается в sendPostedEvents. Таким образом, можно предположить, что в эти моменты либо очередь событий слишком большая, либо обработка этих событий выполняется слишком медленно. Конкретно, не скажу нужно код курить.

В итоге имеем. Во-первых попробуйте исключить постоянную ковертацию растра. А во-вторых разбирайтесь с очередью событий.

Cerbo
  • 6,863