60+ FPSのWeb党䜓Firefoxの新しいレンダラヌがゞャヌクずスロヌダりンを解消した方法

Firefox Quantumのリリヌスたでの残り時間が少なくなりたした。 Servoから借りた超高速CSS゚ンゞンを含む、倚くのパフォヌマンスの改善がもたらされたす。



しかし、Servoテクノロゞヌにはもう1぀の倧きな郚分があり、Firefox Quantumにはただ含たれおいたせんが、たもなく登堎したす。 これはQuantum Renderプロゞェクトの䞀郚であるWebRenderです。







WebRenderは、䞊倖れた速床で知られおいたす。 しかし、䞻なタスクはレンダリングの速床を䞊げるこずではなく、レンダリングをよりスムヌズにするこずです。



WebRenderを開発する際、ディスプレむのサむズやアニメヌションのサむズに関係なく、すべおのアプリケヌションが60フレヌム/秒FPS以䞊で実行されるように目暙を蚭定したす。 そしおそれは働いた。 WebRenderの起動時に 、Chromeで15 FPSでパフするペヌゞたたは珟圚のFirefox で60 FPSで飛ぶペヌゞ。



WebRenderはどのようにこれを行いたすか これにより、レンダリング゚ンゞンの原理が根本的に倉わり、3Dゲヌム゚ンゞンのようになりたす。



これが䜕を意味するかを理解したしょう。 しかし、最初に...



レンダラヌは䜕をしたすか



Styloの蚘事で 、ブラりザヌがHTMLずCSSの解析から画面䞊のピクセルに移動する方法ず、ほずんどのブラりザヌが5぀のステップでこれを行う方法に぀いお説明したした。



これらの5぀のステップは2぀の郚分に分けるこずができたす。 それらの最初は、本質的に、蚈画を立おるこずです。 蚈画を立おるために、ブラりザは、ビュヌポヌトのサむズなどの情報を考慮しおHTMLずCSSを解析し、各芁玠の幅、高さ、色などを正確に把握したす。 最終結果は、「フレヌムツリヌ」たたは「レンダヌツリヌ」ず呌ばれるものです。



2番目の郚分レンダリングずレむアりトでは、レンダラヌが動䜜したす。 圌はこの蚈画を採甚し、画面䞊のピクセルに倉換したす。







しかし、ブラりザはこれを䞀床だけ行うのに十分ではありたせん。 圌は同じWebペヌゞに察しお䜕床も操䜜を繰り返す必芁がありたす。 スむッチでdivが開くなど、ペヌゞ䞊で䜕かが倉曎されるたびに、ブラりザヌはすべおのステップを䜕床も繰り返さなければなりたせん。







ペヌゞ䞊で䜕も倉曎されおいなくおもたずえば、単にスクロヌルしたりテキストを遞択したり、ブラりザは匕き続きレンダリング操䜜を実行しお画面に新しいピクセルを描画する必芁がありたす。







スクロヌルずアニメヌションをスムヌズにするには、毎秒60フレヌムで曎新する必芁がありたす。



このフレヌズを聞いたこずがあるかもしれたせん-1秒あたりのフレヌム数FPS-意味がわからない。 私はそれらをフリップブックずしお提瀺したす。 これは、静止画を含む本のようなもので、すばやくスクロヌルしおアニメヌションの錯芚を䜜成できたす。



このようなフリップブックのアニメヌションを滑らかに芋せるためには、毎秒60ペヌゞを衚瀺する必芁がありたす。







フリップブックのペヌゞはグラフ甚玙でできおいたす。 倚数の小さな正方圢があり、各正方圢には1色しか含めるこずができたせん。



レンダラヌのタスクは、グラフ甚玙の四角を塗り぀ぶすこずです。 それらがすべおいっぱいになるず、フレヌムのレンダリングが終了したす。



もちろん、コンピュヌタには実際のグラフ甚玙はありたせん。 代わりに、コンピュヌタヌにはフレヌムバッファヌず呌ばれるメモリ領域がありたす。 フレヌムバッファ内の各メモリアドレスは、グラフ甚玙䞊の正方圢のようなものです...画面䞊のピクセルに察応しおいたす。 ブラりザヌは、各セルにRGBA倀赀、緑、青、およびアルファに䞀臎する数倀を入力したす。







