Да, вы можете сделать это в реальном времени, без разрыва (например, перерисовка ровно на 60 кадров в секунду, частота обновления вашего монитора).
Для этого вы должны включить V_sync, и с помощью QTimer timer;
интервала 0. Включение V_sync сделает автоматически вызывается swapBuffers()
команду CPU-ждать сигнала вертикальной развертки от монитора. Затем таймер будет фактически синхронизирован с частотой обновления монитора.
Связанная информация может быть найдена здесь: http://blog.qt.digia.com/blog/2010/12/02/velvet-and-the-qml-scene-graph/. Обратите внимание на QGLFormat::setSwapInterval(1)
, чтобы включить V_sync, если это не сделано автоматически в настройках драйвера:
class MyGLWidget: public QGLWidget
{
// ...
private:
QTimer timer;
}
QGLFormat desiredFormat()
{
QGLFormat fmt;
fmt.setSwapInterval(1);
return fmt;
}
MyGLWidget::MyGLWidget() :
QGLWidget(desiredFormat())
{
// Configure the timer
connect(&timer, SIGNAL(timeout()), this, SLOT(updateGL()));
if(format().swapInterval() == -1)
{
// V_blank synchronization not available (tearing likely to happen)
qDebug("Swap Buffers at v_blank not available: refresh at approx 60fps.");
timer.setInterval(17);
}
else
{
// V_blank synchronization available
timer.setInterval(0);
}
timer.start();
}
Параллельно, вы можете запустить QElapsedTimer
, чтобы определить, сколько времени прошло между двумя рисунок (обычно прибл 16.6ms), а также использование эта информация, например, для обновления вашей сцены.
Для использования ЦП, нет, это не тот GPU, который выполняет * все * задание. ЦП еще должен выполнить команды для перехода на графический процессор, а иногда и ждать синхронизации (а также выполняет логику вашего приложения, если оно есть). Тем не менее, если ваша сцена действительно проста, 14% определенно не нормальное. Убедитесь, что вы не рисуете более 60 кадров в секунду, что не имеет смысла. – Boris