2015-11-16 6 views
0

У меня есть приложение Qt, которое построено вокруг QGraphicsView/Scene. Графическая производительность прекрасна, анимации чрезвычайно гладкие, и простой таймер высокого разрешения говорит, что кадры рисуются так же быстро, как 400 кадров в секунду. Тем не менее, приложение всегда использует 15% процессор в соответствии с диспетчером задач. Я провел анализ производительности на нем в Visual Studio 2012, и он показывает, что большинство образцов берутся в функции QApplication :: notify. Sampling Profile Report from Visual StudioПриложение Qt QGraphicsView всегда использует 15% процессор.

Я установил визуализацию с помощью QGLWidget в надежде, что разгрузка функций чертежа на GPU поможет, но это не повлияло на использование ЦП.

Это нормально? Есть ли что-то, что я могу сделать для сокращения использования ЦП?

Process Explorer Performance Tab Process Explorer Performance Graph

+1

См. Http://doc.qt.io/qt-5/qgraphicsview.html#ViewportUpdateMode-enum – Milovidov

ответ

2

Ну, что у вас есть - 400 FPS частоту кадров. Это загружает один из ваших ядер на 100%. Есть причина, по которой люди обычно закрывают кадры. Высокие частоты кадров создают нагрузку на систему событий Qt, которая управляет графикой.

Ограничьте частоту кадров до 60 FPS и устраните проблему.

Я не обновляя вид, если событие не происходит, что обновляет отдельные graphicswidget

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

Кроме того, я заметил, что вы сказали graphicswidget - что я предполагаю, это QGraphicsWidget - это может быть проблематично. QObject производные классы немного на тяжелой стороне, и система событий Qt поставляется с накладными расходами, что является причиной того, что обычный QGraphicsItem не является QObject. Если вы слишком сильно используете графические виджеты, это может стать источником накладных расходов, поэтому посмотрите, можете ли вы уйти с использованием более легкого класса QGraphicsItem и некоторого более легкого механизма для управления вашей сценой.

+0

Каков наилучший способ ограничить эту частоту кадров? Я не обновляю представление, если не возникает событие, которое обновляет отдельный графический виджет. Поэтому не происходит регулярного обновления, по крайней мере, не напрямую. – jasonlg3d

+0

Оказывается, я обновлял свое представление каждые 0 мс ... Поэтому я изменил это на 16, а использование моего процессора упало до 3%. Я также рассмотрю предложение QGraphicsItem. Спасибо за помощь. – jasonlg3d

+0

«Оказывается, я обновляю свой взгляд за каждые 0 мс» - да, вам это не нужно: если производительность сейчас не проблема, вам не нужно отказываться от виджетов. – dtech