【问题标题】:Understanding the relationship between glutDisplayFunc and glutPostRedisplay了解 glutDisplayFunc 和 glutPostRedisplay 的关系
【发布时间】:2010-11-17 16:12:03
【问题描述】:

阅读红皮书时发现:

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

如果你的程序改变了内容 窗户的,有时你会有 调用 glutPostRedisplay(),其中 让 glutMainLoop() 轻推调用 在其注册的显示回调 下次机会

应该在什么时候调用 glutPostRedisplay()?从这一段中,我不明白为什么需要它的功能。

【问题讨论】:

    标签: opengl glut


    【解决方案1】:

    每当您的窗口必须重新绘制时,都会调用 glutDisplayFunc。这包括调用 glutPostRedisplay 的时间 :)

    什么时候需要重绘窗口?

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

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

    【讨论】:

    • 我不明白为什么在你提到的情况下你不调用 glutDisplayFunc 而不是 glutPostRedisplay 考虑到 glutPostRedisplay 最终会调用 glutDisplayFunc。队列的重要性是什么?它可以在等待条件时延迟渲染吗?
    • @omgzor:在上面的示例中,您可以这样做。但这不是最好的选择。你看,最好不要直接调用,而是放到队列中。例如,如果您想要动画并直接从 displayFunc 调用 displayFunc,您的程序将不会响应。因为你会阻塞循环。这就是为什么最好发布事件并让主循环轮流处理它的原因
    • @omgzor:它不会延迟渲染。它会延迟一切:)
    【解决方案2】:

    您传递给glutDisplayFunc 的函数仅在需要时调用:这意味着当调整窗口大小时,或者当另一个窗口隐藏它时。例如,如果您使用glutMouseFunc,您可能希望根据该 clic 更新(重绘)您的窗口内容。另外,如果你绘制动画,你需要在你的空闲函数中调用glutPostRedisplay

    【讨论】:

      猜你喜欢
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多