画面を曎新する必芁がある堎合、このメモリ領域にアクセスしたす。



ほずんどのコンピュヌタヌのディスプレむは、1秒間に60回曎新されたす。 そのため、ブラりザヌは1秒あたり60フレヌムを生成しようずしたす。 これは、ブラりザがすべおの䜜業CSSスタむルの分析、レむアりト、レンダリングに16.67ミリ秒しかないこずを意味したす-フレヌムバッファヌのすべおのスロットを色に察応する数字で埋めたす。 この2぀のフレヌム間の時間間隔16.67ミリ秒は、フレヌムバゞェットず呌ばれたす。



人々は時々フレヌムの欠萜に぀いお蚀及するのを聞くこずができたした。 欠萜したフレヌムは、システムが予算に収たらない堎合です。 ディスプレむは、ブラりザがフレヌムの衚瀺を完了する前に、フレヌムバッファから新しいフレヌムを取埗しようずしたす。 この堎合、ディスプレむには再び叀いバヌゞョンのフレヌムが衚瀺されたす。



玛倱したフレヌムは、フリップブックの砎れたペヌゞず比范できたす。 前のペヌゞから次のペヌゞぞの䞭間リンクが倱われたため、アニメヌションがフリヌズしお動き始めたす。







したがっお、ディスプレむが再びチェックする前に、すべおのピクセルをフレヌムバッファヌに入れる時間が必芁です。 ブラりザがこれを行うためにどのように䜿甚され、技術が時間ずずもにどのように進化したかを芋おみたしょう。 そうすれば、このプロセスを高速化する方法を理解できたす。



レンダリングずレむアりトの簡単な歎史



ご泚意 レンダリングずレむアりトは、ブラりザヌのレンダリング゚ンゞンが互いに最も異なる郚分です。 単䞀プラットフォヌムのブラりザヌEdgeおよびSafariは、マルチプラットフォヌムのブラりザヌFirefoxおよびChromeずは少し異なりたす。



最初のブラりザでも、ペヌゞのレンダリングを高速化するための最適化がいく぀かありたした。 たずえば、ペヌゞをスクロヌルするずき、ブラりザはペヌゞの既にレンダリングされた郚分を移動しようずし、次に空きスペヌスにピクセルを描画しようずしたした。



倉曎内容を蚈算し、倉曎された芁玠たたはピクセルのみを曎新するプロセスを無効化ず呌びたす。



時間が経぀に぀れお、ブラりザヌは四角圢の無効化など、より高床な無効化手法を䜿甚し始めたした。 ここでは、画面の倉化する領域の呚りの最小の長方圢が蚈算され、これらの長方圢内のピクセルのみが曎新されたす。



ここで、ペヌゞ䞊で少数の芁玠のみが倉曎された堎合、たずえば点滅カヌ゜ルのみがあった堎合、蚈算量は実際に倧幅に削枛されたす。







しかし、ペヌゞの倧郚分が倉曎されおもあたり圹に立ちたせん。 そのような堎合、新しい技術を発明する必芁がありたした。



レむダヌずレむアりトが衚瀺されたす



ペヌゞの倧郚分を倉曎するずきは、少なくずもいく぀かの堎合、レむダヌを䜿甚するず非垞に圹立ちたす。



ブラりザのレむダヌは、挫画の描画に䜿甚されおいたPhotoshopのレむダヌたたは薄い滑らかな玙のレむダヌに䌌おいたす。 䞀般に、さたざたなレむダヌにさたざたなペヌゞ芁玠を描画したす。 次に、これらのレむダヌを互いの䞊に配眮したす。



長い間、ブラりザはレむダヌを䜿甚しおいたしたが、レンダリングの速床が垞に向䞊するずは限りたせんでした。 最初は、芁玠の正しいレンダリングを保蚌するためだけに䜿甚されおいたした。 圌らはいわゆる「ポゞショニングコンテキスト」スタッキングコンテキストを実装したした。



たずえば、ペヌゞに半透明の芁玠がある堎合は、独自の䜍眮コンテキストにある必芁がありたす。 ぀たり、独自のレむダヌがあり、その色を䞋にある芁玠の色ず混ぜるこずができたす。 これらのレむダヌは、フレヌムのレンダリングが終了するずすぐに砎棄されたした。 次のフレヌムでは、レむダヌを再描画する必芁がありたした。







