Frame graphとPenフレーム
Shadingは、フレーム途中の描画状態をそのまま画面へ出さないために、描画処理をframe graphとPen frame transactionへ集約します。
Frame graph
frame graphは、次のノードで構成されます。
Scene / Draw / Group / Composite / Transform
連続するScene mutationは、対象とcamera versionが同じ場合にバッチ化されます。flushは非同期で直列実行され、世代番号によって古い世代の描画結果を無効化できます。
PenFXがObjectsのグループ、render pass、matte、frame graph内で呼ばれた場合も、元の位置を保ったまま収集されます。
VM tickの契約
新規または変更されたMovie command blockは、Scratch VMへPromiseを返しません。非同期処理はMovieAssetManager.runWithoutWaitingで開始し、完了待ちは次のようなMovie内部状態で管理します。
pending visual renderblocking video render- frame graph promise
erase all、render block、stampの間にVM yieldを挿入しません。描画、マテリアル登録、テクスチャ設定がループ内 で呼ばれても、中間状態を表示しないようにします。
add materialは同名の既存リソースを毎回初期化せず、冪等に扱います。デコード済み資産のキャッシュとscene/material stateは分離し、再適用時にフォールバック画像を一瞬表示しません。
Pen frame transaction
pen_clearはframe graph収集中ならclearノードとして記録するpen_stampはframe graph収集中ならstampノードとして記録するresetPenForRenderFrameはstaging frameを開始し、既定背景を描画するrender frame本体と保留中のvisual workが完了するまでstaging frameをcommitしない- 停止、シーク、エラー、世代変更時はtransactionをcommitせずcancelする
この仕組みにより、フレーム途中で透明な空画面が露出したり、erase all後の空白フレームがちらついたりしません。フレームの途中で直接pen_clearを呼ぶのではなく、同じrender-frame transaction内でリセットを行います。
非同期資産と世代
資産の失敗はVMをPromise待ちにせず、MovieAssetManagerのrender error/diagnostics経路へ通知されます。対象削除、停止、シーク、プロジェクト変更、render cache generation更新時には、対象に紐づく古いqueueとbitmapを無効化します。
テク スチャはdecode完了後にgenerationと対象stateを検証します。モデル、ビデオ、テキストのqueueは対象ごとに直列化され、古いrequestが新しいmaterialを上書きしないようにします。
event_renderframeのscriptが保留中でも、同じフレームを再起動して時間を進めることはありません。保留処理の完了後に既存threadを継続します。
互換例外
looks_rendervideoのexact-frame primitiveは、旧プロジェクトが直後のstampで要求した動画フレームを消費できるよう、内部でblocking video renderとして追跡されます。これは新規command block全般に適用される待機方式ではありません。