10

glutdisplayfunc() がどのようにディスプレイをループさせるかを理解すると、Iv はいくつかの場所でゲームの仕組みをディスプレイではなく glutidle に配置する必要があることを読み取ります。while (gameisrunning) ループに入れることができないのはなぜですか?

4

1 に答える 1

26

イベント ドリブン プログラミングでは、インタラクティブな OpenGL アプリケーションの場合と同様に、メイン アプリケーション ループは通常、次の 3 つのことを行います。

  1. 現在のイベント キューをチェックし、最後のチェック以降に発生したイベント (マウスの移動、キーの押下など) を処理します。
  2. アプリケーションの状態を更新します - プレーヤーとオブジェクトの位置、ゲームの物理など - 次のレンダリング フレームの準備
  3. 現在のフレームをレンダリングします。

GLUT はこれらのステップを暗黙のうちに実行glutMainLoop()します。登録するほとんどすべての GLUT コールバック (例: glutKeyboardFunc()glutReshapeFunc()など) は 1. を処理し、おそらく 2. を実行するように設定した関数を呼び出します。

でアイドル関数を登録するとglutIdleFunc()、現在のすべてのイベントが処理された後に呼び出されます。多くの場合、プログラマーはアイドル関数を実装して、シーンのレンダリングに使用するルーチン (つまり、 に渡すルーチンglutDisplayFunc()) を呼び出すだけです。このアプローチは、レンダリングを完了してから次のフレームのイベントを処理する時間がない可能性があるため、レンダリングに「時間がかかる」場合 (フレームのレンダリングにほぼ常に時間がかかる場合など) に問題が生じる可能性があります。あなたが言及したwhileループを挿入する場合、これを行うだけで、GLUTのネイティブイベント処理メカニズムが回避されます. GLUT をうまく扱うためのより良いアプローチは、アイドル関数を実装して呼び出しのみにすることです。glutPostRedisplay()これは、すべてのイベントが処理されてアイドル関数が呼び出される前に、ディスプレイ関数の呼び出しをスケジュールするように GLUT に指示します。

于 2013-03-27T22:34:50.900 に答える