- ベストアンサー
OpenGLでの描画のタイミング
- OpenGLを使用して3Dゲームを作成していますが、処理が遅くなりカクカクした動きになってしまいます。
- 描画の量が増えるにつれて処理時間が遅くなるため、描画のタイミングに問題があるようです。
- 対策として、一定時間待機する秒数を可変的にする方法と、描画のタイミングを変える方法を考えましたが、より良い方法はないか悩んでいます。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
OpenGLではglVertex等を呼び出すとその都度描画を実行するのではなく、複数の処理をまとめて実行するようになっています。 glFlushは、それが呼び出された時点で未消化の命令がある場合それを全部実行する、という処理なので1と2はセットと考えたほうが良いです。 したがって、処理の手順の分類としては 1「描画関数の実行」(glVertex3f()などの実行 == 見えていないバッファに描画) 2「裏表入れ替え」(2つのバッファを交換) 0「一定時間待機して自分自身を呼び出す」 が正しいです。 【1】について 予想されている仮定で正しいと思います。 待機時間を一定にした場合、 FPS = 1秒 / ( 毎フレームで必要な処理時間 + 待機時間 ) となってしまい、狙ったFPSにはなりません。 ちなみに、動画を再生するような場合、 現フレームまでに経過しているはずの時間 = FPS * 処理したフレーム数 次の待機時間 = 現フレームまでに経過しているはずの時間 - 実際に経過した時間 という感じで処理しなければずれが発生します。 【2】について これはおそらく意味は無いと思います。 1を開始点としてみると 修正前: 描画関数の実行 → 裏表入れ替え → 一定時間待機 → 描画関数の実行 → ... 修正後: 描画関数の実行 → 一定時間待機 → 裏表入れ替え → 描画関数の実行 → ... となるだけで結果にはほとんど違いは無いと思います。 「裏表入れ替え」を行うと、もっと最後に処理したOpenGLの命令によって作られたレンダリング結果が画面に反映されることになるので、 修正前:直前に処理した描画内容が画面に表示された状態で待機 修正後:2回前に処理した描画内容が画面に表示された状態で待機 となり、おそらくこれはやらないほうが良いと思います。 基本的には、処理落ちしている場合、 > 「1」を速くするしか方法はない ということになります。
お礼
回答ありがとうございます^^ 【1】の方法で修正してみます. あとは「1」の処理を少しずつ改善していきたいと思います.