2010-11-18 29 views
6

Tôi cố gắng để hiển thị video ở 60fps trong một QPainter (trong một OpenGLwidget)QPainter mức độ hoạt động khung hình cao

Tôi gặp một vấn đề mà đôi khi các bản vẽ phải mất quá nhiều thời gian và sự kiện repaint tiếp theo sẽ xảy ra trong khi QPainter là trong sử dụng - tạo cảnh báo và các sự cố ngẫu nhiên.

Một vài câu hỏi:
Có cách 'Qt' để thực hiện các cuộc gọi liên động hiệu quả hay không, vì có lẽ QPainter biết nó đang được sử dụng - hay tôi chỉ sử dụng hỗ trợ mutex nền tảng của mình?

Có cách nào tốt hơn để vẽ ở tốc độ khung hình cao (mà tất nhiên cũng cần phải được khóa vào VSync) chứ không chỉ là một bộ hẹn giờ gọi repaint()?

+0

Hướng dẫn chính xác mà bạn gọi khi hẹn giờ kích hoạt là gì? Hoặc, nếu bạn không gọi bất cứ điều gì cho mình, làm thế nào để bạn thực thi 60fps? –

+0

repaint(), sau đó tôi quá tải paintEvent() để lấy dữ liệu hình ảnh của tôi và đưa nó vào một QImage được trả lại –

+0

Bạn có thể tạo QImages trong một Thread riêng biệt, vì vậy chủ đề vẽ sẽ cần ít thời gian hơn trên mỗi paintEvent. – smerlin

Trả lời

2

Hãy thử sử dụng update() thay vì repaint().

Chức năng này không gây ra lỗi ngay lập tức; thay vào đó, lên lịch sự kiện sơn để xử lý khi Qt quay lại sự kiện chính vòng lặp. Điều này cho phép Qt tối ưu hóa cho tốc độ nhanh hơn và ít nhấp nháy hơn một cuộc gọi để sơn lại().

Cập nhật cuộc gọi() nhiều lần thường dẫn đến chỉ một cuộc gọi paintEvent().

+0

Tôi cần sự kiện sơn diễn ra nhanh nhất có thể (lý tưởng là tôi muốn một sự kiện trên VSync tiếp theo - đó là trong Qt5) - và tôi cần một khung được vẽ mỗi 1/60 giây. Update() là phù hợp hơn khi bạn có rất nhiều widget để vẽ lại –

+1

Cập nhật không chậm, nó chỉ là bộ đệm gọi lại các cuộc gọi để tránh nhấp nháy và các cuộc gọi không cần thiết. Thử nó. Nhưng nếu nó thực sự quá chậm, có thể sử dụng QtOpenGl thay vì QPainter sẽ tốt hơn? Hoặc có thể là Phonon? Nguồn gốc của video, btw là gì? –

+0

Tôi đang sử dụng QGLWidget để hiển thị, chỉ cần gọi QPainter :: drawImage() - được cho là phần cứng này được tăng tốc với OGL2. Video cuối cùng là từ máy ảnh - nhưng tôi phải thực hiện một số xử lý trên mỗi QImage. –

Các vấn đề liên quan