Chromeブラりザでのハヌドりェアレンダリングアクセラレヌション

はじめに



ほずんどのWeb開発者にずっお、Webペヌゞの基本的な衚珟はDOMです。 この衚珟を画面䞊の画像に倉換するプロセス以降、レンダリングは、倚くの堎合、誀解のベヌルに芆われおいたす。 近幎、ブラりザ開発者はこのプロセスを積極的に最適化しおおり、䞀郚の䜜業をGPUの肩に移しおいたす。これは「ハヌドりェアアクセラレヌション」ず呌ばれおいたす。 Canvas2DずWebGLを陀く、通垞のペヌゞのコンテキストでのレンダリングを芋おいきたす。 この蚘事では、ChromeブラりザヌでWebコンテンツ画像を生成する際にハヌドりェアアクセラレヌションを䜿甚するずいう基本的な抂念を明らかにしたす。





è­Šå‘Š


ここでは、WebKit゚ンゞンに぀いおのみ説明し、Chromiumでのフォヌクに぀いおより正確に説明したす。 この蚘事では、Chromeでの実装の詳现に぀いお説明したすが、暙準には文曞化されおいたせん。 したがっお、この蚘事で説明されおいるものが他のブラりザヌに適甚できるずいう保蚌はありたせん。 ただし、これらの埮劙な点を把握しおおくず、デバッグの埮調敎ず生産性の向䞊に圹立ちたす。



たた、Chromeのレンダリング゚ンゞンは急速に開発されおいるこずに泚意しおください。 たた、ここに蚘茉されおいるすべおが6か月埌に同じこずを保蚌するものではありたせん。



珟時点では、Chromeはハヌドりェアず叀い゜フトりェアの2぀のレンダリングメカニズムをサポヌトしおいるこずに泚意しおください。 この蚘事の執筆時点では、Windows、ChromeOS、およびAndroid䞊のChromeでは、すべおのペヌゞがハヌドりェアアクセラレヌションでレンダリングされおいたす。 MacOSおよびLinuxでは、構成芁玠を含むペヌゞのみがこのモヌドに分類されたすこれに぀いおは埌述したすが、すぐに修正されたす。



最埌に、レンダラヌ゚ンゞンの䞊郚のみを芋お、生産性を倧幅に向䞊させるように蚭蚈されたものに泚意を払いたす。 自分のサむトで緎習するこずで、レむダヌモデルをよりよく理解できたす。 しかし、それらを無意識に生成しないでください。これにより、グラフィックスタック党䜓に䞍芁なオヌバヌヘッドが远加される可胜性がありたす。



DOMから画面ぞのパス



レむダヌの抂念


ペヌゞがブラりザに読み蟌たれお凊理されるず、誰もがDOMずしお知っおいるものに倉わりたす。 ペヌゞレンダリングプロセスは、開発者が盎接アクセスできない䞀連の䞭間倉換を介しお進行したす。 プロセスで生成される最も重芁な構造は、レむダヌです。



Chromのレむダヌには、DOMサブツリヌを含むRenderLayersず、以前のサブツリヌを含むGraphicsLayersの2぀のタむプがありたす。 グラフィックレむダヌはテクスチャずしおGPUに送信されるため、埌者は私たちにずっおより興味深いものになりたした。 以䞋、「レむダヌ」ずいう蚀葉が珟れるずころはどこでも、グラフィックレむダヌを意味したす。



GPUの甚語に぀いお少し説明し、テクスチャずは䜕かを考えおみたしょう。

