glutdisplayfunc() がどのようにディスプレイをループさせるかを理解すると、Iv はいくつかの場所でゲームの仕組みをディスプレイではなく glutidle に配置する必要があることを読み取ります。while (gameisrunning) ループに入れることができないのはなぜですか?
1 に答える
イベント ドリブン プログラミングでは、インタラクティブな OpenGL アプリケーションの場合と同様に、メイン アプリケーション ループは通常、次の 3 つのことを行います。
- 現在のイベント キューをチェックし、最後のチェック以降に発生したイベント (マウスの移動、キーの押下など) を処理します。
- アプリケーションの状態を更新します - プレーヤーとオブジェクトの位置、ゲームの物理など - 次のレンダリング フレームの準備
- 現在のフレームをレンダリングします。
GLUT はこれらのステップを暗黙のうちに実行glutMainLoop()
します。登録するほとんどすべての GLUT コールバック (例: glutKeyboardFunc()
、glutReshapeFunc()
など) は 1. を処理し、おそらく 2. を実行するように設定した関数を呼び出します。
でアイドル関数を登録するとglutIdleFunc()
、現在のすべてのイベントが処理された後に呼び出されます。多くの場合、プログラマーはアイドル関数を実装して、シーンのレンダリングに使用するルーチン (つまり、 に渡すルーチンglutDisplayFunc()
) を呼び出すだけです。このアプローチは、レンダリングを完了してから次のフレームのイベントを処理する時間がない可能性があるため、レンダリングに「時間がかかる」場合 (フレームのレンダリングにほぼ常に時間がかかる場合など) に問題が生じる可能性があります。あなたが言及したwhileループを挿入する場合、これを行うだけで、GLUTのネイティブイベント処理メカニズムが回避されます. GLUT をうまく扱うためのより良いアプローチは、アイドル関数を実装して呼び出しのみにすることです。glutPostRedisplay()
これは、すべてのイベントが処理されてアイドル関数が呼び出される前に、ディスプレイ関数の呼び出しをスケジュールするように GLUT に指示します。