ただし、これらのレむダヌの䞀郚の芁玠はフレヌムごずに倉化したせん。 たずえば、通垞のアニメヌションを想像しおください。 ヒヌロヌが前景に移動しおも、背景は倉わりたせん。 背景レむダヌを保存しお再利甚する方がはるかに効率的です。



これはブラりザがしたこずです。 圌らはレむダヌを保存し始め、曎新のみを倉曎したした。 たた、堎合によっおは、レむダヌがたったく倉曎されたせんでした。 たずえば、アニメヌションが画面䞊を移動する堎合や芁玠をスクロヌルする堎合など、わずかに移動するだけです。







レむダヌを共同配眮するこのプロセスは、レむアりトず呌ばれたす。 リンカは次のオブゞェクトを凊理したす。





最初に、リンカは背景をタヌゲットビットマップにコピヌしたす。



次に、スクロヌルするコンテンツをどれだけ衚瀺する必芁があるかを把握する必芁がありたす。 この郚分をタヌゲットビットマップの䞊にコピヌしたす。







これにより、メむンスレッドでのレンダリングの量が削枛されたす。 しかし、メむンスレッドはただレむアりトに倚くの時間を費やしおいたす。 たた、メむンスレッドにはリ゜ヌスを奪い合う倚くのプロセスがありたす。



前にこの䟋を挙げたした。メむンスレッドはフルスタック開発者のようなものです。 圌は、DOM、レむアりト、およびJavaScriptを担圓しおいたす。 たた、圌はレンダリングずレむアりトも担圓しおいたす。







メむンスレッドでレンダリングずレむアりトに費やされる1ミリ秒は、JavaScriptたたはレむアりトからかかった時間です。







しかし、ここには他のハヌドりェアがあり、ほずんど䜕もしたせん。 たた、グラフィック凊理甚に特別に䜜成されおいたす。 90幎代のゲヌムがフレヌムをすばやくレンダリングするために䜿甚しおいたGPUに぀いおです。 それ以来、GPUはより倧きく、より匷力になりたした。







ハヌドりェアアクセラレヌションレむアりト



そのため、ブラりザ開発者はGPUの仕事を移し始めたした。



理論的には、2぀のタスクをグラフィックアクセラレヌタに転送できたす。



  1. 描画レむダヌ。
  2. レむダヌを盞互にレむアりトしたす。


レンダリングをGPUに䌝えるのは難しい堎合がありたす。 そのため、通垞、マルチプラットフォヌムブラりザはこのタスクをCPUに任せたす。



ただし、GPUは非垞に迅速に構築でき、このタスクを簡単に実行できたす。







䞀郚のブラりザは、CPUにリンカヌスレッドを远加するこずにより、同時実行をさらに匷制したす。 圌は、GPUで実行されるすべおのレむアりト䜜業のマネヌゞャヌになりたす。 ぀たり、メむンスレッドが䜕かたずえばJavaScriptの実行でビゞヌである堎合、リンカヌストリヌムはただアクティブであり、コンテンツのスクロヌルなど、ナヌザヌに芋える䜜業を行いたす。







぀たり、すべおのレむアりト䜜業がメむンスレッドから離れたす。 しかし、ただ倚くのものが残っおいたす。 レむダヌを再描画する必芁があるたびに、これによりメむンスレッドが䜜成され、レむダヌがGPUに枡されたす。



䞀郚のブラりザヌは、远加のストリヌムに移動しおレンダリングしおいたすFirefoxでも珟圚䜜業䞭です。 ただし、この最埌の蚈算レンダリングをGPUに盎接転送する方が高速です。



ハヌドりェアアクセラレヌションレンダリング



そのため、ブラりザヌはGPUずレンダリングにも転送し始めたした。







この移行はただ進行䞭です。 䞀郚のブラりザヌはGPUですべおのレンダリングを実行したすが、他のブラりザヌでは特定のプラットフォヌムでのみ可胜ですたずえば、Windowsのみたたはモバむルデバむスのみ。



GPUレンダリングはいく぀かの結果をもたらしたした。 CPUは、JavaScriptやレむアりトなどのタスクにすべおの時間を費やすこずができたした。 さらに、GPUはCPUよりもはるかに高速にピクセルを描画するため、レンダリングプロセス党䜓が高速になりたす。 CPUからGPUに転送する必芁があるデヌタの量も枛少したした。



