RenderingNG アーキテクチャ

Chris Harrelson
Chris Harrelson

ここでは、RenderingNG のコンポーネント ピースの設定方法と、レンダリング パイプラインがどのように流れるかについて説明します。

レンダリングのタスクは、上位レベルから順に次のとおりです。

  1. 画面上のピクセルにコンテンツをレンダリングします。
  2. コンテンツの状態を変化させる視覚効果をアニメーション化します。
  3. 入力に応じてスクロールします。
  4. デベロッパー スクリプトやその他のサブシステムが応答できるように、適切な場所に入力を転送します。

レンダリングするコンテンツは、各ブラウザタブのフレームのツリーとブラウザ インターフェースです。また、タッチスクリーン、マウス、キーボードなどのハードウェア デバイスからの未加工の入力イベントのストリーミング。

各フレームには以下が含まれます。

  • DOM の状態
  • CSS
  • キャンバス
  • 画像、動画、フォント、SVG などの外部リソース

フレームは、HTML ドキュメントとその URL です。ブラウザのタブに読み込まれたウェブページには、トップレベルのフレーム、トップレベルのドキュメントに含まれる iframe の各子フレーム、およびその再帰的な iframe 子孫があります。

視覚効果は、スクロール、変換、クリップ、フィルタ、不透明度、ブレンドなど、ビットマップに適用されるグラフィック オペレーションです。

アーキテクチャ コンポーネント

RenderingNG では、これらのタスクは複数のステージとコード コンポーネントに論理的に分割されます。コンポーネントは、さまざまな CPU プロセス、スレッド、およびそれらのスレッド内のサブコンポーネントに配置されます。これらは、すべてのウェブ コンテンツの信頼性スケーラブルなパフォーマンス拡張性を実現するうえで重要な役割を果たします。

レンダリング パイプラインの構造

レンダリング パイプラインの図。
矢印は、各ステージの入力と出力を示します。ステージは色で表され、実行するスレッドまたはプロセスを示します。状況に応じて、ステージが複数の場所で実行される場合があります。そのため、一部のステージは 2 色になっています。緑色のステージはレンダリング プロセスのメインスレッド、黄色はレンダリング プロセスのコンポーザ、オレンジ色のステージはビジュアリゼーション プロセスです。

レンダリングはパイプラインで行われ、その過程で複数のステージとアーティファクトが作成されます。各ステージは、レンダリング内で 1 つの明確に定義されたタスクを実行するコードを表します。アーティファクトは、ステージの入出力であるデータ構造です。

ステージは次のとおりです。

  1. アニメーション: 宣言型タイムラインに基づいて、計算されたスタイルを変更し、プロパティ ツリーを時間の経過とともに変更します。
  2. スタイル: CSS を DOM に適用し、計算スタイルを作成します。
  3. レイアウト: 画面上の DOM 要素のサイズと位置を決定し、不変のフラグメント ツリーを作成します。
  4. プリペイント: プロパティ ツリーを計算し、必要に応じて既存のディスプレイ リストと GPU テクスチャ タイル無効にします。
  5. スクロール: プロパティ ツリーを変更して、ドキュメントとスクロール可能な DOM 要素のスクロール オフセットを更新します。
  6. ペイント: DOM から GPU テクスチャ タイルをラスタ化する方法を記述するディスプレイ リストを計算します。
  7. commit: プロパティ ツリーとディスプレイ リストをコンポジタ スレッドにコピーします。
  8. レイヤ化: ディスプレイ リストを合成レイヤリストに分割して、独立したラスタライズとアニメーションを実現します。
  9. ラスター、デコード、ペイント ワークレット: ディスプレイ リスト、エンコードされた画像、ペイント ワークレット コードをそれぞれ GPU テクスチャ タイルに変換します。
  10. 有効化: GPU タイルを画面に描画して配置する方法と、視覚効果を示すコンポジタ フレームを作成します。
  11. 集計: すべての可視コンポジタ フレームのコンポジタ フレームを 1 つのグローバル コンポジタ フレームに結合します。
  12. 描画: GPU で集約されたコンポジタ フレームを実行して、画面上のピクセルを作成します。

レンダリング パイプラインのステージは、必要ない場合はスキップできます。たとえば、視覚効果やスクロールのアニメーションでは、レイアウト、プリペイント、ペイントをスキップできます。そのため、図ではアニメーションとスクロールが黄色と緑のドットで示されています。視覚効果のためにレイアウト、プリペイント、ペイントをスキップできる場合は、コンポジタ スレッドで完全に実行し、メインスレッドをスキップできます。

ブラウザ UI のレンダリングはここでは直接示されていませんが、この同じパイプラインの簡素化バージョンと考えることができます(実際、その実装ではコードの多くを共有しています)。動画(直接描画されない)は通常、フレームを GPU テクスチャ タイルに変換し、コンポーザ フレームと描画ステップに接続する独立したコードでレンダリングされます。

プロセスとスレッドの構造

CPU プロセス

複数の CPU プロセスを使用すると、サイト間およびブラウザの状態からのパフォーマンスとセキュリティの分離、GPU ハードウェアからの安定性とセキュリティの分離を実現できます。