2013-06-18 14 views
8

Tôi tự hỏi nếu gọi updateGL() trong khoảng thời gian cố định có thể làm chậm quá trình rendering. Vì vậy, tôi muốn thử làm cho thời gian thực render. Tôi không có chức năng để nó hoạt động tự động. Có ai biết điều đó không?làm thế nào để làm cho updateGL() thời gian thực trong QT

thứ hai, tôi đã nhận xét updateGL() trong chương trình của mình, mức sử dụng CPU giảm xuống 1% và 0%. Bây giờ, khi tôi nhấp vào tiện ích hiển thị, nó nhảy tới 14%, tại sao? GPU không làm tất cả các công việc dựng hình? nếu có lý do tại sao CPU nhảy đến 14? làm thế nào tôi có thể giải quyết điều này?

+0

Để 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

Trả lời

11

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.

+0

tôi đã thêm this-> format(). SetSwapInterval (1); trong hàm tạo và hàm swapbuffers() ở cuối hàm paintGL(). nhưng nó không có hiệu lực. làm thế nào để làm cho nó render 60fps? – Sam

+0

@ user1596226 Hai thứ: bạn không nên gọi 'this-> format(). SetSwapInterval (1);' mà đúng hơn là tạo một QGLFormat với khoảng thời gian hoán đổi này và chuyển nó tới hàm tạo của 'QGLWidget' của bạn. Sau đó, bạn không nên gọi 'swapBuffers()' như tôi đã nói, nó được gọi tự động sau 'paintGL()' :) Bạn có thể đo và hiển thị thời gian giữa mỗi paintGL() bằng cách sử dụng ' QElapsedTimer'? Điều này sẽ rất hữu ích để hiểu những gì đang xảy ra. – Boris

+0

bạn có thể vui lòng viết nó cho tôi, tôi không knw chính xác làm thế nào để thêm cờ này để xây dựng. – Sam