2010-11-17 20 views
6

Al leer el libro rojo que encontré:La comprensión de la relación entre glutDisplayFunc y glutPostRedisplay

glutDisplayFunc (void (* func) (void)) es la primera y más importante función de devolución de llamada de eventos verá. Siempre que GLUT determine que el contenido de la ventana debe mostrarse , la función de devolución de llamada registrada por glutDisplayFunc() es ejecutada. Por lo tanto, debe poner todas las rutinas que necesita para volver a dibujar la escena en la función de devolución de llamada .

Si el programa cambia el contenido de la ventana, a veces tendrá llamar glutPostRedisplay(), que da glutMainLoop() un empujón para llamar la devolución de llamada de visualización registrado en su próxima oportunidad

¿En qué ocasiones se debe llamar a glutPostRedisplay()? A partir de este párrafo, no entiendo por qué se necesita su funcionalidad.

Respuesta

13

glutDisplayFunc se invoca cada vez que se debe volver a dibujar la ventana. Esto incluye el momento en que se llama a glutPostRedisplay :)

¿Cuándo se debe volver a dibujar una ventana?

  • Cuando su tamaño cambia
  • cuando se hace visible
  • cuando algunas partes de ella se hacen visibles
  • cuando se mueve
  • etc

Pero lo que si su función de visualización pinta un triángulo en la posición x; y donde x; y; están determinados por la posición del mouse? En este caso, debe pedirle al sistema que vuelva a dibujar la ventana cada vez que mueva el mouse ¿correcto? Es por eso que llamará a glutPostRedisplay desde MouseFunc(). En realidad, cuando llamas a glutPostRedisplay, el evento de redibujado se pone en cola junto con otros eventos de ventana, como los clics del mouse. Básicamente, lo que su mainLoop selecciona eventos de esa cola y llama a sus manejadores

+0

No entiendo por qué no deberías llamar a glutDisplayFunc en lugar de glutPostRedisplay en el caso que menciones teniendo en cuenta que glutPostRedisplay finalmente termina llamando a glutDisplayFunc. ¿Cuál es la importancia de la cola? ¿Puede retrasar el procesamiento mientras se espera una condición? – andandandand

+2

@omgzor: en el ejemplo anterior, podrías hacer eso. Pero esa no es la mejor opción. Verá, es mejor no llamarlo directamente, sino ponerlo en una cola. Si, por ejemplo, desea animación y llama a displayFunc directamente desde displayFunc, su programa no responderá. Porque habrás bloqueado el ciclo. Es por eso que es mejor publicar el evento y dejar que el lazo principal lo maneje en su turno –

+0

@omgzor: No retrasará la renderización. Se retrasará todo lo demás :) –

3

La función que pasa a glutDisplayFunc solo se llama como necesaria: eso significa cuando se cambia el tamaño de la ventana o cuando otra ventana la ha ocultado. Si usa glutMouseFunc, por ejemplo, tal vez quiera actualizar (volver a dibujar) el contenido de su ventana de acuerdo con ese clic. Además, si dibuja animaciones, debe llamar al glutPostRedisplay desde su función inactiva.

Cuestiones relacionadas