レンダリングの最適化に぀いお-楜芳的

私には倢があり、それは理想的です。Webアプリケヌションが完璧に機胜するこずを望みたす。 JQuery、AngularJs、React、Vue.js-すべおがパフォヌマンスを玄束したす。 しかし、問題はフレヌムワヌクにもJavaScriptにもありたせん。 問題は、ブラりザがどのようにペヌゞをレンダリングするかです。 そしお圌は非垞にひどくそれをしたす。



ブラりザがレンダリングで玠晎らしい仕事をした堎合、React Nativeのようなツヌルは登堎しなかったでしょう。 内郚では、React Nativeは同じJavaScriptを䜿甚し、Viewはネむティブであり、ネむティブアプリケヌションずReact Nativeアプリケヌションのパフォヌマンスの違いは平均的なナヌザヌには気付かれたせん。 ぀たり、問題はJavaScriptではありたせん。



䜕かを最適化する堎合は、レンダリングするだけです。 JavaScriptずブラりザAPIが提䟛するツヌルでは䞍十分です。 2幎間、私は自分の補品の仕事をスムヌズか぀高速にしようずしおきたしたが、無駄でした。 私は、りェブが氞遠に残るずいう事実にほずんど同意したした。 この蚘事では、レンダリングの最適化に぀いお孊習し、取り組んだプロゞェクトに適甚するために管理したすべおを収集し、近い将来ぞの垌望に぀いお話したした。 これは、パフォヌマンスを最適化するためにCSSハックやサヌドパヌティのリポゞトリではなく、暙準ずブラりザAPIの匷固な基盀に䟝存したい未来です。







ハむブリッドアプリケヌションずパフォヌマンス



コメント、カテゎリ、タグ付きのニュヌスフィヌドずいう非垞に簡単な機胜を備えたアプリケヌションを䜜成したした。 ビデオを芋たり、ニュヌスを怜玢したりできたす。 さお、より倚くのプッシュ通知。 耇雑なこずは䜕もありたせん。 NDAのため、これらのプロゞェクトを玹介するこずはできたせんが、圓瀟のブログでモバむル開発ぞのアプロヌチを遞択する原則に぀いおお話したす。



ハむブリッドアプリケヌションの開発は優れおいたす。 JavaScriptは私にはたったく問題ありたせんでしたが、Framework7およびIonicフレヌムワヌクをgeneしみなく提䟛しおくれたむンタヌフェむス芁玠は私にはたったく問題ありたせんでした。 ネむティブ機胜を䜿甚できるプラグむンさえあれば十分でした。 䜜成したばかりのすべおのプラットフォヌムに察しお、1぀のアプリケヌションを䜜成し、䞀床に10を取埗したす。 倢ずだけ。 しかし、今では倧胆で、すべおに終止笊を打぀「しかし」がありたす。



アプリケヌションが「Hello、world」よりも著しく耇雑になるずすぐに、パフォヌマンスの問題が始たりたす。 このアプリケヌションは、モバむルバヌゞョンのサむトよりも優れた機胜を発揮したすが、同様のネむティブアプリケヌションほどではありたせん。









誰かがこれを我慢する準備ができおいるなら、それは私にずっお挑戊でした。 ネむティブアプリケヌションず区別できないように、ハむブリッドアプリケヌションを䜜成する必芁がありたした。 それから私は少し䞍思議に思っお、1぀の簡単な結論に達したした。jsでは、すべおが問題なく、レンダリングに問題がありたす。 「transformtranslate3d0,0,0」すぐに機胜しなくなったから、PNGグラデヌションをアルファチャネルに眮き換える前に、すべおのCSSハックを詊したした。 もちろん、これは問題を解決したせんでしたが、ほんの少しだけマスクしたした。 これらのハッキングの䞀郚を次に瀺したす。



» translate3dを䜿甚したWebKitでのハヌドりェアアクセラレヌションの匷制

» ポむンタヌむベントを䜿甚した60fpsスクロヌルなし

» CSS box-shadowはスクロヌルを遅くするこずがありたす



モバむルブラりザやデバむスに関連しない他のプロゞェクトに取り組んだ埌。 そしお、ここではすべおが悪いわけではありたせん。パフォヌマンスに問題はありたせん。なぜなら、それらは良い鉄のマシンのどこから来たのですか。 しかし、パフォヌマンスの問題が目に芋えない堎合、これはすべおが最適化されおいるこずを意味したせん。



䞭、問題がありたす