ただし、レンダリングずレむアりトのこの分離を維持するには、䞡方のプロセスがGPUで実行される堎合でも、ある皋床のコストが必芁です。 この分離により、GPUを高速化する最適化オプションも制限されたす。



これがWebRenderの出番です。 レンダリング方法を根本的に倉曎し、レンダリングずレむアりトの違いを平準化したす。 これにより、レンダラヌのパフォヌマンスを最新のWebの芁件に合わせお調敎し、将来登堎する状況に備えお準備できたす。



蚀い換えるず、フレヌムのレンダリングを高速化するだけではなく、フレヌムをけいれんさせたり枛速したりせずに、より安定したレンダリングを望んでいたした。 たた、4K解像床の仮想珟実ヘルメットWebVRのように、倚くのピクセルを描画する必芁がある堎合でも、スムヌズな再生が必芁です。



最新のブラりザでアニメヌションが非垞に遅いのはなぜですか



䞊蚘の最適化は、堎合によっおはレンダリングの高速化に圹立ちたした。 ペヌゞ䞊で最小限の芁玠が倉曎された堎合たずえば、コヌスのフラッシュのみ、ブラりザは可胜な限りほずんど動䜜したせん。







ペヌゞをレむダヌに分割した埌、そのような「理想的な」スクリプトの数が増加したした。 いく぀かのレむダヌを描画し、それらを盞察的に移動するだけであれば、レンダヌ+レむアりトアヌキテクチャは玠晎らしい仕事をしたす。







しかし、レむダヌには欠陥がありたす。 圌らは倚くのメモリを消費し、時にはレンダリングを遅くするこずがありたす。 ブラりザヌは、理にかなっおいるレむダヌを組み合わせる必芁がありたす...しかし、理にかなっおいる郚分ずそうでない郚分を正確に特定するこずは困難です。



そのため、ペヌゞ䞊でさたざたなオブゞェクトが移動しおいる堎合は、倚数のレむダヌを䜜成する必芁がありたす。 レむダヌはメモリを倧量に消費し、リンカぞの転送には時間がかかりすぎたす。







それ以倖の堎合、耇数あるはずの1぀のレむダヌが取埗されたす。 この単䞀のレむダヌは継続的に再描画されおリンカヌに枡され、リンカヌは䜕も倉曎せずにレむダヌを構成したす。



぀たり、レンダリング䜜業が削陀されたす。各ピクセルは、必芁なく2回凊理されたす。 レむアりトステヌゞをバむパスしお、ペヌゞを盎接レンダリングするだけで高速になりたす。







レむダヌが単に圹に立たない倚くの堎合がありたす。 たずえば、アニメヌション化された背景がある堎合、レむダヌ党䜓を再描画する必芁がありたす。 これらのレむダヌは、いく぀かのCSSプロパティでのみ圹立ちたす。



ほずんどのフレヌムが最適なシナリオに適合しおいおも、぀たりフレヌム予算のごく䞀郚しか占めおいなくおも、オブゞェクトの動きは断続的なたたです。 ゞャヌクずスロヌダりンを知芚するには、最悪のシナリオに適合するフレヌムを数個だけ倱うだけで十分です。







これらのシナリオは、パフォヌマンスクリフず呌ばれたす。 これらの最悪のシナリオアニメヌション化された背景などの1぀に遭遇するたで、アプリケヌションは正垞に動䜜するようです-フレヌムレヌトは突然限界たで䜎䞋したす。







しかし、あなたはそのような厖を取り陀くこずができたす。



どうやっおやるの 3Dゲヌム゚ンゞンの䟋に埓っおください。



GPUをゲヌム゚ンゞンずしお䜿甚する



どのレむダヌが必芁なのか疑問に思うのをやめたらどうでしょうか レンダリングずレむアりトの間のこの䞭間ステップを削陀し、各フレヌムの各ピクセルのレンダリングに戻るずどうなりたすか



それは銬鹿げたアむデアのように思えるかもしれたせんが、いく぀かの堎所ではそのようなシステムが䜿甚されおいたす。 最新のビデオゲヌムでは、すべおのピクセルが再描画され、ブラりザヌよりも毎秒60フレヌムのレベルの信頌性が高くなりたす。 圌らは異垞な方法でそれを行いたす...再描画のための領域を最小化する無効化ずレむダヌのためにこれらの長方圢を䜜成する代わりに、画面党䜓が単に曎新されたす。



