RenderingNG の主なデータ構造

Chris Harrelson
Chris Harrelson
Daniel Cheng
Daniel Cheng
Philip Rogers
Philip Rogers
Koji Ishi
Koji Ishi
Ian Kilpatrick
Ian Kilpatrick
Kyle Charbonneau
Kyle Charbonneau

それでは、主なデータ構造を見てみましょう。データ構造は、テーブルへの入力と出力です。 レンダリング パイプラインです。

データ構造は次のとおりです。

  • フレームツリーは、ローカルノードとリモートノードで構成され、各ノードがどのウェブ レンダリング プロセスと Blink レンダラを確認できます。
  • イミュータブル フラグメント ツリーは、 必要があります。
  • プロパティ ツリーは変換、クリップ、効果、スクロールの階層を表す ありません。これらはパイプライン全体で使用されます。
  • ディスプレイ リストとペイント チャンクは、ラスターおよびレイヤ化アルゴリズムへの入力です。
  • コンポジタ フレーム: サーフェス、レンダリング サーフェス、GPU テクスチャをカプセル化します。 GPU を使用して描画するために使用されるタイルです。

これらのデータ構造について説明する前に、 1 つ目はアーキテクチャレビューですこの の使用例がこのドキュメント全体で使用されています。 適用できます。

<!-- Example code -->
<html>
  <div style="overflow: hidden; width: 100px; height: 100px;">
    <iframe style="filter: blur(3px);
      transform: rotateZ(1deg);
      width: 100px; height: 300px"
      id="one" src="foo.com/etc"></iframe>
  </div>
  <iframe style="top:200px;
    transform: scale(1.1) translateX(200px)"
    id="two" src="bar.com"></iframe>
</html>

フレームツリー

Chrome がクロスオリジン フレームのレンダリングを選択することがある 親フレームとは別のレンダリング プロセスで行います。

このサンプルコードには、合計 3 つのフレームがあります。

2 つの iframe を含む親フレーム foo.com。

サイト分離により、Chromium はこのウェブページをレンダリングするために 2 つのレンダリング プロセスを使用します。 各レンダリング プロセスには、そのウェブページのフレームツリーが独自に表現されています。

2 つのレンダリング プロセスを表す 2 つのフレームツリー。

別のプロセスでレンダリングされたフレームはリモート フレームとして表されます。 リモート フレームは、レンダリング時にプレースホルダとして機能するために必要な最小限の情報を保持します。 ディメンションなどを指定できます それ以外の場合、リモート フレームには実際のコンテンツをレンダリングするために必要な情報が含まれません。

これに対して、ローカル フレームは標準規格を パイプラインを実行できますローカル フレームには、回転させるのに必要な情報がすべて そのフレームのデータ(DOM ツリーやスタイル データ)を 基づいています。

レンダリング パイプラインは、 ローカル フレームツリー フラグメント: foo.com をメインフレームとする複雑な例を考えてみましょう。

<iframe src="bar.com"></iframe>

次の bar.com サブフレームがあるとします。

<iframe src="foo.com/etc"></iframe>

レンダラは 2 つしかないが、ローカル フレームは 3 つある ツリー フラグメント。foo.com のレンダリング プロセスに 2 つと、 bar.com のレンダリング プロセス:

2 つのレンダリングと 3 つのフレームツリー フラグメントの表現。

ウェブページ用に 1 つのコンポジタ フレームを生成するには、 Viz は、それぞれのルートフレームからコンポジタ フレームを同時にリクエストします。 3 つのローカル フレームツリー、 集約します。 コンポジタ フレームのセクションもご覧ください。

foo.com メインフレームと foo.com/other-page サブフレーム 同じフレームツリーの一部となり、同じプロセスでレンダリングされます。 ただし、2 つのフレームは依然として独立して ドキュメント ライフサイクル 異なるローカル フレームツリー フラグメントの一部であるためです。 このため、1 回の更新で両方に対して 1 つの合成フレームを生成することは不可能です。 レンダリング プロセスに十分な情報がない foo.com/other-page 用に生成されたコンポジタ フレームを合成する foo.com メインフレームのコンポジタ フレームに直接挿入します。 たとえば、プロセス外の bar.com 親フレームが foo.com/other-url iframe の表示に影響することがあります。 CSS を使って iframe を変換したり、DOM 内の他の要素で iframe の一部を隠したりします。

