2010-11-17 245 views
6

之間的關係,在讀我發現紅皮書:瞭解glutDisplayFunc和glutPostRedisplay

glutDisplayFunc(無效(* FUNC)(無效))是 第一和最重要的事件 回調函數,你會看到。 每當GLUT確定窗口內容 需要重新顯示 時,由glutDisplayFunc()註冊的回調函數 爲 執行。因此,你應該把 所需的所有例程重新繪製在 的場景中,在顯示回調 函數中。

如果你的程序改變內容的窗口 ,有時你必須 調用glutPostRedisplay(),它 給glutMainLoop()輕推調用 註冊的顯示回調在其 下次有機會

哪些是應該調用glutPostRedisplay()的時間?從這一段,我不明白爲什麼它的功能是需要的。

回答

13

只要必須重繪窗口,就會調用glutDisplayFunc。這包括當您撥打glutPostRedisplay時的時間:)

何時需要重新繪製窗口?

  • 當它的大小改變
  • 時,它的某些部分變得可見變爲可見
  • 當移動

但是,如果你的顯示功能在位置x繪製三角形; y其中x; y;是由鼠標位置決定的?在這種情況下,只要鼠標向右移動,您就必須讓系統重新繪製窗口?這就是爲什麼你會從MouseFunc()調用glutPostRedisplay。實際上,當您調用glutPostRedisplay時,重繪事件與其他窗口事件一起排隊,如鼠標點擊ets。本質上,您的mainLoop會從該隊列中挑選事件並呼叫他們的處理程序

+0

我不明白爲什麼你不會在你提到的情況下調用glutDisplayFunc而不是glutPostRedisplay,因爲glutPostRedisplay最終會調用glutDisplayFunc。隊列的重要性是什麼?它可以在等待條件時延遲渲染嗎? – andandandand 2010-11-17 17:07:34

+2

@omgzor:在上面的例子中,你可以這樣做。但這不是最好的選擇。你看,最好不要直接調用它,而是把它放在隊列中。例如,如果您想要動畫並直接從displayFunc調用displayFunc,則您的程序將不會響應。因爲你會阻止循環。這就是爲什麼最好發佈事件並讓主循環輪流處理它 – 2010-11-17 17:17:53

+0

@omgzor:它不會延遲渲染。它會延遲其他一切:) – 2010-11-17 17:18:42

3

您傳遞給glutDisplayFunc的函數僅被稱爲它是需要的:這意味着當窗口被調整大小時,或者另一個窗口已隱藏它時。例如,如果您使用glutMouseFunc,則可能需要根據該問題更新(重新繪製)窗口內容。另外,如果您繪製動畫,則需要從空閒功能呼叫glutPostRedisplay