前回はGLFWを使ってウインドウを出すところまで説明しました。今回は、ゲーム作りには欠かせないFPSとダブルバッファリングの話をしたいと思います。
今回の内容は次のようになります。
FPSのお話
さて、今回はダブルバッファリングの話のまえにOpenGLでの描画について簡単に説明しておきます。ゲームでは滑らかなアニメーションを再現するためにパラパラアニメーション方式をとっています。少しづつ変化をつけた絵を高速に切り替えることで滑らかなアニメーションに見せることができます。映画や漫画でもおなじみの方法ですね。要は、小学校の頃ノートの隅に書いたパラパラアニメと同じ原理です。ゲームではこの一枚一枚の絵のことをフレームと呼びます。
FPS(Frame Per Second)は1秒間に何枚のフレームを切り替えるかを示したものです。映画だと1秒間に24枚表示するのでFPS=24です。ゲームだと少なくとも30枚、普通は60枚表示するのでFPS=60が基本になります。描画計算が膨大だったり、ゲームロジックの処理が重かったりして、極端にFPSが落ちてしまうとゲームの動きがカクカクしてしまい、「処理落ち」が発生してしまいます。処理落ちが発生しないよう、何があっても60FPSは死守する、というプロジェクトも良く見かけます。
ダブルバッファリング
続いてダブルバッファリングのお話をしたいと思います。ダブルバッファリングというのは画面のチラツキを抑えるために考えられた技術です。ダブルバッファリングが考案される前、前フレームから次のフレームに移行する場合、表示中の画像(フロントバッファ)を直接ガシガシと書き換えていました。描画のたびにglClearメソッドで背景色で画面を塗りつぶすので、これがちらつきの原因になっていました。
そこで、このチラツキを抑えるために考えられたのがダブルバッファリングです。ダブルバッファリングでは、直接表示中の画像(フロントバッファ)を書き換えることはせず、もう一枚バックバッファを用意し、バックバッファに対して次のフレームを描画します。バックバッファの描画が終わったらフロントバッファとバックバッファを入れ替えます。こうすることで、シングルバッファリングの時のようなチラツキがなくなり、スムーズなアニメーションが可能になります。ダブルバッファリングの流れは次のとおりです。
- バッファのクリア
- バックバッファに描画する
- フロントバッファとバックバッファを入れ替える
GLFWではダブルバッファリングのみが可能です。上で説明したフロントバッファとバックバッファを入れ替える操作が前回紹介したglfwSwapBuffers()です。前回の記事のゲームループの中を見ると上の流れになっていますね。このようにダブルバッファリングを使うことで、ゲームの描画がスムーズに行われるようになります。
// ゲームループ while (!glfwWindowShouldClose(window)) { // バックバッファのクリア glClearColor(0.2f, 0.2f, 0.2f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); // バックバッファに描画する // バックバッファとフロントバッファのスワップ glfwSwapBuffers(window); }
ダブルバッファリングのまとめ
今回は、ウインドウにポリゴンを描画するはずだったんですが・・・、FPSのお話とダブルバッファリングのお話で終わってしまいました。次回は、座標変換や行列のお話をしたいと思います。少しややこしいですがOpenGLでプログラムを書く上で大切なポイントなのでしっかり理解していきましょう。
参考図書
「ゲームプログラマになる前に覚えておきたい技術」
この本はゲームを動かすための技術を1から理解できるように解説してくれています。今回説明したダブルバッファリングのお話や、キャッシュの話とか浮動小数点演算の話などのちょっと難しい話、最適化手法の話まで幅広くカバーされています。ページ数も872ページとボリューミィ!絶対に一度は読んでおきたい一冊です。
「Unity5の教科書」
私の書いたUnityを使ったゲーム開発本です。OpenGLとは少しずれますが、パーティクルや衝突判定などゲームには欠かせない話もしっかりと説明しているので、ゲームを作りたい方はぜひ!
「OpenGLプログラミングガイド 原著第5版」
OpenGLといったらまずはコレ。通称赤本と呼ばれるバイブルです。とりあえず、ちょこちょこと参照することが多いので、手元に置いておきたい(というか重すぎてモバイルは無理)一冊です。OpenGLをやるぞ、という意気込み(もしくは自分へのプレッシャ)で買ってしまう一冊です。コレを買ったら後戻りは出来ません。。。