QT

2013-06-18 3 views
8

में updateGL() रीयलटाइम कैसे बनाएं मुझे आश्चर्य है कि अगर निश्चित टाइमर अंतराल में UpdateGL() को कॉल करना प्रतिपादन प्रक्रिया को धीमा कर सकता है। तो, मैं वास्तविक समय प्रस्तुत करने की कोशिश करना चाहता हूं। मैं इसे स्वचालित रूप से निष्पादित करने के लिए फ़ंक्शन नहीं करता हूं। कोई भी जानता है कि?QT

दूसरी बार, मैंने अपने प्रोग्राम में updateGL() पर टिप्पणी की, CPU उपयोग 1% और 0% तक कम हो गया। अब, जब मैं डिस्प्ले विजेट पर क्लिक करता हूं तो यह 14% तक पहुंच जाता है, क्यों? जीपीयू सभी प्रतिपादन नौकरी नहीं कर रहा है? यदि हां क्यों सीपीयू 14 तक कूदता है? मैं इसे कैसे हल करूं?

+0

सीपीयू उपयोग के लिए, नहीं, यह GPU नहीं है जो * सभी * नौकरी करता है। सीपीयू अभी भी GPU को पास करने के लिए कमांड निष्पादित करने के लिए है, और कभी-कभी सिंक्रनाइज़ेशन की प्रतीक्षा करता है (और आपके आवेदन का तर्क भी करता है, यदि कोई हो)। फिर भी, यदि आपका दृश्य वास्तव में सरल है, तो 14% निश्चित रूप से सामान्य नहीं है। सुनिश्चित करें कि आप 60fps से अधिक पर चित्र नहीं बना रहे हैं जो समझ में नहीं आता है। – Boris

उत्तर

11

हां, आप इसे रीयलटाइम बना सकते हैं, बिना किसी फाड़ने के (उदाहरण के लिए, बिल्कुल 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) कितना समय दोनों के बीच पारित किया है, और उपयोग उदाहरण के लिए, यह दृश्य आपके दृश्य को अपडेट करने के लिए।

+0

मैंने इसे जोड़ा-> प्रारूप()। SetSwapInterval (1); paintGL() फ़ंक्शन के अंत में कन्स्ट्रक्टर और स्वैपबफर() में। लेकिन इसका कोई प्रभाव नहीं पड़ा। इसे 60fps कैसे प्रस्तुत करें? – Sam

+0

@ user1596226 दो चीजें: आपको 'this-> format()। SetSwapInterval (1)' नहीं कहना चाहिए, बल्कि इस स्वैप अंतराल के साथ एक QGLFormat बनाएं और इसे अपने 'QGLWidget' के निर्माता को पास करें। फिर, आपको 'swapBuffers() 'बिल्कुल नहीं कहना चाहिए: जैसा कि मैंने कहा था, इसे आपके' पेंटजीएल()' के बाद स्वचालित रूप से बुलाया जाता है :) क्या आप प्रत्येक पेंटजीएल() के बीच समय को मापने और प्रदर्शित करने में सक्षम हैं। QElapsedTimer'? यह समझने में बहुत मददगार होगा कि क्या हो रहा है। – Boris

+0

क्या आप इसे मेरे लिए लिख सकते हैं, मैं बिल्कुल इस ध्वज को कन्स्ट्रक्टर में जोड़ने का तरीका नहीं जानता हूं। – Sam

संबंधित मुद्दे