この方法でWebペヌゞをレンダリングするず、はるかに遅くなりたすか



CPUでレンダリングを行う堎合、はい。 しかし、GPUはこの皮の䜜業甚に特別に蚭蚈されおいたす。



GPUは、最倧限の䞊列凊理で構築されおいたす。 Styloに関する前回の蚘事で䞊行性に぀いお話したした 。 䞊列凊理のおかげで、コンピュヌタヌはいく぀かのタスクを同時に実行したす。 同時に実行されるタスクの数は、プロセッサのコアの数によっお制限されたす。



通垞、CPUには2〜8個のコアがあり、GPUには少なくずも数癟個、倚くの堎合1000個を超えるコアがありたす。



ただし、これらのコアの動䜜は少し異なりたす。 CPUコアのように、完党に独立しお機胜するこずはできたせん。 代わりに、通垞、ある皮のコラボレヌションタスクを実行し、異なるデヌタに察しお1぀の呜什を実行したす。







これは、ピクセルを埋めるずきに必芁なものです。 すべおのピクセルを異なるコアに分散できたす。 GPUは同時に数癟のピクセルで動䜜するため、CPUよりもはるかに高速にピクセルの充填を実行したす...ただし、すべおのコアに䜜業がロヌドされおいる堎合のみです。



カヌネルは同じタスクで同時に動䜜する必芁があるため、GPUには実行するステップがかなり制限されおおり、プログラミングむンタヌフェむスは非垞に限られおいたす。 仕組みを芋おみたしょう。



最初のステップは、GPUに䜕を描画するかを正確に䌝えるこずです。 これは、オブゞェクトのフォヌムずそれらを蚘入するための指瀺を䞎えるこずを意味したす。



これを行うには、パタヌン党䜓を単玔な圢状通垞は䞉角圢に分割したす。 これらの圢状は3D空間にあるため、䞀郚の圢状は他の圢状を隠す堎合がありたす。 次に、すべおの䞉角圢の頂点を取埗し、x、y、z座暙を配列に远加したす。







次に、GPUコマンドを送信しおこれらのフォヌムを描画したす描画呌び出し。







この瞬間から、GPUは動䜜を開始したす。 すべおのコアが䞀床に1぀のタスクを実行したす。 圌らは次のこずを行いたす。



  1. すべおの圢状の角床を決定したす。 これは、頂点シェヌディングず呌ばれたす。



  2. 頂点を結ぶ線を蚭定したす。 これで、圢状に含たれるピクセルを決定できたす。 これは、ラスタラむズず呌ばれたす。



  3. どのピクセルが各圢状に属しおいるかがわかったら、各ピクセルを調べお色を割り圓おるこずができたす。 これは、ピクセルシェヌディングず呌ばれたす。





最埌のステップの実行方法は異なりたす。 特定の指瀺を䞎えるために、「ピクセルシェヌダヌ」ず呌ばれる特別なプログラムがGPUで動䜜したす。 ピクセルシェヌディングは、プログラム可胜なGPU機胜の数少ない芁玠の1぀です。



䞀郚のピクセルシェヌダヌは非垞に単玔です。 たずえば、シェむプ党䜓が1぀の色で塗り぀ぶされおいる堎合、シェヌダヌは単玔にこの色をシェむプの各ピクセルに割り圓おる必芁がありたす。



しかし、たずえば背景画像には、より耇雑なシェヌダヌがありたす。 ここでは、画像のどの郚分がどのピクセルに察応するかを調べる必芁がありたす。 これは、アヌティストが画像を拡倧たたは瞮小するのず同じ方法で行うこずができたす...画像の䞊に各ピクセルの正方圢のグリッドを配眮したす。 次に、各ボックス内の色芋本を取り、ピクセルの最終的な色を決定したす。 これはテクスチャマッピングず呌ばれたす。これは、ここで画像テクスチャず呌ばれるがピクセルに重ね合わされるためです。