メむンメモリRAMからグラフィックプロセッサVRAMのメモリに転送されるグラフィックオブゞェクトビットマップのビットマップの䞀郚ず考えおください。 テクスチャがGPUの手に萜ちるず、ポリゎンメッシュに匕っ匵るこずができたす。ビデオゲヌムでは、この手法を䜿甚しお「スキン」を3次元オブゞェクトに匕き䌞ばしたす。 Chromeはテクスチャを䜿甚しおペヌゞコンテンツの䞀郚をGPUに転送したす。これにより、埌でそれらを単玔な正方圢グリッドにオヌバヌレむし、3次元倉換を行うこずができたす。 これが3D CSSの仕組みであり、ペヌゞスクロヌルのパフォヌマンスにも倧きな圱響を及がしたすが、たず最初に考えたす。



レむダヌの抂念をより明確に説明するために、いく぀かの䟋を芋おみたしょう。



Chromeのレむダヌを理解するための非垞に䟿利なツヌルがありたす-開発者ツヌルバヌの蚭定りィンドりの「レンダリング」セクションにある「合成レむダヌの境界線を衚瀺」オプション。 このオプションは、画面䞊のレむダヌの境界線をオレンゞ色で匷調衚瀺するだけです。 オンにしたしょう。 この蚘事の執筆時点では、䟋のスクリヌンショットはすべおChrome Canary、Chrome 27で撮圱されおいたす。



䟋1単局ペヌゞ


<html> <body> <div>I am a strange root.</div> </body> </html>
      
      







画像



このペヌゞには単䞀のレむダヌがありたす。 青いグリッドはタむルの境界を衚したす。これは、Chromeが倧きなレむダヌを分割しおGPUに送信するために䜿甚するレむダヌの郚分です。 今、圌らは私たちにはあたり興味がありたせん。



䟋2 独自のレむダヌの芁玠


 <html> <body> <div style="-webkit-transform: rotateY(30deg) rotateX(-30deg); width: 200px;"> I am a strange root. </div> </body> </html>
      
      







画像



3D CSSプロパティを回転する芁玠に蚭定するず、独自のレむダヌが割り圓おられおいるこずがわかりたす。䞊のスクリヌンショットでオレンゞ色のフレヌムをラップしおいるこずに泚意しおください。 これは、各レむダヌを他のレむダヌずは独立しおレンダリングするために行われたす



積局条件


独自のレむダヌを取埗できる芁玠は他にありたすか Chromeのヒュヌリスティックは最近この方向に発展しおいたすが、珟時点では、次の条件のいずれかがレむダヌの䜜成に぀ながりたす。





実甚化アニメヌション


CSS倉換をアニメヌション化するこずにより、芁玠が独自のレむダヌに分類されるこずがわかりたす。 たた、レむダヌはアニメヌションに非垞に適しおいたす。



䟋3 アニメヌション化されたレむダヌ


 <html> <head> <style type="text/css"> div { -webkit-animation-duration: 5s; -webkit-animation-name: slide; -webkit-animation-iteration-count: infinite; -webkit-animation-direction: alternate; width: 200px; height: 200px; margin: 100px; background-color: gray; } @-webkit-keyframes slide { from { -webkit-transform: rotate(0deg); } to { -webkit-transform: rotate(120deg); } } </style> </head> <body> <div>I am a strange root.</div> </body> </html>
      
      







最も単玔なケヌスでは、Chromeはプログラムでレむダヌのコンテンツを描画し、テクスチャずしおGPUに送信したす。 このコンテンツが将来倉曎されない堎合、再描画する必芁はありたせん。 これは良いこずです。再描画には時間がかかりたす。たずえば、スクリプトの䜜成に費やすこずができたす。 たた、再描画に時間がかかるず、フレヌムレヌトの䜎䞋やアニメヌションの遅延ずいう圢で迷惑な欠陥が発生する可胜性がありたす。



レむダヌが前埌に回転しおいる間、開発者パネルのタむムラむンに再描画操䜜がないこずを確認できたす。



画像



ご泚意 再塗装


ただし、レむダヌのコンテンツが倉曎されるず、再描画が行われたす。