ビジュアル プロパティ更新ウォーターフォール

デバイスのスケール ファクタやビューポートのサイズなどの視覚的プロパティがレンダリングされた出力に影響する ローカルのフレームツリー フラグメント間で同期する必要があります。 各ローカル フレームツリー フラグメントのルートには、ウィジェット オブジェクトが関連付けられています。 ビジュアル プロパティの更新は、伝播前にメインフレームのウィジェットに移動される 上から下に残るウィジェットに 移動します

たとえば、ビューポートのサイズが変更された場合は次のようになります。

前述のテキストで説明したプロセスの図。

この処理は即時には行われません。 そのため、複製されたビジュアル プロパティにも同期トークンが含まれています。 Viz コンポジタはこの同期トークンを使用して、すべてのローカル フレームツリー フラグメントを待機する 現在の同期トークンを含むコンポジタ フレームを送信します。 このプロセスにより、異なる視覚的プロパティを持つコンポジタ フレームが混在するのを回避できます。

イミュータブル フラグメント ツリー

不変のフラグメント ツリーは、レンダリングのレイアウト ステージの出力です。 説明しますページ上のすべての要素の位置とサイズを表します。 (変換が適用されません)。

各ツリー内のフラグメントを表し、1 つのフラグメントがレイアウトが必要としてマークされています。

各フラグメントは、DOM 要素の一部を表します。 通常、要素ごとにフラグメントは 1 つだけですが、 印刷時に複数のページに分割されている場合 複数列のコンテキストでは 複数の列に分割できます

レイアウト後、各フラグメントは不変になり、再度変更されることはありません。 重要な点として、追加の制限もいくつか適用されます。Google がしないこと:

  • 任意の「アップ」を許可する参照です。 (子には親へのポインタを設定できません)。
  • 「ふきだし」ツリーの下位レベルに (子は子からの情報のみを読み取り、親からは読み取りません)。

こうした制限により、後続のレイアウトでフラグメントを再利用できるようになります。 こうした制限がなければ、ツリー全体を再生成することが多くなり、コストがかかります。

ほとんどのレイアウトは通常、増分アップデートです。たとえば、 ユーザーが要素をクリックしたときに UI の一部を更新するウェブアプリ。 レイアウトは、画面上で実際に変更された内容に比例して動作するのが理想的です。 これは、前のツリーをできるだけ多く再利用することで実現できます。 つまり、(通常は)木の背骨を再構築するだけで済みます。

将来的には、この不変の設計により、興味深いことができるようになる可能性があります たとえば、必要に応じてスレッドの境界を越えて不変のフラグメント ツリーを渡すなど、 (後続のフェーズを別のスレッドで実行するため) 滑らかなレイアウト アニメーションのために複数のツリーを生成する 並列投機的レイアウトを実行できます また、レイアウト自体にもマルチスレッド処理の可能性がもたらされます。

インライン フラグメント アイテム

インライン コンテンツ(主にスタイル設定されたテキスト)では、表現が若干異なります。 ボックスとポインタからなるツリー構造ではなく インライン コンテンツをツリーを表すフラットリストで表現します。 主な利点は、インラインのフラットリスト表現が高速であり、 インラインのデータ構造の検査やクエリに メモリ効率が良くなります。 これはウェブ レンダリングのパフォーマンスにとって非常に重要ですが、 非常に複雑なため 高度に最適化しない限り パイプラインで最も遅い部分になりやすいです

フラットリストは インライン書式設定コンテキスト そのインライン レイアウト サブツリーを深さ優先検索の順序で検索します。 リスト内の各エントリは、(オブジェクト、子孫の数)のタプルです。 たとえば、次の DOM について考えてみましょう。

<div style="width: 0;">
  <span style="color: blue; position: relative;">Hi</span> <b>there</b>.
