それでは、主なデータ構造を見てみましょう。データ構造は、テーブルへの入力と出力です。 レンダリング パイプラインです。
データ構造は次のとおりです。
- フレームツリーは、ローカルノードとリモートノードで構成され、各ノードがどのウェブ レンダリング プロセスと 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 つのフレームがあります。
サイト分離により、Chromium はこのウェブページをレンダリングするために 2 つのレンダリング プロセスを使用します。 各レンダリング プロセスには、そのウェブページのフレームツリーが独自に表現されています。
別のプロセスでレンダリングされたフレームはリモート フレームとして表されます。 リモート フレームは、レンダリング時にプレースホルダとして機能するために必要な最小限の情報を保持します。 ディメンションなどを指定できます それ以外の場合、リモート フレームには実際のコンテンツをレンダリングするために必要な情報が含まれません。
これに対して、ローカル フレームは標準規格を パイプラインを実行できますローカル フレームには、回転させるのに必要な情報がすべて そのフレームのデータ(DOM ツリーやスタイル データ)を 基づいています。
レンダリング パイプラインは、
ローカル フレームツリー フラグメント:
foo.com
をメインフレームとする複雑な例を考えてみましょう。
<iframe src="bar.com"></iframe>
次の bar.com
サブフレームがあるとします。
<iframe src="foo.com/etc"></iframe>
レンダラは 2 つしかないが、ローカル フレームは 3 つある
ツリー フラグメント。foo.com
のレンダリング プロセスに 2 つと、
bar.com
のレンダリング プロセス:
ウェブページ用に 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 コンポジタはこの同期トークンを使用して、すべてのローカル フレームツリー フラグメントを待機する 現在の同期トークンを含むコンポジタ フレームを送信します。 このプロセスにより、異なる視覚的プロパティを持つコンポジタ フレームが混在するのを回避できます。
イミュータブル フラグメント ツリー
不変のフラグメント ツリーは、レンダリングのレイアウト ステージの出力です。 説明しますページ上のすべての要素の位置とサイズを表します。 (変換が適用されません)。
各フラグメントは、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
。
それぞれに異なる要件があります。
これらのコンポーネントは、コンビニエンス カーソルを使用してフラットなデータ構造にアクセスします。
カーソル
MoveToNext
、MoveToNextLine
、CursorForChildren
などの 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 の描画順序に従って、レイアウト ツリーと関連フラグメントを反復処理します。 アイテムのリストを作成します。
例:
<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 のペイント順序仕様の完全な複雑さを表すために重要です。 負のマージンによって作成されたインターリーブなど:
<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 つの合成レイヤにマージして、一緒にラスタライズできます。 しかしこの方法では、ユーザーがスクロールするたびに負荷の高いラスタライズが必要になります。 塗料チャンクごとに合成レイヤを作成できる すべての再ラスタライズを回避するために個別にラスタライズされますが、GPU メモリがすぐに使い果たされてしまいます。 階層化のステップでは、GPU メモリと、状況が変化した場合のコスト削減との間でトレードオフを行う必要があります。 推奨される一般的なアプローチは、デフォルトでチャンクをマージすることです。 コンポジタ スレッドで変化することが予想されるプロパティ ツリー状態を持つペイント チャンクをマージしないこと。 コンポジタ スレッドのスクロールやコンポジタ スレッドの変換アニメーションなどで使用する必要があります。
上記の例では、理想的には、次の 2 つの合成レイヤを生成する必要があります。
- 描画コマンドを含む 800x600 の合成レイヤ:
<ph type="x-smartling-placeholder">
- </ph>
drawRect
(サイズ 800x600、色: White)drawRect
(位置 0、0、サイズ 100×100、色: ピンク)
- 描画コマンドを含む 144x224 の合成レイヤ:
<ph type="x-smartling-placeholder">
- </ph>
- 位置が 0、0、テキストが「Hello World」の
drawTextBlob
- 0,18 相当を翻訳
rotateZ(25deg)
drawRect
(位置 0,0、サイズ 75×200、色: オレンジ色)- 位置 0,0 とテキスト「I'mfalling」の
drawTextBlob
- 位置が 0、0、テキストが「Hello World」の
ユーザーが #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">クアッドとサーフェス
GPU テクスチャ タイルは、特別な種類のクワッドです。 テクスチャのあるカテゴリを表す華やかな名前です。 クワッドは入力テクスチャを識別し、そのテクスチャを変換して視覚効果を適用する方法を示します。 たとえば、通常のコンテンツ タイルには、タイルグリッド内の x、y 位置を示す変換があります。
これらのラスタライズされたタイルは、クワッドのリストであるレンダリング パスにラップされます。 レンダリング パスにはピクセル情報は含まれません。 望ましいピクセル出力を生成するために、各クワッドをどこで、どのように描画するかが指示されます。 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 位置を指定します。
- レンダリング パス 1:
<ph type="x-smartling-placeholder">
- サーフェス描画クワッド: ID 2、スケールと平行移動変換で描画。
- レンダリング パスの描画クワッド: 3 ピクセルのぼかしで描画し、レンダリング パス 0 にクリップします。
- レンダリング パス 0: 出力に描画します。
- ブラウザ UI サーフェス: ID=1
<ph type="x-smartling-placeholder">
- </ph>
- レンダリング パス 0: 出力に描画します。
- ブラウザ UI のクワッドを描画する(タイル表示も可能)
- レンダリング パス 0: 出力に描画します。
bar.com/index.html
サーフェス: ID=2 <ph type="x-smartling-placeholder">- </ph>
- レンダリング パス 0: 出力に描画します。
#two
iframe のコンテンツにクワッドを描画し、それぞれに x 位置と y 位置を指定します。
- レンダリング パス 0: 出力に描画します。
イラスト: Una Kravets。