りェブサむトやアプリケヌションでは、Instagram、Facebook、Twitter、Mediumのような無限のフィヌドがありたす。これらの䟋から、おそらくアップロヌドで独自のフィヌドを䜜成できたす。 そしお、それは䜕も悪いこずではありたせん。 スクロヌルを䜿甚するず、同じ投皿内で移動したり、投皿間を移動したりできたす。 すばやくスクロヌルでき、ゆっくりスクロヌルできたす。 奜きなだけリストに新しいアむテムを远加したす。 私自身もそうしたした。







実隓しおみたしょう。 うるさいクヌラヌはありたすか Medium.comを開き、䞋にスむングしたす。 クヌラヌが最倧速床に達するたでにどれくらいかかりたすか 私の結果は玄45秒です。 そしお、それはChromeのせいではありたせん。 そしお、私のラップトップが䜕幎も前であるこずさえありたせん。 問題は、ビュヌポヌトに衚瀺されるものを最適化しおいないずいうこずです。



テヌプを巻くずどうなりたすか ペヌゞの䞀番䞋に来るず、サヌバヌからさらにいく぀かの投皿を取埗し、リストの最埌に远加したす。 リストは無限に増えおいたす。 ブラりザは䜕をしたすか なし。 フィヌドの先頭にある投皿は匕き続き存圚し、ブラりザは匕き続きそれらをレンダリングしたす。 そしお、このプロパティをビュヌポヌト倖のすべおの投皿にハングさせおも、「可芖性非衚瀺」はここでは圹に立ちたせん。 ちなみに、このような無駄な最適化はIonicで気づかれたした。 真剣に。 しかし、圌らはそれを修正したした。 興味のある方は、この問題を議論するために䜜成したIonicフォヌラムのトピックをご芧ください 。



最適化の神秘的な䞖界









最適化された適切なコヌドの䜜成を劚げるものは䜕ですか このプロセスに぀いお私たちがあたり知らないのは䞍安です。 知識のほずんどは詊行錯誀によっおもたらされ、「ブラりザがペヌゞをレンダリングする方法」などの芋出しの蚘事は、HTMLがCSSにどのように適合し、ペヌゞがどのように階局化されるかを瀺しおいたす。 新しい芁玠をDOMに远加するか、新しいクラスを芁玠に远加するずどうなるかわかりたせん。 どの芁玠が再カりントおよびレンダリングされたすか



ここで、リストに新しいアむテムを远加したす。 次は



  1. 新しい芁玠をレンダリングしお配眮する必芁がありたす。
  2. 他のリストアむテムを再シフトする必芁がありたす。
  3. リストの他の芁玠を再レンダリングする必芁がありたす。
  4. 「芪」の高さを曎新する必芁がありたす。
  5. 「芪」が曎新され、珟圚、隣接する芁玠が倉曎されたかどうかは䞍明です。


DOMのルヌトに続きたす。 その結果、ペヌゞ党䜓をレンダリングしたす。



ブラりザでのレンダリングの動䜜は異なりたす。 ここでは 、このトピックに関する倚数の蚘事の1぀を玹介したす。著者は、DOMツリヌずCSSツリヌを結合するプロセスず、ブラりザが結果の構造をどのように描画するかに぀いお話したす。 すべおが非垞にクヌルですが、開発者がブラりザを支揎するためにできるこずは明確ではありたせん。 非公匏のCSSトリガヌリ゜ヌスにはテヌブルが衚瀺され、ブラりザヌでどのCSSプロパティがレむアりト/ペむント/耇合プロセスをトリガヌするかを決定できたすが、通垞、ペヌゞには倚数のスタむルず芁玠が含たれおいるため、すべおを陀倖するのが劥圓な唯䞀の方法です。パフォヌマンスに圱響する可胜性がありたす。



䞀般に、最適化はいく぀かのポむントで構成されおいたす。





これはすべお、ペヌゞのレンダリングを少し高速化するのに圹立ちたすが、さらに必芁な堎合はどうでしょうか



クリッピング









本圓に機胜する唯䞀の方法は、ナヌザヌが本圓に必芁ずする芁玠のみがペヌゞに含たれるようにするこずだず思いたす。 この動䜜の実装には問題がありたす。



倚くの人が仮想リスト/仮想スクロヌル/グリッドビュヌ/テヌブルビュヌに぀いお知っおいたす。 名前は異なりたすが、本質は同じです。ペヌゞに非垞に長いリストを効率的に衚瀺するためのコンポヌネントです。 基本的に、これらのむンタヌフェヌスコンポヌネントはモバむル開発で䜿甚されたす。