</div>

width プロパティが 0 に設定されているため、行が「Hi」で囲まれます。「there」です。

この状況のインライン書式設定コンテキストをツリーとして表すと、 次のようになります。

{
  "Line box": {
    "Box <span>": {
      "Text": "Hi"
    }
  },
  "Line box": {
    "Box <b>": {
      "Text": "There"
    }
  },
  {
    "Text": "."
  }
}

フラットリストは次のようになります。

  • (折れ線ボックス、2)
  • (ボックス <span>、1)
  • (テキスト「こんにちは」、0)
  • (ラインボックス、3)
  • (ボックス <b>、1)
  • (テキスト「そこ」、0)
  • (テキスト「.」, 0)

このデータ構造には、ユーザー補助 API、 などのジオメトリ API をサポートしています。 getClientRects および contenteditable。 それぞれに異なる要件があります。 これらのコンポーネントは、コンビニエンス カーソルを使用してフラットなデータ構造にアクセスします。

カーソル MoveToNextMoveToNextLineCursorForChildren などの API があります。 このカーソル表現は、テキスト コンテンツにおいて非常に効果的です。これには次のような理由があります。

  • 深度優先検索の反復処理は非常に高速です。 キャレットの動きに似ているため、よく使用されます。 フラットリストなので深さ優先の検索では配列のオフセットが増加するだけなので、 高速なイテレーションとメモリ局所性を実現します
  • 幅優先の検索を提供します。これは、たとえば、 背景を描画します
  • 子孫の数を知ることで、次の兄弟姉妹に素早く移動できます。 (配列のオフセットをその数値だけ増分します)。

プロパティ ツリー

DOM は要素(とテキストノード)のツリーであり、CSS ではさまざまな要素を 適用できます。

これは次の 4 つの方法で表示されます。

  • レイアウト: レイアウト制約アルゴリズムへの入力。
  • ペイント: 要素をペイントしてラスターする方法 (ただし、その子孫は対象外です)。
  • 視覚的: DOM サブツリーに適用されるラスター効果や描画効果 (変換、フィルタ、クリッピングなど)です。
  • スクロール: 軸に揃えて角丸 含まれるサブツリーのクリッピングとスクロールが 自動的に行われます

プロパティ ツリーは、視覚的効果やスクロール効果が DOM 要素にどのように適用されるかを説明するデータ構造です。 このツールは、 特定の DOM 要素 どうすればよいでしょうか。 視覚効果やスクロール効果を適用するには、どのような GPU 操作を使用する必要がありますか?

ウェブでの視覚効果やスクロール効果は非常に複雑で、その魅力は絶大です。 プロパティツリーが最も重要なのは、 構造と意味を正確に表す単一のデータ構造に統合します。 同時に、DOM と CSS のその他の複雑さが取り除かれました これにより、より確実な方法で合成とスクロールを行うアルゴリズムを実装できます。具体的には、次のとおりです。

  • エラーが発生しやすいジオメトリなどの計算 1 か所に一元化できます
  • プロパティ ツリーの作成と更新の複雑さ 1 つのレンダリングパイプラインステージに 分離されます
  • プロパティ ツリーをさまざまなスレッドやプロセスに送信する方が、完全な DOM 状態よりもはるかに簡単で高速です。 多数のユースケースに利用できます
  • ユースケースが多ければ多いほど 上に構築されたジオメトリのキャッシュから より多くのメリットを得られます 相互に再利用できるためキャッシュです。

プロパティ ツリーは、RenderingNG で次のようなさまざまな目的で使用されます。

  • ペイントからの合成とメインスレッドからの合成の分離。
  • 最適な合成 / 描画戦略の決定。
  • 測定 IntersectionObserver ジオメトリ。
  • 画面外要素と GPU テクスチャ タイルの処理を回避。
  • ペイントとラスターを効率的かつ正確に無効化。
  • 測定 レイアウト シフトと Core Web Vitals の Largest Contentful Paint

