【GMS2 Knowledge】イベントの実行順について(3)
前回に続いてイベントの実行順についてのお話。
今回はやっと描画のお話だけど、Surfaceについては深堀しないので、またいずれ。
Drawイベント
まずDrawイベントは大きく分けて二つあり、DrawイベントとDraw GUIイベントで性質が異なるため、本項では前者のDrawイベントについて触れていく。
via: The Draw Event@YoYoGames.com
上記の図のように、Drawイベントの中でも Pre Draw・Draw Begin・Draw・Draw End・Post Draw の5つの種類が存在する。
また、Draw Begin・Draw・Draw Endの1セットはViewに紐づいているため、設定されたView毎に実行される。
通常Drawイベント
通常Drawイベントは、オブジェクトに設定したSpriteやRoomに設定したBackgroundsやTilesの描画が実行される。
GMLで描画処理を通常Drawイベントに記述して実行すると、IDEで設定された上記の描画処理を上書きする事になる。
Draw Beginイベント
Draw Beginイベントは、上記の通常Drawイベントが実行される前に実行される。
ビューポートが設定され、ビューがクリアされた後すぐに実行されるイベント。
例えば複数のインスタンスが、実体・影を持っている場合に役に立つかもしれない。
1つのインスタンスに対して通常Drawイベントでのみ影を描画すると上記のように影の下にインスタンスが描画されてしまう。
しかし、影をDraw Beginイベントに、SpriteをDrawイベントに記述すると以下のような結果になる。
まずはすべてのインスタンスのDraw Beginイベントの描画処理を実行し、その後にすべてのインスタンスの通常Drawイベントが実行される。
Depthとは別の考え方でレイヤーのような重ね順を実装することができる。
Draw Endイベント
Draw EndイベントはDraw Beginイベントと同様に、すべての通常Drawイベントが実行し終わった後に実行されるDrawイベント。
つまり、もう1枚レイヤーを重ねたような効果を作り出すことが可能となる。
上記は、下(奥)のキャラクターのDraw Endイベントにエッジを赤く描いたSpriteを描画した例。
エッジ以外は上(手前)のキャラクターに隠れるが、エッジだけは上(手前)のキャラクターより手前に描画されている。
****
さて、ここまではView内で描画されるDrawイベントの説明だったが、ここから先はApplication Surfaceとの関係が深くなる。
Surfaceの説明は別で行うので深追いはしないが、Pre/Post Drawイベントは上記3つのDrawイベントとは性質の違うものである事だけ理解して読み進めてほしい。
Pre/Post Drawイベント
GMS2ではApplication Surfaceの描画までに以下のような処理になっている。
1. Application Surfaceに対して、設定されているViewの描画結果(各ビューのDraw Begin/Draw/Draw Endの処理結果)を描画する。
2. Application Surfaceをアプリケーションの描画領域に対して描画する。
上記のように、目に見える状態までに何段階かの描画処理を行っているが、GMS2では高速な描画を実現するためにGPUでの描画処理を行い、
最後にアプリケーションへの描画を行っている。
GPUの連続したこれらの処理をバッチングなどと呼ばれるが、GPUに対する命令を途中で出すとバッチングが途切れる場合がある。
これはGPUとCPUのやり取りの中で同期待ちが発生する事によるものなので、上手く処理をする必要がある。
さて、ここで本題に戻すが、Pre/Post Drawイベントがどのタイミングで実行されるかを改めて記載する。
1. Pre Drawイベント
2. Application Surfaceに対して、設定されているViewの描画結果(Draw Begin/Draw/Draw Endの処理結果)を描画する。
3. Post Drawイベント
4. Application Surfaceをアプリケーションの描画領域に対して描画する。
ざっくり言うと上記となる。
たとえて言うなら…
魔法を詠唱して発動して相手に当たる
みたいな処理。(謎)
魔法の詠唱=バッチング(上記のフローの2)
魔法の発動=Application Surface Reset(3の終わり)
相手に当たる=アプリケーションへの描画(4)
って感じ。
Pre Drawは魔法の詠唱を始める前なので、諸々準備ができそう
Post Drawは発動するタイミングなので、諸々調整できそう(相手の方向に狙いを定めるような)
この程度の認識で大丈夫。(本当か?)