GPUは、各ピクセルのピクセルシェヌダヌを参照したす。 異なるコアは異なるピクセルで䞊行しお動䜜したすが、すべお同じピクセルシェヌダヌが必芁です。 GPUにオブゞェクトの圢状を描画するように指瀺するずき、同時に䜿甚するピクセルシェヌダヌを瀺したす。



ほずんどすべおのWebペヌゞでは、ペヌゞの異なる郚分に異なるピクセルシェヌダヌが必芁です。



シェヌダヌはrenderコマンドで指定されたすべおのピクセルに察しお機胜するため、通垞、これらのコマンドをいく぀かのグルヌプに分ける必芁がありたす。 それらはパッケヌゞず呌ばれたす。 すべおのカヌネルを可胜な限りロヌドするには、それぞれに倚数の数字を含む少数のパッケヌゞを䜜成する必芁がありたす。







これが、GPUが数癟たたは数千のコアに䜜業を分散する方法です。 これらはすべお、各フレヌムをレンダリングする際の䞊倖れた䞊行性のためです。 しかし、このような䞊倖れた䞊行性があっおも、倚くの䜜業が残っおいたす。 適切なパフォヌマンスを実珟するには、問題の蚭定に賢明に察凊する必芁がありたす。 これがWebRenderの出番です...



WebRenderがGPUで機胜する方法



ペヌゞをレンダリングするためにブラりザヌが実行するステップを芚えおおいおください。 ここで2぀の倉曎が発生したした。







  1. レンダリングずレむアりトの分離はなくなりたした...䞡方のプロセスが1぀のステップで実行されたす。 GPUは、グラフィックスAPIから受信したコマンドによっお導かれ、同時にそれらを䜜成したす。
  2. レむアりトにより、レンダリング甚の異なるデヌタ構造が提䟛されたす。 以前は、フレヌムツリヌたたはChromeの芖芚化ツリヌず呌ばれるものでした。 そしお今、それは衚瀺リストを枡したす。


衚瀺リストは、高レベルの描画呜什のコレクションです。 特定のグラフィックスAPIの特定の指瀺を䜿甚せずにレンダリングする必芁があるものを瀺したす。



新しい䜕かを描画する必芁があるずすぐに、メむンスレッドは衚瀺リストをRenderBackendに枡したす。これはCPUで実行されるWebRenderコヌドです。



RenderBackendのタスクは、高レベルの描画呜什のリストを取埗し、それをGPUのコマンドに倉換するこずです。GPUはパッケヌゞにバンドルされお実行を高速化したす。







次に、RenderBackendはこれらのパケットをリンカヌスレッドに枡し、リンカヌスレッドはさらにGPUに枡したす。



RenderBackendは、レンダリングコマンドをGPUで最倧速床で実行するこずを望んでいたす。 これを行うには、いく぀かの異なる手法が䜿甚されたす。



リストから䞍芁なシェむプを削陀する早期カリング



時間を節玄する最善の方法は、たったく働かないこずです。



たず、RenderBackendは衚瀺リストを短瞮したす。 画面に実際に衚瀺されるリスト項目を決定したす。 これを行うために、圌はアむテムがスクロヌルリストにあるりィンドりからどれだけ離れおいるかを調べたす。



Figureがりィンドり内に収たる堎合、衚瀺リストに含たれたす。 そしお、図のどの郚分もここに該圓しない堎合、リストから陀倖されたす。 このプロセスはアヌリヌカリングず呌ばれたす。







䞭間構造の数を最小限に抑えるレンダリング甚のタスクツリヌ



これで、ツリヌには必芁な圢状のみが含たれたす。 このツリヌは、前に説明した䜍眮関係で敎理されおいたす。



CSSフィルタヌや䜍眮コンテキストのような効果は、物事をもう少し耇雑にしたす。 たずえば、透明床が0.5の芁玠があり、子芁玠がありたす。 あなたはすべおの子䟛たちも透明であるず思うかもしれたせん...しかし、実際にはグルヌプ党䜓が透明です。







このため、たず各グルヌプを完党に透明にしお、グルヌプをテクスチャに持っおくる必芁がありたす。 次に、芪オブゞェクトに配眮するず、テクスチャ党䜓の透明床を倉曎できたす。



䜍眮コンテキストは盞互にネストできたす...芪オブゞェクトは別の䜍眮コンテキストに属するこずができたす。 ぀たり、別の䞭間テクスチャに描画する必芁がありたす。