すべてのウェブ ドキュメントには、transform、clip、effect、scroll という 4 つのプロパティ ツリーがあります(*)。 変換ツリーは、CSS の変換とスクロールを表します。 (スクロール変換は 2D 変換行列として表されます)。 クリップツリーは はみ出すクリップ。 効果ツリーは、不透明度、フィルタ、マスク、その他のすべての視覚効果を表します。 ブレンドモード、クリップパスなどの他の種類のクリップもサポートしています。 スクロールツリーはスクロールや スクロールやスクロールなどの チェーンをまとめる コンポジタ スレッドでスクロールを実行するために必要です。 プロパティ ツリーの各ノードは、DOM 要素によって適用されるスクロールまたは視覚効果を表します。 複数の効果がある場合は 同じ要素の各ツリーに複数のプロパティ ツリーノードが存在する場合があります。

各ツリーのトポロジは、DOM のスパース表現のようなものです。 たとえば、3 つの DOM 要素にオーバーフロー クリップがある場合、 クリップツリー ノードが 3 つ、 クリップツリーの構造は、 オーバーフロー クリップ間の包含ブロック関係を示します。 木と木の間にもつながっています。 これらのリンクは相対的な DOM 階層を示しています。 適用の順序が決まります。 たとえば、ある DOM 要素の変換が、フィルタが設定された別の DOM 要素の下にある場合、 フィルタの前に変換が適用されます

各 DOM 要素にはプロパティ ツリー状態があり、 4 タプル(変換、クリップ、効果、スクロール) 最も近くにある 1 つの祖先クリップを示す その要素に適用される各種のツリーノードが 作成されます。 この情報からクリップのリストを正確に把握できるため、非常に便利です。 その要素に適用する効果、変換、 順序を指定します。 これにより、画面上の位置と描画方法がわかります。

出典

<html>
  <div style="overflow: scroll; width: 100px; height: 100px;">
    <iframe style="filter: blur(3px);
      transform: rotateZ(1deg);
      width: 100px; height: 300px"
  id="one" srcdoc="iframe one"></iframe>
  </div>
  <iframe style="top:200px;
      transform: scale(1.1) translateX(200px)" id=two
      srcdoc="iframe two"></iframe>
</html>

前述の例(冒頭部分の例とは少し異なる例)では、 生成されるプロパティ ツリーの主な要素は次のとおりです。

プロパティ ツリーのさまざまな要素の例。

リストを表示してチャンクをペイントする

表示アイテムには、下位レベルの描画コマンドが含まれます( こちら) ラスタライズ可能な Skia. 表示アイテムは通常、枠線や背景の描画など、いくつかの描画コマンドのみを使用するシンプルなものです。ペイント ツリー ウォークは、CSS の描画順序に従って、レイアウト ツリーと関連フラグメントを反復処理します。 アイテムのリストを作成します。

例:

「Hello World」と書かれた青いボックス緑の長方形の中に表示されます

<div id="green" style="background:green; width:80px;">
    Hello world
</div>
<div id="blue" style="width:100px;
  height:100px; background:blue;
  position:absolute;
  top:0; left:0; z-index:-1;">
</div>

この HTML と CSS を使用すると、次のようなディスプレイ リストが生成されます。 各セルは 1 つの表示項目です。

ビューの背景 #blueのバックグラウンド #greenのバックグラウンド #green インライン テキスト
drawRect(サイズ 800x600、色: White) 位置 0,0、サイズ 100x100、色: blue の drawRect drawRect(位置 8.8、サイズ 80x18、色: 緑色) 位置 8、8、テキスト「Hello world」の drawTextBlob

アイテム リストは逆から上に並べられます。 上の例では、DOM 順で緑の div が青い div の前にあり、 CSS の描画順序により、負の Z-Index の青い div が描画される必要があります ステップ 3 の緑色の div 要素 (ステップ 4.1)。 表示するアイテムは、CSS のペイント順序仕様のアトミックなステップにほぼ対応しています。 1 つの DOM 要素から複数の表示オプションが作成されることもありますが、 #green で、背景用のディスプレイ アイテムとインライン テキスト用のもう一つのディスプレイ アイテムをどのように設定するかなどです。 この粒度は、CSS のペイント順序仕様の完全な複雑さを表すために重要です。 負のマージンによって作成されたインターリーブなど:

