メインコンテンツまでスキップ

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 render
  • blocking 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全般に適用される待機方式ではありません。