Продолжительность одного цикла составляет от 10 до 15 миллисекунд. Что Qt делает в это время?
Скорее всего, он спит и / или имеет тенденцию к другим делам, за которые отвечает событие Qt l oop. Обратите внимание, что на Windows таймер процесса по умолчанию использует механизм низкого разрешения с гранулярностью 10 мс (и поэтому, если вы хотите, чтобы ваш Windows процесс мог спать менее 10 мс одновременно, вам нужно вызвать timeBeginPeriod (1) в начале вашей программы).
syn c обновление с частотой обновления sh монитора. Это возможно?
В принципе это возможно, но QWidget API Qt на самом деле не предназначен для такого уровня управления (QWidgets - это не столько API для игр / мультимедиа, сколько классическое c настольное приложение). GUI, поэтому он больше фокусируется на правильном подборе контента, чем на обеспечении минимальных сроков). Если вы можете переключиться на использование QML вместо старого API QWidgets, QML имеет некоторую поддержку для синхронизации с монитором-refre sh. Другой возможностью было бы нарисовать вашу графику через OpenGL, внутри QOpenGLWindow ; класс QOpenGLWindow также имеет некоторую возможность синхронизировать c со скоростью refre sh (см. документацию по сигналу frameSwapped ()).
Кстати, обратите внимание, что запись выводится в stdout
(он же * 1022) *) и / или stderr
(он же std::cerr
) может быть довольно медленным, и, делая это в размещенной вами программе, вы, возможно, слишком много сбрасываете измерения времени. Лучшим подходом было бы собрать данные о времени, но просто сохранить их внутри какой-то структуры данных до тех пор, пока вы не закончите измерение, а затем распечатать измеренные значения только в конце (например, когда вы выйдете из программы), чтобы распечатать значения не влияют на точность значений.