グレーのボックスが部分的に重なっている緑色の長方形と「Hello world」というテキスト。

<div id="green" style="background:green; width:80px;">
    Hello world
</div>
<div id="gray" style="width:35px; height:20px;
  background:gray;margin-top:-10px;"></div>

これにより、次のディスプレイ リストが生成されます。各セルは 1 つのアイテムです。

ビューの背景 #greenのバックグラウンド #grayのバックグラウンド #green インライン テキスト
drawRect(サイズ 800x600、色: White) drawRect(位置 8.8、サイズ 80x18、色: 緑色) サイズ 35x20、位置 8、16、色: drawRect 位置 8、8、テキスト「Hello world」の drawTextBlob

ディスプレイ アイテム リストが保存され、以降の更新で再利用されます。 ペイント ツリー ウォーク中にレイアウト オブジェクトが変更されていない場合、 前のリストからコピーされます。 CSS のペイント順序仕様のプロパティに依存する最適化もあります。 スタック コンテキストはアトミックに描画されます。 スタック コンテキスト内でレイアウト オブジェクトが変更されていない場合、 ペイント ツリー ウォークでスタック コンテキストがスキップされる 前のリストから表示アイテムのシーケンス全体をコピーします。

ペイントツリー ウォーク中は現在のプロパティ ツリーの状態が維持される ディスプレイアイテムのリストは「チャンク」にグループ化され同じプロパティ ツリー状態を共有している一部の表示項目が除外されます。 これを次の例に示します。

ピンクのボックスとオレンジ色のボックスが傾いている。

<div id="scroll" style="background:pink; width:100px;
   height:100px; overflow:scroll;
   position:absolute; top:0; left:0;">
    Hello world
    <div id="orange" style="width:75px; height:200px;
      background:orange; transform:rotateZ(25deg);">
        I'm falling
    </div>
</div>

これにより、次のディスプレイ リストが生成されます。各セルは 1 つのアイテムです。

ビューの背景 #scrollのバックグラウンド #scroll インライン テキスト #orangeのバックグラウンド #orange インライン テキスト
drawRect(サイズ 800x600、色: White) drawRect(位置 0、0、サイズ 100x100、色: ピンク) 位置が 0、0、テキストが「Hello World」の drawTextBlob drawRect(位置 0,0、サイズ 75×200、色: オレンジ色) 位置 0,0 とテキスト「I'mfalling」のdrawTextBlob

この場合、変換プロパティ ツリーとペイント チャンクは次のようになります(簡略化のために簡略化しています)。

前の表の画像。チャンク 1 の最初の 2 つのセル、チャンク 2 の最初の 2 つのセル、チャンク 3 の最後の 2 つのセル。

ペイント チャンクの順序付きリスト、 プロパティ ツリーの状態を示すグループです。 レンダリング パイプラインの階層化ステップへの入力です。 ペイント チャンクのリスト全体を 1 つの合成レイヤにマージして、一緒にラスタライズできます。 しかしこの方法では、ユーザーがスクロールするたびに負荷の高いラスタライズが必要になります。 塗料チャンクごとに合成レイヤを作成できる すべての再ラスタライズを回避するために個別にラスタライズされますが、GPU メモリがすぐに使い果たされてしまいます。 階層化のステップでは、GPU メモリと、状況が変化した場合のコスト削減との間でトレードオフを行う必要があります。 推奨される一般的なアプローチは、デフォルトでチャンクをマージすることです。 コンポジタ スレッドで変化することが予想されるプロパティ ツリー状態を持つペイント チャンクをマージしないこと。 コンポジタ スレッドのスクロールやコンポジタ スレッドの変換アニメーションなどで使用する必要があります。

