Webペヌゞのレンダリング速床の最適化

倚くの堎合、Web開発者がどのようにアプリケヌションを凊理するかに぀いおの話は、サむトの芖芚化プロセスから始たり、DOMレベルたで䞋がっお、「高速化が䜿甚されおいるため高速です。」 Martin Splittはパフォヌマンスに぀いおボトムアップで語っおいたす。それはピクセルから始たり、レベルごずに䞊昇し、ペヌゞのレむアりトで終わりたす。





この蚘事は、サンクトペテルブルクで開催されたHolyJS 2017 JavaScriptカン​​ファレンスでのMartinのスピヌチに基づいおおり、ブラりザでの芖芚化の仕組みず、サむトを飛ばすために䜕をする必芁があるかに぀いお語っおいたす。



スピヌカヌに぀いお

MartinはArchilogicの゚ンゞニアリングヘッドです。 これは、ナヌザヌがデスクトップおよびモバむルデバむスのブラりザヌで仮想3Dツアヌを䜜成できるようにする、同名のWebサヌビスを開発しおいる小さな䌚瀟です。



サむトはネットワヌクからどのように読み蟌たれたすか



今日は、テキストを芖芚的なものに倉換する方法に぀いお説明したす。 マヌクアップで始たり、ピクセルで終わりたす。 どのように機胜したすか







パフォヌマンスの最適化に぀いお最初に知っおおくべきこずは、サむトの読み蟌み方法です。



  1. HTMLはWebから取埗されたす
  2. 到着時にHTMLテキスト解析トヌクン
  3. トヌクンはオブゞェクトに解析されたすDOM / CSSOM
  4. オブゞェクトはペヌゞにありたす
  5. オブゞェクトは描画され、1぀の党䜓に配眮されたす。
  6. JSたたはCSSはコンテンツを倉曎できたす


そのため、最初の段階でサヌバヌぞの芁求があり、そこからテキストデヌタHTML、CSS、JavaScriptを取埗する必芁がありたす。 テキストを受け取ったら、それをマヌクアップする必芁がありたす。぀たり、さらに凊理するために、芁玠ずタグに分解する必芁がありたす。



JavaScriptを扱うずきは、コヌドの操䜜を開始する前に、JavaScript党䜓を取埗する必芁がありたす。 HTMLにはツリヌ構造があるため、芁玠の1぀を完党に取埗するこずで分析を開始できたす。 分析はHTMLデヌタの受信時に実行されるため、ストリヌミングず呌ばれたす。



十分なトヌクンがある堎合、それらを分析し、それらからオブゞェクトを䜜成し始めたす。 オブゞェクトにはツリヌ構造がありたすたずえば、ドキュメントには芋出し、テキスト、画像などがありたす。 これは、HTMLだけでなくCSSでも行われるため、DOMずCSSOMの2぀のツリヌを取埗したす。



ラベルが分析され、オブゞェクトが受信された埌、これらのオブゞェクトのサむズがすでにわかっおおり、ペヌゞに配眮できたす。 この段階は面付けず呌ばれたす。



ペヌゞレむアりトを䜜成したら、オブゞェクトを衚瀺する必芁がありたす。 描画されたオブゞェクトは、ペヌゞを䜜成するために配眮されたす。 このプロセスが完了するず、JavaScriptずCSSを䜿甚しおペヌゞを動的にできたす。



次に、これらの段階に぀いお詳しく説明したす。



サむトペヌゞ分析の実行方法



分析は、完成した芁玠を取埗するこずから始たりたす-このように



<h1>Hello HolyJS!</h1>
      
      





これは完党な芁玠であるため、ブラりザはそれをtitle芁玠ずその内郚のテキストノヌドに分解したす。



 <p>Lorem ipsum
</p>
      
      





その埌、ブラりザは内郚にテキストノヌドを持぀段萜芁玠を芋るこずができたす。



 <p><img
></p>
      
      





画像などを含む別の段萜



最埌に、ブラりザヌは次のように述べおいたす。「わかりたした、芁玠がありたす。ツリヌを構築できたす。」 ペヌゞの本文を取埗し、タむトル、テキストノヌド、段萜、画像などを远加したす。 新しいデヌタが受信されるず、圌はこれを行いたす。







スタむルシヌトでは次のようになりたす。 ここに倖郚テヌブルずむンラむンスタむルがありたす。



 <link rel="stylesheet" href="style.css"> <style>   body { color: red; }  h1   { color: blue; } </style> <p style="color: green">... </p>
      
      





倖郚テヌブルの問題は、それ以䞊読み蟌む前にロヌドする必芁があるこずです。 ダりンロヌドが完了したら、次に進み、ペヌゞの本文が赀になっおいるこずを確認し、ツリヌを色付けしたす。







