1. ホーム
  2. c++

[解決済み] freeglutにおけるglutidlefunc()の意味するところ

2022-02-01 18:09:12

質問

glutdisplayfunc()がどのように表示をループさせるか、Ivはいくつかの場所で表示ではなくglutidleにゲームの仕組みを置くべきだと読みました; なぜそれらをwhile (gameisrunning) ループに置くことができないのですか?

どのように解決するのですか?

インタラクティブなOpenGLアプリケーションにあるようなイベント駆動型プログラミングでは、一般的にメインアプリケーションのループは3つのことを行います。

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

GLUTはこれらのステップを暗黙のうちに glutMainLoop() を使用します。 あなたが登録するGLUTコールバックのほとんどすべて(例えば。 glutKeyboardFunc() , glutReshapeFunc() など)が1.を担当し、2.はおそらく設定した関数を呼び出します。

ここで、アイドル関数を glutIdleFunc() の場合、現在のイベントがすべて処理された後に呼び出されます。 多くの場合、プログラマはシーンのレンダリングに使用するルーチン(つまり、Idle関数に渡すルーチン)を単に呼び出すためにIdle関数を実装します。 glutDisplayFunc() ). この方法は、レンダリングにしばらく時間がかかる場合(たとえば、1 フレームのレンダリングにほぼすべての時間がかかる場合)、レンダリングを完了してから次のフレームのイベントを処理する時間がない可能性があるため、問題になることがあります。 もし、あなたが言及したwhileループを挿入するとしたら、まさにこれを行うことになり、GLUTのネイティブなイベント処理機構を回避することになります。 GLUTとうまく付き合うには、アイドル関数を実装して glutPostRedisplay() これは、すべてのイベントが処理された後、アイドル関数が呼び出される前に、表示関数の呼び出しをスケジュールするようにGLUTに指示します。