2010-11-18 18 views
6

que estoy tratando de mostrar el vídeo a 60 fps en una QPainter (en un OpenGLwidget)QPainter tasa de rendimiento de alta marco

Estoy teniendo un problema que a veces el dibujo toma demasiado tiempo y el próximo evento repinte sucede mientras QPainter está en use - que genera una advertencia y bloqueos aleatorios.

Un par de preguntas:
¿Hay un 'camino Qt' de enclavamiento eficientemente llama a volver a pintar, ya que presumiblemente QPainter sabe que se está utilizando - o sólo debo usar mi plataformas de apoyo mutex?

¿Existe alguna forma mejor de dibujar a altas velocidades de cuadro (que por supuesto también necesita estar bloqueado en VSync) que solo un temporizador que llama a repintado()?

+0

¿Cuál es exactamente la instrucción a la que llama cuando se dispara el temporizador? O bien, si no llama nada por su cuenta, ¿cómo aplica los 60 fps? –

+0

repintado(), luego sobrecargo paintEvent() para obtener mis datos de imagen y rellenarlos en un QImage que se procesa –

+0

Bueno, podría crear QImages en un subproceso separado, por lo que el subproceso de pintura necesitará menos tiempo en cada paintEvent. – smerlin

Respuesta

2

Intente utilizar update() en lugar de repaint().

Esta función no causa un repintado inmediato ; en su lugar, programa un evento de pintura para procesar cuando Qt vuelve al evento principal loop. Esto permite que Qt optimice para más velocidad y menos parpadeo que una llamada a para volver a pintar().

Llamar update() varias veces normalmente resulta en una sola llamada paintEvent().

+0

Necesito que el evento de pintura suceda lo más rápido posible (idealmente me gustaría un evento en el siguiente VSync, eso está en Qt5) y necesito que se dibuje un cuadro por 1/60. La actualización() es más adecuada cuando tiene muchos widgets para volver a dibujar. –

+1

La actualización no es lenta, simplemente amortigua las llamadas de nuevo para evitar el parpadeo y las llamadas innecesarias. Intentalo. Pero si es realmente demasiado lento, ¿quizás sería mejor usar QtOpenGl en lugar de QPainter? ¿O tal vez Phonon? ¿Cuál es la fuente del video, por cierto? –

+0

Estoy usando un QGLWidget para renderizar, simplemente llamando a QPainter :: drawImage(): supuestamente este es hardware acelerado con OGL2. El video es en última instancia de una cámara, pero tengo que hacer un procesamiento en cada QImage. –

Cuestiones relacionadas