ブラウザ

レンダリングの仕組み

  • 60fpsに対応するには、js含めて毎秒16ms以内に収まれば良い

フロー

  • フローは、Parse > Style > Layout > Paint > Composite

  • Parseでは、HTMLはDOM Treeに、CSSは Style Rulesに構文解析(パース)される

  • Styleでは、DOM TreeとStyle Rulesの関連付けを行い、Render Treeを作成する(各要素はRendererと呼ばれる)

  • Layoutでは、要素の位置と大きさなどを計算し、Layout Treeを作成する。

    • 最初はルートのRendererからレイアウト計算を順に行う

    • jsなどで変更があった場合は、その要素と子要素、兄弟要素の再計算が行われる。(Incremental Layout)

    • ブラウザ自体の幅が変えられた場合などは、Global Layoutが行われる

  • Paintでは、要素の重なりを考慮し表示順を意識して描写できるようにする。この命令をPaint Recordsと呼ぶ。またモダンブラウザではここで、Layer Treeも作成する。

    • Layerの分離は変更の際の計算量を少なくするために有効

  • Compositeでは、Paint Recordsを元に各レイヤーのピクセル単位で色を当て込む。

スレッド構成

  • レンダリングのスレッド構成は以下のようになっている。

    • Main Thread ... ParseからPaintまでを実行。加えてJavaScriptも実行する

    • Compositor Thread ... Raster Threadにレイヤのラスタライズ(ビットマップ化)を依頼し、一枚のレイヤを合成する。

    • Raster Thread ... 4つのスレッドでCompositor Threadからの依頼で処理をする。

変更と影響度合い

  • 高さの変更は、Style以降のフローが再計算されて最も重い。

  • 色はPaint以降が呼ばれ、軽いがMain Threadが使用される。

  • transformやopacityは、compositeのみが実行され、Compositor Threadで実行される。

    • 実際はレンダリングエンジンによって微妙に異なり、WebkitではtransformプロパティでもLayoutから再計算される。

レンダリングエンジン

  • レンダリングエンジンは、ブラウザアプリ毎に異なる

  • 主な違いは以下

    • Safari ... Webkit

    • Chrome ... Blink

    • Firefox ... Gecko

    • Edge ... EdgeHTML(今はChroniumベースとなったため、Blink)

  • ただし、iOSのみWebkit以外のレンダリングエンジンは使用できない。

    • そのため、ChromeにiOSではWebkitを使用している。

参考記事

Last updated