Có, bạn có thể đặt thời gian thực, không bị rách (ví dụ: vẽ lại chính xác 60 khung hình/giây, tốc độ làm mới của màn hình).
Đối với điều này, bạn phải bật V_sync và sử dụng QTimer timer;
khoảng thời gian 0. Bật V_sync sẽ thực hiện lệnh tự động được gọi là swapBuffers()
để chờ tín hiệu làm mới dọc từ màn hình của bạn. Sau đó, bộ hẹn giờ sẽ thực sự được đồng bộ với tốc độ làm tươi màn hình.
Thông tin liên quan có thể tìm thấy tại đây: http://blog.qt.digia.com/blog/2010/12/02/velvet-and-the-qml-scene-graph/. Lưu ý QGLFormat::setSwapInterval(1)
để cho phép V_sync, nếu không thực hiện tự động bởi các thiết lập trình điều khiển của bạn:
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();
}
Song song đó, bạn có thể chạy một QElapsedTimer
để đo lường bao nhiêu thời gian đã trôi qua giữa hai bản vẽ (thường là khoảng 16.6ms), và sử dụng thông tin này để cập nhật cảnh của bạn, chẳng hạn.
Để sử dụng CPU, không, nó không phải là GPU làm * tất cả * công việc. CPU vẫn phải thực hiện các lệnh để chuyển tới GPU và đôi khi chờ đồng bộ hóa (và cũng thực hiện logic của ứng dụng của bạn, nếu có). Tuy nhiên, nếu cảnh của bạn thực sự đơn giản, 14% chắc chắn không bình thường. Hãy chắc chắn rằng bạn không vẽ ở mức cao hơn 60 khung hình/giây không có ý nghĩa. – Boris