हां, आप इसे रीयलटाइम बना सकते हैं, बिना किसी फाड़ने के (उदाहरण के लिए, बिल्कुल 60fps पर रीड्रॉइंग, आपके मॉनीटर की रीफ्रेश दर)।
इसके लिए आपको V_sync सक्षम करने के लिए है, और अंतराल 0. को सक्षम करने से V_sync लिए स्वचालित रूप से कहा जाता है swapBuffers()
आदेश कर देगा का एक QTimer timer;
अपने मॉनिटर से लम्बवत रीफ्रेश संकेत के लिए सीपीयू इंतजार का उपयोग कर। फिर, टाइमर वास्तव में मॉनिटर रीफ्रेश दर के साथ सिंक्रनाइज़ किया जाएगा।
एक संबंधित जानकारी यहां मिल सकती है: 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 नहीं है जो * सभी * नौकरी करता है। सीपीयू अभी भी GPU को पास करने के लिए कमांड निष्पादित करने के लिए है, और कभी-कभी सिंक्रनाइज़ेशन की प्रतीक्षा करता है (और आपके आवेदन का तर्क भी करता है, यदि कोई हो)। फिर भी, यदि आपका दृश्य वास्तव में सरल है, तो 14% निश्चित रूप से सामान्य नहीं है। सुनिश्चित करें कि आप 60fps से अधिक पर चित्र नहीं बना रहे हैं जो समझ में नहीं आता है। – Boris