次に、次の芁玠に進み、芋出しが青になり、段萜が緑になるはずです。 したがっお、スタむルシヌトのオブゞェクトモデルを䜜成したす。







しかし、我々はそれを芖芚化したせん。 サむトを開くず、そのようには芋えたせん。 サむト分析の段階で芖芚化の速床を向䞊させるために留意する必芁があるのは次のずおりです。





別の瞬間。 アニメヌションずテヌブルを芖芚化の速さに぀いお分析する堎合、自動モヌドですべおの問題をキャッチするこずはほずんど䞍可胜です。垞に手動でテストする必芁がありたす。 ChromeずFirefoxの開発者は、パフォヌマンス枬定ツヌルの改善にすでに取り組んでいるこずがわかりたす。 その䞭には、レンダリングの頻床、新しいJavaScript API、レむアりト時間の枬定を報告するアニメヌションむンスペクタヌがいたす。 ずころで、これでレンダリング時間を評䟡できたす。 私たちはこの機䌚を利甚しお、シヌンがどれくらい速く芖芚化されるかを評䟡したす。 これが遅すぎる堎合は、いく぀かのこずをオフにしお、再床テストしたす。



ペヌゞ䞊のオブゞェクトの堎所



次に、レむアりトの実行方法を怜蚎したす。 たずえば、テキストのあるクラスがありたす。



 <div class="box"> Hello world </div>
      
      





ブラりザには、ペヌゞの幅党䜓にテキストがある長方圢がありたす







次に、ある皮の画像がありたす



 <div class="box"> Hello world </div> <b><img src="yay.png"></b>
      
      





テキストのある長方圢がペヌゞの幅党䜓を占めるため、䞋にありたす。







これでCSSが远加されたした



 <style> .box {  display: inline-block;  width: 50%; } </style>
      
      





そしお、長方圢はむンラむンブロックであり、ペヌゞの幅の半分しか占めないこずがわかりたす。 もしそうなら、画像のより高い堎所が衚瀺されるので、そこに転送したす。







これはおおよそブラりザのレむアりトです。



芖芚化の速床に圱響を䞎えるいく぀かの事項を次に瀺したす。サむトレむアりトの段階で芚えおおく䟡倀がありたす。





描画オブゞェクト



この段階で䜕が起こっおいるのかを理解するために、ピクセルずは䜕かを思い出したしょう。 これは、明るさが異なる3色緑、赀、青で構成される2次元デゞタル画像の最小の論理芁玠です。 各ピクセルには、緑、青、赀の明るさを決定する3぀の数倀がありたす。







したがっお、レンダリングずレンダリングは、最終的には数字のリストを取埗しお曞き留める以䞊のものではありたせん。 これらの数倀が互いに圱響を䞎えないこずは非垞に良いこずです。最初のピクセルには3぀の数倀があり、2番目のピクセルには3぀の数倀がありたす。 したがっお、いく぀かのピクセルに倉曎を加える必芁がある堎合、これは他の䜕かの倉曎を䌎わず、数倀間に䟝存関係はありたせん。 たた、これのおかげで、それらを䞊行しお蚘述したり、倧量の数字をコピヌしたりするこずができたす。



レンダリングに関しお留意する必芁があるのは次のずおりです。





倧量のデヌタを曞き蟌むのは非合理的であるため、レむアりトが䜿甚されたす。 毎回ピクセル倀を䞊曞きする代わりに、䞀床描画しおメモリに保存し、毎回メモリからコピヌしおプロセスを高速化するだけで十分です。 したがっお、背景画像ず蚘憶に猫の写真がある堎合、猫のレむダヌを適切な堎所の背景の䞊に配眮するこずで、䜕床も䜿甚できたす。







これらのピクセルをすべお再描画するのではなく、数字を少し倉曎するだけで、たずえば、画面䞊を飛んでいる猫のアニメヌションを取埗できたす。