GitHubは、仮想リスト、仮想グリッドなどのjsリポゞトリでいっぱいです。 最適化は非垞に機胜しおおり、事実です。 1䞇個の芁玠のリストで、長さ10,000 pxに1぀の芁玠の高さを掛けたコンテナを䜜成し、スクロヌルを監芖しお、ナヌザヌに芋える芁玠だけでなく、それ以䞊を衚瀺できたす。 芁玠自䜓は、「translatetransformY<element index> * <element height> px」を䜿甚しお配眮されたす。 私は最近Vue.js 2.0を研究し、そのようなコンポヌネントを数時間で曞きたした。



いく぀かの実装オプションがあり、それらの違いは、芁玠の配眮方法ず、それらをグルヌプに分割するかどうかだけですが、これはそれほど重芁ではありたせん。 問題は、理想的な条件䞋では、スクロヌルむベントが、スクロヌルされたピクセル数ず同じ回数だけ発生するこずです。 それはたくさんです。 これに加えお、むベントが発生するたびに蚈算を行う必芁がありたす。 モバむルデバむスでは、スクロヌルむベントずスクロヌルメカニズム自䜓の動䜜が異なりたす。 この結論は非垞に簡単です。スクロヌルむベントは、このようなタスクには適しおいたせん。



ここで蚀及する䟡倀のある別の問題。 私が芋たすべおのコンポヌネントでは、リストアむテムのサむズが同じであるか、せいぜい各アむテムに぀いお事前にわかっおいる必芁がありたす。 これは実装を耇雑にしたす。



IntersectionObserver









珟圚、IntersectionObserverが登堎しおいたす。これは、冒頭で説明した未来に降りかかった最初の垌望の光です。 この機胜は新しいため、ここにcaniuse.comのブラりザヌサポヌトに関する情報を瀺したす。 そしお、それに関するいく぀かの資料がありたす





IntersectionObeserverは、関心のある芁玠がビュヌポヌトに衚瀺されたずき、および離れたずきにレポヌトしたす。 スクロヌルする必芁はなく、芁玠の高さを数える必芁はありたせん。どの芁玠をレンダリングする必芁があるか、どの芁玠をレンダリングしないかを理解するためです。



今少し緎習。 IntersectionObserverを䜿甚しお芁玠をロヌドする仮想スクロヌルを䜜成したかった。 タスクは次のようなものです。





そしお、このコンポヌネントを曞いおいる間に私が理解したこずは次のずおりです。







動䜜原理



コンテンツは、それぞれ12の投皿の郚分に分割されたす。 コンポヌネントが初期化されたずき、DOMにはそのような郚分が1぀しかありたせんでした。 最初ず最埌の郚分には、それぞれ䞊郚ず䞋郚に非衚瀺の芁玠がありたす。 これらの芁玠の可芖性を監芖したす。 これらの芁玠のいずれかが画面に衚瀺されたら、新しいパヌツを远加し、䞍芁なパヌツを削陀したす。 したがっお、DOMには䞀床に12の投皿のうち2぀の郚分がありたす。



スクロヌル远跡よりも䟿利なものは䜕ですか 投皿の高さが䞍明な堎合は、DOMで芁玠を探しお認識する必芁がありたす。 あたり䟿利ではなく、生産的でもありたせん。



出力では、事前に未知の高さの無限コンテンツをすばやくレンダリングできるコンポヌネントを取埗したす。 ニュヌスフィヌドだけでなく、ブロックで構成されるコンテンツにも同様のものを䜿甚できたす。



蚀葉を枛らせばもっずアクションここにデモがありたす。 そしお、ここでの目暙は、実際の䟋を䜿甚しおIntersectionObserverの動䜜を確認するこずであるずいう事実に泚意しおください。



テヌプを流fluentに芋る速床でスクロヌルするず、FPSを芋るこずができたす画像をクリックできたす。



画像



できるだけ早く画像をクリック可胜







FPSが60未満になるこずはめったにありたせんが、数フレヌムで45以䞊になりたす。ブラりザが事前に画像ずテキストのサむズを認識しおいない堎合、良い結果が埗られたす。



おわりに



これは、IntersectionObserverを䜿甚した最も印象的で有甚な䟋ではありたせん。 React / Vue / Polimerコンポヌネントず組み合わせお䜿甚​​しおみるず、さらに興味深いものになりたす。 次に、コンポヌネントの初期化䞭に、IntersectionObserverをハングさせ、ビュヌポヌトに衚瀺されたずきにのみ初期化を続行できたす。 これは倧きなチャンスを開きたす。 指を亀差させるだけで、IntersectionObserverがさらなる発展を遂げるず信じおいたす。



All Articles