上記の例では、理想的には、次の 2 つの合成レイヤを生成する必要があります。

  • 描画コマンドを含む 800x600 の合成レイヤ: <ph type="x-smartling-placeholder">
      </ph>
    1. drawRect(サイズ 800x600、色: White)
    2. drawRect(位置 0、0、サイズ 100×100、色: ピンク)
  • 描画コマンドを含む 144x224 の合成レイヤ: <ph type="x-smartling-placeholder">
      </ph>
    1. 位置が 0、0、テキストが「Hello World」の drawTextBlob
    2. 0,18 相当を翻訳
    3. rotateZ(25deg)
    4. drawRect(位置 0,0、サイズ 75×200、色: オレンジ色)
    5. 位置 0,0 とテキスト「I'mfalling」のdrawTextBlob

ユーザーが #scroll をスクロールすると、 2 番目の合成レイヤは移動されますが、ラスタライズは必要ありません。

: 説明しましたが、 6 つのペイントチャンクがあります プロパティ ツリーの状態(変換、クリップ、効果、スクロール)と合わせて、以下のようになります。

  • ドキュメントの背景: ドキュメントのスクロール、ドキュメント クリップ、ルート、ドキュメントのスクロール。
  • div の水平方向、垂直方向、スクロールの角(3 つの個別のペイント チャンク): ドキュメントのスクロール、ドキュメント クリップ、#one ぼかし、ドキュメントのスクロール。
  • iframe #one: #one 回転、オーバーフロー スクロール クリップ、#one ぼかし、div スクロール。
  • iframe #two: #two 縮尺、ドキュメント クリップ、ルート、ドキュメントのスクロール。

コンポジタ フレーム: サーフェス、レンダリング サーフェス、GPU テクスチャ タイル

ブラウザとレンダリング プロセスはコンテンツのラスタライズを管理します。 コンポジタ フレームを Viz プロセスに送信して画面に表示します。 コンポジター フレームはラスター化されたコンテンツをつなぎ合わせる方法を表す GPU を使って効率的に描画します。

タイル

理論上 レンダリング プロセスまたはブラウザ プロセス コンポジタでピクセルがラスタライズされることがある フルサイズの 1 つのテクスチャに変換し、そのテクスチャを Viz に送信します。 これを表示するには、ディスプレイ コンポジタでピクセルをコピーするだけで済みます。 その単一のテクスチャからフレーム バッファの適切な位置に読み込みます。 (画面など)。ただし、そのコンポジターが 1 ピクセルでビューポート全体をラスタライズし、新しいテクスチャを Viz に送信する必要があります。

代わりに、ビューポートはタイルに分割されます。 個別の GPU テクスチャ タイルが、ビューポートの一部に対してラスタライズされたピクセルを使用して各タイルをバックアップします。 レンダラは個々のタイルや 既存のタイルの画面上の位置を変更するだけです たとえば ウェブサイトをスクロールするときは 既存のタイルの位置が上がったり ページの下流のコンテンツでは新しいタイルをラスタライズする必要があります。

<ph type="x-smartling-placeholder">
</ph> 4 枚のタイル。
この画像は、晴れた日の 4 つのタイルを表しています。 スクロールが発生すると、5 番目のタイルが表示され始めます。 タイルの 1 つが 1 つの色(スカイブルー)になっている場合、 上部に動画と iframe があります。

クアッドとサーフェス

GPU テクスチャ タイルは、特別な種類のクワッドです。 テクスチャのあるカテゴリを表す華やかな名前です。 クワッドは入力テクスチャを識別し、そのテクスチャを変換して視覚効果を適用する方法を示します。 たとえば、通常のコンテンツ タイルには、タイルグリッド内の x、y 位置を示す変換があります。

GPU テクスチャ タイル。

これらのラスタライズされたタイルは、クワッドのリストであるレンダリング パスにラップされます。 レンダリング パスにはピクセル情報は含まれません。 望ましいピクセル出力を生成するために、各クワッドをどこで、どのように描画するかが指示されます。 GPU テクスチャ タイルごとに描画クワッドがあります。 ディスプレイ コンポジタはクワッドのリストを反復処理するだけです。 指定された視覚効果で絵を描き、 レンダリング パスに必要なピクセル出力を生成します。 レンダリング パス用の描画クワッドの合成は、GPU で効率的に実行できます。 これは、許可される視覚効果が、GPU 機能に直接マッピングされる視覚効果であることを慎重に選択しているためです。