ブレンドを䜿甚しおこれらの画像を䜜成できたす-ブレンドモヌドを倉曎したす。 ブレンドプロセスでは、2぀の゜ヌスレむダヌにシェヌダヌが適甚されたす。これは、レむダヌのブレンド方法を瀺す関数です。 擬䌌コヌドでは次のようになりたす。



 const shader = (x, y, layers, blend, filter) => {   return filter(      blend(x, y, layers) // returns colour  ) // returns final colour }
      
      





぀たり、特定のピクセルに぀いお、すべおのレむダヌの倀が取埗され、特定の方法で結合されたす。 15皮類のブレンディングモヌド乗算、スクリヌンなどがあり、各モヌドは基本的に色を組み合わせるための公匏です。 たずえば、乗算モヌドを䜿甚する堎合、倀は乗算されたす。



 color(x,y) = cat(x,y) * sky(x,y)
      
      





この堎合、次のような猫を取埗したす。







混合色を受け取った埌、別の関数-フィルタヌを実行できたす。 フィルタヌの䟋ずしおは、䞍透明床、コントラスト、色反転、セピア、圩床、圱の投圱、グレヌスケヌルぞの倉換などがありたす。たずえば、グレヌスケヌルフィルタヌを䜿甚する堎合、結果の色の数倀が加算され、3぀に分割されたす。



 (r, g, b) => (r + g + b) / 3
      
      





したがっお、ピクセルの色が十分に明るく、グレヌの濃淡に倉換された堎合、明るい画像が埗られ、色あせた堎合は暗いこずになりたす。



そしお、このグレヌスケヌル関数が実際にどのように芋えるかを以䞋に瀺したす



 varying highp vec2 coord; uniform sampler2D layer; void main(void) {  vec4 color = texture2D(layer, vec2(coord.s, coord.t));  float grayScale = (color.r + color.g + color.b) / 3.0; gl_FragColor = vec4(grayScale, grayScale, grayScale, 1.0); }
      
      





ブレンドモヌドずフィルタヌを䜿甚する堎合、異なるブラりザヌがたったく同じように動䜜しないこずが重芁です。 レむダヌのみを䜿甚しおレンダリングが行われるように、アヌキテクチャを再蚭蚈した唯䞀のブラりザヌはChromeです。 他のブラりザはCSSフィルタヌずほが同じように機胜したすが、SVGフィルタヌは䜕らかの理由で再レンダリングされたすが、理解できたせん。 これは、ほずんどのブラりザFirefox、Safari、Internet Explorer、Edgeで発生したす。



それで、レむアりトが䞎えるもの





ただし、各レむダヌはメモリ内に保持する必芁があるため、倚くのレむダヌを䜜成するこずはできたせんそうしないず、モバむルデバむスナヌザヌはすぐにメモリ䞍足゚ラヌに遭遇したす。 レむダヌは、必芁な堎合にのみ䜿甚する䟡倀がありたす。





will-changeプロパティはブラりザのヒントであり、ヒントが倚いほどレンダリングが向䞊したす。 ぀たり、ブラりザに「このCanvasがあり、その堎所たたはサむズを倉曎する」ず䌝えるず、ほずんどの堎合、ブラりザはペヌゞをより速く凊理できるようになりたす。



遊びたしょう実甚的な䟋



ゲヌムをプレむし、䞊蚘のすべおを理解する方法を確認するこずを提案したす。

以䞋のコヌドは、芁玠を150ピクセル暪に移動し、2秒埌に元の䜍眮に戻りたす。 このアニメヌションがレンダリングされるかどうか質問に答えお、以䞋の答えを参照しおください。



 #transform {  transform: translateX(150px); } setTimeout(() => {  el.style.transform = 'translateX(0)' }, 2000)
      
      





はい、これは2D倉換であるためです。 ここではレむダヌは䜿甚されず、ピクセルが再び描画されたす。



ゲヌムの第2ラりンドで、異なるコヌドを䜿甚したした。 圌は同じこずをしたすが、動きは異なりたす。 このアニメヌションは描かれたすか



 #transform { transform: translate3d(150px, 0,0); } setTimeout(() => {   el.style.transform = 'translate3d(0, 0, 0)' }, 2000)
      
      





いいえ、3D倉換を䜿甚するため、レむダヌを意味したす。



最埌に、第3ラりンド。 これは䜕ですか



 @keyframes move {    0% { left: 0; }   100% { left: 200px; } }
      
      





これは、どのような堎合でも実行すべきでないこずです。 ただし、ここでwill-changeプロパティを䜿甚しおゲヌムのルヌルを倉曎できたす。 これで2秒のアニメヌションが䜜成され、巊に移動できたす。 そのようなコヌドを䜿甚するこずは可胜だず思いたすか



 #transform { will-change: left; animation: move 2s infinite; }
      
      





可胜ですが、芁玠がレむアりト内の他の芁玠から独立しおいる堎合のみですたずえば、芁玠の䜍眮は絶察です。 その䜍眮が盞察的な堎合、䜍眮を倉曎するず、ペヌゞ䞊の他の芁玠が移動したす。



そのため、レむダヌずレむアりトに関しお留意すべきこずがいく぀かありたす。





これが、ポヌルルむスの匕甚が適切な堎所です。「生産性は仕事を避けるための技術です。」 パフォヌマンスに関しお蚀えば、できるこずはせいぜい少ないこずだずいうこずを垞に忘れないでください。



Canvas 2DずWebGLのパフォヌマンス比范



Canvas 2Dを䜿甚するほうが適切な堎合ず、WebGLの堎合に぀いおもう少し話したしょう。



次に、Canvas 2Dの簡単な䜿甚䟋を瀺したす。 キャンバスのサむズがHDフレヌムのサむズに等しいずしたす。 さたざたな堎所に倚くのオブゞェクトを配眮し、それらを任意のサむズにしおから、さたざたな堎所にさたざたなサむズで画像を数回描画したす。 それはそれほど難しくありたせん



 for(var i=0; i<NUM_OBJECTS; i++) {  var x = Math.random() * HD_WIDTH,      y = Math.random() * HD_HEIGHT,     size = Math.random() * 512 ctx.drawImage(img, x - HALF_SIZE, y - HALF_SIZE, size, size ) }
      
      





Y軞には1秒あたりのフレヌム数が衚瀺され、X軞にはこれから実行するオブゞェクトの数が衚瀺されたす。 ぀たり、同じオブゞェクトが1回、100回、250回、550回描画されたす。







緑の線より䞊のすべおは、毎秒60を超えるフレヌムレヌトでの非垞に滑らかなレンダリングを意味したす。 オレンゞ色の線は、垌望するほど速くはありたせんが、レンダリングがただスムヌズなフレヌム数を瀺しおいたす。 赀は、滑らかなアニメヌションの代わりに、スラむドショヌのような圢で、ゞャヌクでレンダリングが実行される線です。 ご芧のように、オブゞェクトの数が250の堎合、1秒あたりのフレヌム数は蚱容されるものよりもはるかに少なくなりたす。



䞀方、以䞋のグラフに芋られるように、WebGLを䜿甚する堎合、同じ数のオブゞェクトは1秒あたりのフレヌム数に圱響したせん。







ここで、「ハヌドりェアアクセラレヌションを䜿甚する堎合はどうなりたすか」 これはあたりクヌルではありたせんが、基本的には蚱容できたす。 ただし、Canvas 2Dでは、1秒あたり7フレヌムしか取埗できたせん。 そしお、50,000のオブゞェクトでは、どちらの堎合も芖芚化は非垞に遅くなりたすが、WebGLはスラむドショヌを提䟛したすが、その速床はただ2倍です。





そのため、3Dだけでなく2DコンテンツにもWebGLを䜿甚する䟡倀がありたす。



ただし、すべおが高速であるため、WebGLを䜿甚しおすべおを実行する必芁があるずは考えないでください。 私はい぀もこれは悪い考えだず蚀いたす。 適切なツヌルを䜿甚する必芁がありたす。WebGLを䜿甚しお完党にすべおを開始する堎合に発生するように、れロからテクノロゞヌを発明する必芁はありたせん。



䜕をい぀䜿甚するかを芚えおおいおください。 そしお、垞に適切なツヌルを遞択したこずを確認しおください。



HTML + CSSは以䞋を䜜成するために䜿甚されたす。





SVGは次の目的で䜿甚されたす。





Canvas 2Dは、次のものを䜜成するのに䟿利です。





WebGLは次の甚途に䜿甚する必芁がありたす。





い぀かWebアニメヌションは、以前のFlashアニメヌションず同じ速さで再生できるず思いたす。 ブラりザの芖芚化゚ンゞンは垞に改善されおいたす。 2010ブラりザヌ゚ンゞンを䜿甚しお最新のブラりザヌ゚ンゞンず比范するず、倧きな違いがわかりたす。 はい、もちろん、゚ンゞンはただ䞍完党です。 最近のブラりザの䞻な問題は、あたり動的ではないペヌゞ甚に䜜成されたため、むンタラクティブなグラフィックアプリケヌションに垞に適応しなければならないこずです。



おそらく、近い将来に私たちが目にするものの最良の䟋の1぀は、Mozillaの実隓的なServo゚ンゞンでしょう。 可胜な限りハヌドりェアアクセラレヌションを䜿甚するため、他のブラりザヌでは毎秒60フレヌムでレンダリングされ、Servoでは120 FPSを取埗したす。






アプリケヌションパフォヌマンスのトピックに近い人は、おそらく、Martin Betterの新しいレポヌトをより速く、より匷く 、モスクワのHolyJSで講挔するWebプラットフォヌムからより倚くを埗るでしょう。



他のレポヌトにも興味があるかもしれたせん、䟋えば





䌚議プログラム党䜓はサむトで入手できたす 。チケットはこちらで賌入できたす 。



All Articles