理解glutDisplayFunc和glutPostRedisplay之间的关系

and*_*and 10 opengl glut

在阅读红皮书时,我发现:

glutDisplayFunc(void(*func)(void))是您将看到的第一个也是最重要的事件回调函数.每当GLUT确定需要重新显示窗口的内容时,执行glutDisplayFunc()注册的回调函数.因此,您应该在显示回调函数中放置重绘场景所需的所有例程.

如果您的程序更改了窗口的内容,有时您将不得不调用glutPostRedisplay(),这会给glutMainLoop()一个微调,以便在下一次机会调用已注册的显示回调

哪个时候应该调用glutPostRedisplay()?从这一段开始,我不明白为什么需要它的功能.

Arm*_*yan 16

每当必须重绘窗口时,都会调用glutDisplayFunc.这包括一个人调用glutPostRedisplay的时间:)

什么时候需要重绘窗口?

  • 当它的大小改变
  • 当它变得可见时
  • 当它的某些部分变得可见时
  • 当它被移动
  • 等等

但是,如果你的显示功能在x位置绘制一个三角形,那么x; y; 是由鼠标位置决定的?在这种情况下,只要鼠标向右移动,您就必须要求系统重绘窗口?这就是你从MouseFunc()调用glutPostRedisplay的原因.实际上,当您调用glutPostRedisplay时,重绘事件会与其他窗口事件(如鼠标单击ets)一起排队.基本上你的mainLoop会从该队列中选择事件并调用它们的处理程序

  • @omgzor:在上面的例子中,你可以这样做.但那不是最好的选择.你看,最好不要直接调用它,而是把它放在队列中.例如,如果你想要动画并直接从displayFunc调用displayFunc,你的程序将不会响应.因为你将阻止循环.这就是为什么最好发布事件并让主循环轮流处理它 (2认同)