いまいちわからん!Application Surfaceとバックバッファの関係

GML中級者のみなさんはApplication Surfaceという用語をよく聞くかもしれません。
いまいちこれが何を意味しているのかよく分かりませんよね。
特にゲームにおいてはかなり使われるフォーマットをGMS2ではそう呼んでいるだけで、概念としてはかなり共通なところが多いので、覚えておくと得をする一つの要素です。

是非読んでみてください。

描画の仕組み

まず、ゲームにおいては「FPS」の速さでパラパラ漫画のように描画されて、ゲームが動いているように見えるのはわかりますよね。

1フレーム目を描画⇒描画内容をクリア⇒2フレーム目を描画…

こんな感じで描画されています。
描画をもっと細かく見ると、左上から1pxずつ色を描画します。

処理の負荷が高いと、いずれかのピクセルを描画するタイミングで描画処理が一瞬止まってしまうため、画面のチラつきが起きたり、描画過程が見えてしまったりします。

ダブルバッファリング

ダブルバッファリングとは、先述した画面のチラつきなどの問題を解決するための仕組みです。

その名の通り『フロントバッファ』『バックバッファ』の2種類の画面が存在しています。
そして、片方で描画した結果をもう片方に描画するという2段階の手順を行う事で、チラつきなどの問題が解消されるというわけです。

上記でも、なぜ問題が解決するのかがわかりづらいかもしれませんね。

FPSを安定させるのは物理的にどうしようもない場合もあるので、処理負荷がかかってFPSが落ちたとしても前のフレームか描画し終わった今のフレームのどちらかを描画する仕組みにしたわけです。

ダブルバッファリングとGMS2の仕組み

GMS2では『バックバッファ』が存在し、『Application Surface』が『フロントバッファ』です。
以下の図のように描画処理がされています。

backbuffer

少しわかりづらいかもしれませんが、左から右へ流れていきます。

まず基本的に何かを描画する場合はApplication Surfaceに描画されます。
そしてPost Drawイベントの最後にApplication Surfaceがバックバッファに描画され、初めてユーザーの目に見える状態になります。
次のフレームに行くとPre Drawイベントの最後にApplication Surfaceがクリアされ真っ白なキャンバスが生まれ、また各イベントの描画ができるわけです。

先述したダブルバッファリングの仕組みになっているのがわかるでしょうか?

Application Surfaceをイジるときの注意

リサイズタイミング

例えばsurface_resize()関数を使用すると、サーフェイスは拡縮されたりトリミングされるわけではなく、すべての内容をクリアして新しいサイズに作り直します。
以下のようなコードを記述する場所に気を付けてください。

surface_resize(application_surface, width, height);

ドローイベント以外で行わないとチラつきに似た現象が起きるかもしれません。

コピータイミング

シェーダーを使う場合や、ポーズのために画面をコピーしたい時によく使います。
この場合はPost Drawイベントを使うと効率がいいと思います。
Draw GUI系のイベントはDraw系のイベントとは別のかたまりとして処理されているため、ベストな選択とは言いにくいと思います。

最終結果をバックバッファに描画する瞬間のイベントですので、よほど複雑な作りでない限りApplication Surfaceにはユーザーが見るはずの結果が描画されています。

注意点はPre DrawPost Drawイベント内でdraw_関数を使用した場合、Application Surfaceではなく『バックバッファ』に直接描画されてしまいます。

対処方法は以下のようにしましょう。

surface_set_target(application_surface);
draw_text(0,0,"test");
surface_reset_target();

また、指定する座標はウィンドウ基準なので、ルーム内の位置ではない点も注意してください。

まとめ

Application Surfaceは描画において避けては通れない要素の一つです。
複雑な感じがするかもしれませんが、自由に操る事ができればかなり色々な事ができるので、是非色々試してみましょう。

もしサーフェイス自体がよく分からない場合は、私のnoteのチュートリアルも併せて読んでみてください。

Related Posts

フラグをたくさん増やして管理しきれない?ビットフラグを使いこなす!
フラグというのはゲームにおいてかなり重要になってくる要素の一つだと思います。 例えばそのステージをクリアしているかどうか?とか装備をしている箇...
いよいよ明後日19日からGM48が開始!48時間で完成させる戦略を練ってみた
GM48開催が明日に迫っています。 私自身初参加となりますし、本当に48時間で完成できるのか不安です。 そこで、完成させる戦略を練るために、様々...
セーブデータのセキュリティはどこまで必要か?
セーブデータのセキュリティはどこまで必要か? ゲーム開発者にとって頭を悩ませる要素の一つだと思います。 しかしこの悩みは目的を見直すことで解決す...
GMS2ファーストリファレンスを追加しました
GMS2ファーストリファレンスと銘打ってブログとは別コンテンツとしてサイトに追加しました。 どんな形にするかすごく迷っていたんですが、本のよう...
第32回!GMS2の世界的ゲームジャム『GM48』が開催!
来週19日から四半期に1度開催されるGameMakerのゲームジャム『GM48』が開催されます! スケジュールは以下の通り。 日時 内容 10月7日...