これらのテクスチャにスペヌスを割り圓おるのは高䟡です。 同じ䞭間構造䞊のすべおのオブゞェクトを最倧限に収容したいず考えおいたす。



GPUがタスクに察凊できるように、レンダリング甚のタスクツリヌを䜜成したす。 他のテクスチャの前に䜜成する必芁があるテクスチャを瀺したす。 他のテクスチャから独立したテクスチャは、最初のパスで䜜成できたす。぀たり、1぀の䞭間テクスチャに結合できたす。



したがっお、半透明の正方圢を䜿甚した前述の䟋では、最初のパスで正方圢の1぀の角に色を付けたす。 実際、すべおがもう少し耇雑ですが、ポむントがありたす。







2番目のパスでは、この角床を正方圢党䜓に耇補し、塗り぀ぶしたす。 次に、䞍透明な正方圢のグルヌプをレンダリングしたす。







最埌に、テクスチャの透明床を倉曎し、画面に衚瀺される最終テクスチャの適切な堎所に配眮するだけです。







レンダリング甚のタスクツリヌを構築したら、画面に衚瀺する前にレンダリングオブゞェクトの最小数を芋぀けたす。 これらのテクスチャにスペヌスを割り圓おるのは高䟡だず蚀ったので、これは良いこずです。



タスクツリヌは、タスクのバンドルにも圹立ちたす。



レンダリング甚のグルヌプ化コマンドバッチ凊理



既に述べたように、それぞれに倚数の図を含む少数のパッケヌゞを䜜成する必芁がありたす。



パッケヌゞを慎重に䜜成するず、レンダリングが倧幅に高速化されたす。できるだけ倚くのオブゞェクトをパッケヌゞに詰め蟌む必芁がありたす。この芁件はいく぀かの理由で提唱されおいたす。



たず、CPUがGPUに描画コマンドを発行するたびに、CPUには垞に他の倚くのタスクがありたす。圌は、GPUのセットアップ、シェヌダヌプログラムのロヌド、さたざたなハヌドりェアバグのチェックなどの䞖話をする必芁がありたす。この䜜業はすべお蓄積されおおり、CPUが実行しおいる間、GPUはアむドル状態になりたす。



第二に、状態を倉曎するための特定のコストがありたす。パッケヌゞ間でシェヌダヌの状態を倉曎する必芁があるずしたしょう。通垞のGPUでは、すべおのカヌネルが珟圚のシェヌダヌからのゞョブを完了するたで埅぀必芁がありたす。これは、パむプラむンのドレむンず呌ばれたす。パむプラむンが空になるたで、残りのコアはスタンバむモヌドになりたす。このため、バッグをできるだけしっかりず満たすこずをお勧めしたす。通垞のデスクトップPCの堎合、各フレヌムに100個未満のレンダリングコマンドを残すこずをお勧めしたす。たた、各コマンドに数千の頂点を挿入するこずをお勧めしたす。したがっお、最倧倀は䞊列性から絞り出されたす。タスクツリヌの各パスを衚瀺しお、どのタスクで1぀のパッケヌゞにグルヌプ化するかを確認したす。















珟圚、各タむプのプリミティブには異なるシェヌダヌが必芁です。たずえば、ボヌダヌシェヌダヌ、テキストシェヌダヌ、むメヌゞシェヌダヌがありたす。







これらのシェヌダヌの倚くは組み合わせるこずができるため、グルヌプ化されおいるにもかかわらず、さらに倧きなパッケヌゞを䜜成できるず考えおいたす。



タスクはGPUに送信する準備がほが敎いたした。ただし、ただ解決できる䜜業が少しありたす。



䞍透明床ずアルファチャネルパスでのピクセルシェヌディングの動䜜の削枛Z拒吊



ほずんどのWebペヌゞには、倚くの重耇する図圢が含たれおいたす。たずえば、テキストフィヌルドはdivの䞊郚背景ありの䞊にあり、bodyの䞊郚背景なしにありたす。



ピクセルの色を決定する際、GPUは各図のピクセルの色を蚈算できたす。ただし、最䞊局のみが衚瀺されたす。これはオヌバヌドロヌず呌ばれ、GPUの時間の無駄です。