ラスタライズされたタイル以外にも、描画クワッドには種類があります。 たとえば、テクスチャにまったく裏付けられていない単色描画クワッドもあります。 動画やキャンバスなどのタイル以外のテクスチャの場合は、テクスチャ描画クワッドを使用します。

コンポジタ フレームに別のコンポジタ フレームを埋め込むこともできます。 たとえば、ブラウザ コンポジタはブラウザの UI を含むコンポジタ フレームを生成します。 レンダリング コンポジタのコンテンツが埋め込まれる空の長方形が作成されます。 別の例として、サイト分離 iframe があります。この埋め込みは、サーフェスを使用して行われます。

コンポジタがコンポジタ フレームを送信すると、 これはサーフェス ID と呼ばれ、他のコンポジタ フレームが参照によって埋め込めるようにします。 特定のサーフェス ID で送信された最新のコンポジタ フレームが Viz によって保存されます。 その後、別のコンポジタ フレームが Surface Draw クワッドを介してそれを参照できます。 Viz は何を描くべきか把握しています。 (サーフェス描画クワッドにはサーフェス ID のみが含まれ、テクスチャは含まれません)。

中間レンダリング パス

多くのフィルタや高度なブレンドモードなど、一部の視覚効果は、 では、2 つ以上のクワッドを中間テクスチャに描画する必要があります。 次に、中間テクスチャを GPU 上の宛先バッファ(または別の中間テクスチャ)に描画します。 ビジュアル エフェクトを同時に適用できます。 これを可能にするために、コンポジタ フレームには実際にレンダリング パスのリストが含まれています。 ルート レンダリング パスは常に存在します。 最後に描画され、そのデスティネーションがフレーム バッファに対応します。 他にもあるかもしれません

複数のレンダリング パスが存在する可能性がある。 「レンダリング パス」と指定します。各パスは、GPU で複数の「パス」で順番に実行されなければなりません。 これに対して 1 パスは 1 つの超並列 GPU 計算で完了できます。

集計

複数のコンポジタ フレームを Viz に送信し、 一緒に画面に描画する必要があります これを実現するのが、集約フェーズによって行われます。 集約コンポジタ フレームを作成します。 集約では、サーフェス描画クワッドが指定したコンポジタ フレームで置き換えられます。 また、不要な中間テクスチャや画面外のコンテンツを最適化できる機会でもあります。 たとえば、多くの場合、サイト分離 iframe のコンポジター フレームは 独自の中間テクスチャは必要ありません 適切な描画クワッドを介してフレーム バッファに直接描画できます。 集計フェーズでは 個々のレンダリング コンポジタではアクセスできないグローバルな知識に基づいて適用します。

ここに示されているのは、最初の例を表すコンポジター フレームです。 説明します。

  • foo.com/index.html サーフェス: id=0 <ph type="x-smartling-placeholder">
      </ph>
    • レンダリング パス 0: 出力に描画します。
      • レンダリング パスの描画クワッド: 3 ピクセルのぼかしで描画し、レンダリング パス 0 にクリップします。
        • レンダリング パス 1: <ph type="x-smartling-placeholder">
            </ph>
          • #one iframe のタイル コンテンツのクワッドを描画し、それぞれに x 位置と y 位置を指定します。
      • サーフェス描画クワッド: ID 2、スケールと平行移動変換で描画。
  • ブラウザ UI サーフェス: ID=1 <ph type="x-smartling-placeholder">
      </ph>
    • レンダリング パス 0: 出力に描画します。
      • ブラウザ UI のクワッドを描画する(タイル表示も可能)
  • bar.com/index.html サーフェス: ID=2 <ph type="x-smartling-placeholder">
      </ph>
    • レンダリング パス 0: 出力に描画します。
      • #two iframe のコンテンツにクワッドを描画し、それぞれに x 位置と y 位置を指定します。

イラスト: Una Kravets。