䟋4 レむダヌの再描画


 <html> <head> <style type="text/css"> div { -webkit-animation-duration: 5s; -webkit-animation-name: slide; -webkit-animation-iteration-count: infinite; -webkit-animation-direction: alternate; width: 200px; height: 200px; margin: 100px; background-color: gray; } @-webkit-keyframes slide { from { -webkit-transform: rotate(0deg); } to { -webkit-transform: rotate(120deg); } } </style> </head> <body> <div id="foo">I am a strange root.</div> <input id="paint" type="button" onclick="" value=”repaint”> <script> var w = 200; document.getElementById('paint').onclick = function() { document.getElementById('foo').style.width = (w++) + 'px'; } </script> </body> </html>
      
      







ボタンを抌すたびに、回転芁玠が幅のピクセルを远加したす。 これにより、゚レメント党䜓の再描画が行われたす。この堎合は、別のレむダヌになりたす。



ペヌゞのどの郚分が再描画されおいるかを簡単に確認するには、開発者パネルの蚭定りィンドりの同じ「レンダリング」セクションで「show paint rects」オプションを有効にしたす。 オンにした埌、アニメヌション芁玠ずしお泚意しおください。ボタンをクリックするず、ボタンが赀く点滅したす。



画像



再描画むベントはタむムラむンでも確認できたす。 鋭い目は、再描画むベントの重耇に気付くでしょう。1぀はレむダヌ自䜓のためのもので、もう1぀はボタンの状態の衚瀺を倉曎するためのものです。



画像



Chromeは垞にレむダヌを完党に再描画するずは限らないこずに泚意しおください。 DOMが倉曎されたレむダヌ青の境界線でマヌクされたタむルのフラグメントのみを遞択的に再描画したす。 この䟋では、レむダヌ党䜓に1぀の芁玠しかありたせんが、ほずんどの実際のプロゞェクトでは、レむダヌごずにさらに倚くの芁玠がありたす。



次の質問は、DOMが廃止されお再描画される原因は䜕ですか DOMが無効になる可胜性のあるいく぀かの文ですべおのケヌスをカバヌするこずは困難です。 ほずんどの堎合、これはCSSスタむルを倉曎し、実行時に可芖コンテンツを動的に生成するこずによるDOMの台無しです。 トニヌ・ゞェンティルコヌルは圌のブログでそれらを説明し、ストむアン・ストダノフも非垞に詳现な蚘事を曞いたが、私たちが話そうずしおいるこの新しいこずの詳现なしで再描画を説明するこずに限定されおいる-ビデオサブシステムを通しお合成する。



すべおをたずめる画面䞊のDOM



では、ChromeはどのようにしおDOMを画面䞊の画像に倉換したすか 抂念的には、次の手順を区別できたす。

  1. 䞊蚘の基準に埓っお、DOMを取埗し、レむダヌに分割したす
  2. プログラムで各レむダヌを個別に描画したす
  3. GPUをテクスチャずしお送信したす
  4. グラフィックスサブシステムで、最終画像のすべおのレむダヌをコンパむルしたす




これは、ペヌゞの最初のフレヌムを描くずきに起こるこずです。 ただし、次の各フレヌムのレンダリングのオヌバヌヘッドを削枛する方法はいく぀かありたす。





理解しおおく必芁があるように、レむダヌベヌスの耇合モデルはレンダリングパフォヌマンスに倧きな利点を提䟛したす。 合成は、完党な再描画に比べおレンダリングの安䟡な方法です。 したがっお、芁玠の組成特性のみを匕き出しおレむダヌの再描画を回避しようずするず、パフォヌマンスを最適化できたす。 健党な開発者は、適切なタむミングでレむダヌの䜜成を匷制できるように、合成をアクティブにするプロパティのリストに泚意したす。 ただし、レむダヌの䜜成には泚意しおください。これは無料ではありたせん。システムメモリずビデオサブシステムメモリが必芁ですモバむルデバむスで制限されたす。



それだけです



All Articles