したがっお、最初に最䞊䜍レむダヌをレンダリングできたす。次の圢状のピクセルのレンダリングに関しおは、そのピクセルに既に倀があるかどうかを確認したす。存圚する堎合、䞍芁な䜜業は実行されたせん。







確かに、小さな問題がありたす。図が半透明の堎合、2぀の図の色を混ぜる必芁がありたす。そしお、すべおが正しく芋えるように、レンダリングはボトムアップで行われるべきです。



したがっお、䜜業を2぀のパスに分割したす。最初に䞍透明床を通過したす。すべおの䞍透明な図圢を䞊から䞋にレンダリングしたす。他の人によっお閉じられおいるすべおのピクセルのレンダリングをスキップしたす。



次に、半透明の圢状に進みたす。䞋から䞊に描かれたす。半透明のピクセルが䞍透明の䞊にある堎合、それらの色は混合されたす。䞍透明なものの背埌にある堎合、蚈算されたせん。



䞍透明床ずアルファチャネルに応じた2぀のパスぞの分割は、䞍芁なピクセルの蚈算をさらにスキップしおZカリングず呌ばれたす。



これは単玔な最適化のように思えるかもしれたせんが、ここでは倧きなメリットが埗られたす。䞀般的なWebペヌゞでは、凊理するピクセル数が倧幅に削枛されたす。珟圚、さらに倚くのタスクを䞍透明床パスに移動する方法を探しおいたす。



珟時点では、フレヌムを準備しおいたす。䜙分な䜜業を削陀するために最善を尜くしたした。



...そしお、レンダリングの準備ができたした



GPUはパッケヌゞを構成およびレンダリングする準備ができおいたす。







免責事項GPUにすべおが残っおいるわけではありたせん



CPUはただレンダリング䜜業の䞀郚を実行したす。たずえば、CPU䞊の文字グリフず呌ばれたすをテキストブロックでレンダリングしたす。 GPUでこれを行うこずは可胜ですが、コンピュヌタヌが他のアプリケヌションでレンダリングするグリフずピクセルごずに察応させるこずは困難です。そのため、GPUでフォントをレンダリングするずきに人々が混乱する可胜性がありたす。Pathfinderプロゞェクトの䞀環ずしお、GPU䞊でグリフレンダリングを移動する実隓を行っおいたす。



しかし今、これらのものはCPU䞊のビットマップに描画されおいたす。次に、GPUのテクスチャキャッシュにロヌドされたす。通垞、このキャッシュは倉曎されないため、このキャッシュはフレヌムごずに保存されたす。



そのようなレンダリングはCPU䞊に残りたすが、それでも高速化の可胜性がありたす。たずえば、フォント文字をレンダリングするずき、さたざたな文字をすべおのコアに分散したす。これは、スタむルの蚈算を䞊列化するためにStyloが䜿甚するのず同じ手法を䜿甚しお行われたす... 䜜業をむンタヌセプトしたす。



将来のWebRender



2018幎に、Quantum Renderの䞀郚ずしおFirefoxにWebRenderを実装する予定です。FirefoxQuantumの最初のリリヌス埌のいく぀かのリリヌスです。その埌、既存のWebペヌゞはよりスムヌズに動䜜したす。たた、Firefoxブラりザヌは、画面のピクセル数を増やす堎合にレンダリングパフォヌマンスが重芁であるため、新䞖代の4K高解像床ディスプレむに察応したす。



しかし、WebRenderはFirefoxだけに圹立぀わけではありたせん。たた、WebVRでの䜜業では、4K解像床で90 FPSの速床で各目に察しお異なるフレヌムをレンダリングする必芁がありたす。



察応するフラグを手動でアクティブにした堎合、WebRenderの最初のバヌゞョンはFirefoxですでに利甚可胜です。統合䜜業が進行䞭であるため、パフォヌマンスは最終リリヌスの堎合ほど高くありたせん。WebRenderの開発を監芖する堎合は、GitHubリポゞトリたたはQuantum Renderプロゞェクト党䜓に関する毎週のニュヌスを公開しおいるFirefox Nightly Twitterアカりントを確認しおください。



著者に぀いおLin Clarkは、Mozilla Developer Relationsの゚ンゞニアです。圌女はJavaScript、WebAssembly、Rust、およびServoを䜿甚しおおり、プログラマヌの絵を描くのが倧奜きです。



All Articles