2010-11-18 17 views
6

sto cercando di mostrare il video a 60fps in un QPainter (in un OpenGLwidget)QPainter prestazioni ad alta frequenza di fotogrammi

Sto avendo un problema che a volte il disegno richiede troppo tempo e il prossimo evento ridisegno accade mentre QPainter è in use - che genera un avviso e arresti anomali casuali.

Un paio di domande:
C'è un 'modo Qt' di interblocco modo efficiente le chiamate a ridisegnare, in quanto presumibilmente QPainter sa che viene utilizzato - o devo basta usare il mio sostegno piattaforme mutex?

C'è un modo migliore per disegnare a frame rate elevati (che ovviamente deve anche essere bloccato su VSync) rispetto a un semplice timer che chiama repaint()?

+0

Qual è esattamente l'istruzione che si chiama quando il timer scocca? Oppure, se non si chiama nulla da soli, come si fa a rinforzare il 60fps? –

+0

repaint(), quindi sovraccarico paintEvent() per ottenere i dati dell'immagine e inserirli in una QImage che viene sottoposta a rendering –

+0

Bene, è possibile creare QImages in un thread separato, quindi il thread di pittura avrà bisogno di meno tempo su ogni paintEvent. – smerlin

risposta

2

Prova a utilizzare update() anziché repaint().

Questa funzione non causa un immediato ridisegno di ; invece, pianifica un evento paint per l'elaborazione di quando Qt torna al ciclo dell'evento principale . Ciò consente a Qt di ottimizzare per più velocità e meno sfarfallio di una chiamata a repaint() da parte di .

aggiornamento Calling() più volte risultati normalmente in appena chiamata uno paintEvent().

+0

Ho bisogno che l'evento paint avvenga il più rapidamente possibile (idealmente mi piacerebbe un evento sul prossimo VSync - che è in Qt5) - e ho bisogno di un frame per essere disegnato per 1/60s. Update() è più adatto quando si hanno molti widget da ridisegnare. –

+1

L'aggiornamento non è lento, ma memorizza semplicemente le chiamate ripetute per evitare lo sfarfallio e le chiamate non necessarie. Provalo. Ma se è davvero troppo lento, forse usare QtOpenGl invece di QPainter sarebbe meglio? O forse Phonon? Qual è la fonte del video, btw? –

+0

Sto usando un QGLWidget per eseguire il rendering, semplicemente chiamando QPainter :: drawImage() - presumibilmente si tratta di un hardware accelerato con OGL2. Il video è in definitiva da una fotocamera - ma devo fare un po 'di elaborazione su ogni QImage. –

Problemi correlati