プログラマーの卵の日記

備忘録になってます!小難しそうなことから超簡単なことまでやってます!!

読書による知見②-ダブルバッファと垂直同期

シングルバッファとダブルバッファ

 ダブルバッファについてはすごく浅いですが、DxLibを通じて前描画と裏描画とかScreenFlipとかで、ふ~~~~~ん程度に知ってました。

 それが本読んでたらそれについてしっかり書かれていたので忘れないためにも自分の言葉でまとめたいのでまとめます。

 

 まず、よく使うDxLibの方でダブルバッファシングルバッファをさせてみました。

正直シングルバッファの状態というものをちゃんとは知らないのでたぶんこうなんだろうなという気持ちでやってみました。

ちなみにDxLibはデフォルトで垂直同期しているのでこれも垂直同期しています。


ダブルバッファとシングルバッファの確認用

 

 それでダブルバッファシングルバッファというものですが、

そもそもダブルバッファを行わなければならない理由としては、ゲームにおいて「画面のティアリング」ということが起こるらしいです。正直上記の動画だと、ティアリングというものが本当に起こりえるのかよくわからないので、気になる人は「ティアリング」と検索して画像を見てください。

 要はズレみたいのが生じるものです。

 

 では、なぜティアリングが生じるかというと、シングルバッファというものは、プログラムが処理をしてピクセルごとに描画処理をしているときに、モニターが一切待たずにモニターに写しているせいです。

 プログラムではまだモニターの縦幅半分しか描画処理していないのにモニターが全部移してしまったら、上部は処理後だけど下部は以前の描画のままだったりするといった感じです。言葉だけだと難しいですね。

 

 

 そこでティアリングを防ぐためにダブルバッファというものが行われました。

画像にしてみました。

f:id:yutateno:20200302233319p:plain

 というのがダブルバッファです。見た目的には、描画処理が終わってからモニターに描画されてるのでちらつくとかズレるとかは無いと思います。

 

 

 

ダブルバッファと垂直同期

 ですが、そんなことを意に返さず、早めにモニターが描画してきてティアリングを発生してしまうやつもいるみたいです。言うなれば、早めに仕事終わったから帰ってきたニキ。

画像だとこんな感じ。たぶん。

f:id:yutateno:20200302234053p:plain

 

 こんなことあっては許せーんってことで出てきたのが垂直同期

内容としては、画像で言う「早く終わったからやっちゃうねー」っていうのを制御させるもので、

どんなに早くても「プログラムの描画処理」が完全に終わるまでバッファを切り替えないものです。ということは、待機時間が発生するのでフレッシュレート(fps)が落ちます。

でも、むやみに垂直同期をオンにしたままにすれば、FPS(ファーストパーソンシューティング)のゲームだと困りますよね。なので、大抵のゲームではユーザーが垂直同期をオンかオフに切り替えれるようにしています。

 垂直同期オンであれば、描画は綺麗になるがフレッシュレートが落ちる。

 垂直同期オフであれば、フレームレート乱れないがティアリングが発生してしまう可能性がある。

 

 まぁぶっちゃけハイエンドなPCやモニターであれば大丈夫なんですけどね。

 

 あと、垂直同期オフを想定したゲームを作成するのであれば、ある程度垂直同期オフでもフレッシュレートを60fpsや144fpsなど指定するようにしないと半端ないことになります。

 以下の動画はちゃんとそうなってるかわかりませんが、fpsを指定せず、ただ垂直同期をオフにしたようにしたものです。


ダブルバッファ 非垂直同期 FPS無制限