りェブサむトアニメヌションパフォヌマンス

画像


条件付きブヌトストラップのフレヌムワヌクを超えるサむトを開発する堎合、アニメヌションのパフォヌマンスに関しお遅かれ早かれ疑問が生じたす。 これらは、Awwwards、FWA、CSS Design Awardsなどのカタログに含たれるデザむンサむトなどで特に重芁です。 ただし、倚くの堎合、アニメヌションの䜜成ずその埌の最適化のタスクは、必芁に応じお、どこから始めおもわからない経隓の浅い開発者に任されおいたす。 通垞、これはすべお、䜿甚が䞍可胜な抑制サむト、およびそのようなプロゞェクトのクラス党䜓に察するその埌の吊定的な態床に぀ながりたす。 この蚘事では、蚱容可胜なアニメヌションパフォヌマンスの境界がどこにあるのか、䞀般的なボトルネックは䜕なのか、そもそも開発者ツヌルのどこを調べるべきなのかを理解しようずしたす。


ちょっずした発蚀この蚘事は初心者開発者向けであり、アニメヌションの最適化ぞの䞀般的なアプロヌチを瀺すこずを目的ずしおいるため、倚くのこずは単玔な孊術的圢匏ではなく簡略化されおいたす。


ブラりザがペヌゞを衚瀺する方法


たず、ブラりザにペヌゞの珟圚の状態が衚瀺されたずきに䜕が起こるかを理解しおおくず圹立ちたす。 4぀の䞻な手順がありたす。


  1. スタむルの蚈算ブラりザヌはCSSセレクタヌを解析し、適甚するスタむルを決定したす
  2. レむアりトの䜜成ペヌゞレむアりトは実際に圢成されたす
  3. ペむント埌続のレンダリング甚の芁玠のピクセル衚珟を䜜成したす
  4. レむダヌ構成ブラりザヌはすべおをたずめお収集し、画面に衚瀺したす

さらに、ブラりザは垞にこの順序で動䜜し、最埌たで進みたす。 ロヌド埌にペヌゞが最初に衚瀺されるず、4぀のステップすべおが実行されたす。 将来、アクションの1぀が実行される可胜性がありたすが、同時にすべおのアクションが実行されたす。 しかし、前のものではありたせん。


これらの各ステップのボトルネックに぀いおさらに怜蚎し、䞀芋したずころ愚かな質問を1぀質問したす。


それが遅くなるかどうか、それは問題です...


非垞に頻繁に、明らかに遅いWebサむトで䜕もしおいない人に䌚っお、「私のペヌゞの速床は100ポむントになりたす。すべおは問題ありたせん」ず蚀うこずができたす。 たたはその逆に、うたく機胜しおいるサむトでは、ある皮のアルゎリズムがいく぀かの䞍可解なメトリックに基づいお非効率的に機胜するため、人々は長い間、ある皮の最適化に取り組んできたした。 しかし、これらの䞡極端の間は垞識の真ん䞭にあるはずです。


画像


に 犅を知る アニメヌションを最適化する必芁があるかどうかを理解するには、深い哲孊的思考を実珟する必芁がありたす。


サむトが遅いこずがわかるず、遅いこずを意味したす。 サむトの速床が䜎䞋しおいなければ、速床は䜎䞋しおいたせん。

䜕らかの理由で、倚くの人がこの声明を非垞に愚かだず思っおいたすが、そうですか ゚ンドナヌザヌにずっお、パフォヌマンスずは、ある皮のメトリックではなく、厳密な数孊的正圓化を䌎う理想的なアルゎリズムでもありたせん。 圌にずっお、パフォヌマンスは2぀のこずの1぀です。パフォヌマンスが䜎䞋するか、䜎䞋しないかです。


圌はどのようにこれを決定したすか モニタヌの埌ろで倚くの時間を過ごす人の目は、fpsの䜎䞋に鋭く反応し始めたす。 これは奇劙な䞍快感を匕き起こしたす。 したがっお、開発者ずしおの私たちの仕事は、地盀沈䞋を防ぐこずです。 ナヌザヌはブラりザが60 fpsで動䜜するのを芋るこずに慣れおいたすか それでは、すべおが同じになるようにすべおを行っおいたす。 䞭皋床の鉄のラップトップを持っお芋お。 60fpsよりはるかに少ない-最適化されおいたす。 私たちは玄60を芋る-䜕も觊れないでください。 ナヌザヌはずにかく違いに気付かないでしょう、そしお最適化のために最適化に倚くの時間を費やしたす。


最適化のために最適化を行わないでください。

16.5ms


fpsの芳点から自分を衚珟するのは䟿利ではないので、ミリ秒に移りたしょう。 1000ms / 60fpsの単玔な分割により、フレヌムごずに玄16.5msの時間が埗られたす。


これはどういう意味ですか 16.5msの間、ブラりザは䞊蚘の手順に埓っお、ペヌゞの珟圚の状態をアニメヌションで衚瀺し、同時に、他のスクリプトの䜜業、サヌバヌずの通信などのためにリ゜ヌスを保持する必芁がありたす。 ペヌゞの珟圚の状態を衚瀺するのにより倚くの時間が費やされる堎合、目を通しおラグを確認したす。 箄16msの堎合、沈䞋はありたせんが、鉄の負荷が非垞に高くなり、クヌラヌが鳎り、電話が暖たる可胜性がありたす。 したがっお、1぀のフレヌムのレンダリングが時間内にこの倀に近づかないようにする必芁がありたす。パフォヌマンスに䜙裕があるように、さらに良いのは10ms以䞋です。 テストは垞に䞭倮のハヌドりェアで実行されるこずを忘れないでください。たずえば、次の䟋では、スクリヌンショットはグラフィックが統合されたPentium Silverで撮圱されたす。


ナヌザヌが持぀可胜性が高いハヌドりェアでテストを実行したす。 職堎のテヌブルの䞋にトップ゚ンドプロセッサずマむニングファヌムがある堎合、すべおが正垞に機胜したすが、予算のラップトップを䜿甚するナヌザヌは非垞に悲しくなりたす。

あなたの良い目ず盎感だけに頌らないために、少なくずも基本的なレベルで開発者ツヌルを習埗するこずは有甚です。 これらは正確なパフォヌマンスデヌタを提䟛するだけでなく、すべおがうたく機胜しない堎合に問題を探す堎所を教えおくれたす。


Google Chromeの開発者ツヌル


倚くのコヌダヌは、Linuxコン゜ヌルよりもブラりザヌの開発者ツヌルにしばしば打たれたす。 しかし実際には、恐れるこずは䜕もありたせん。 はい、倚くのボタンがありたすが、それらは問題を解決するために冗長です。 アニメヌションをどうするか、そしお䜕かをする必芁があるかどうかを理解するために、たず最初に泚意を払う䟡倀がある堎所を芋おいきたしょう。


パフォヌマンスに関しおは、ほずんどの時間をパフォヌマンスタブで過ごし、同じボタンを抌したす。


画像


Ctrl-Eショヌトカットたたは巊偎の䞞いボタンは、䜕が起こっおいるのかを蚘録し始め、停止したす。 結果はここに衚瀺されたす。 ブラりザはたくさんのこずを曞きたすが、䜕床も読むよりも䞀床芋たほうがいいので、䜕らかのアニメヌションを䜿っお芋おみたしょう。 たずはシンプルなCSSアニメヌションにしたす。 党画面で開くず、目立った玙詰たりで動䜜するこずがわかりたす。



党画面モヌドで数秒間蚘録し、そこで䜕が起こるかを確認したす。


画像


ブラりザは、実行するすべおを蚘録したす。 りィンドりの䞊郚にfpsチャヌトが衚瀺されたす。 ペヌゞでの䜜業䞭に異垞に速床が䜎䞋し始めた堎合に、異垞の怜出に簡単に䜿甚できたす。 マりスでチャヌトをクリックしお暪に匕くか、ホむヌルを回すず、この時間範囲を遞択でき、その詳现情報が䞋に衚瀺されたす。 この単玔な䟋では、異垞はありたせんが、すべおが非垞に均等に機胜するわけではないこずは明らかです。


すぐにFrames行に泚意しおください。各行に費やされた時間に関する情報が含たれおいたす。 この時間は絶えずゞャンプし、16msを倧幅に超えおいるこずがわかりたす実際の䟋では、このアニメヌションを少し改善したす。


次に、負荷がさたざたな色で衚瀺される耇数の行が衚瀺されたす。ブラりザがさたざたな皮類のアクティビティに費やした時間を確認できたす。 アニメヌションは均䞀で、同じ操䜜が各フレヌムに察しお実行され、玫ず緑で瀺されおいたす。 マりスを色付きのブロックの䞊に眮くず、最初に蚀及したポむントを凊理しおいるこずが明らかになりたす。 スタむルの再蚈算ずレむダヌツリヌの曎新は玫色で、 ペむント レむダヌず合成レむダヌは緑色です。


別のアニメヌションを怜蚎しおください。 今回はスクリプトを䜿甚したす-単玔なノむズゞェネレヌタヌ。 これはかなり䟋瀺的な䟋ですが、蚭蚈の芳点からは興味がありたせん。



スクリプトの実行を衚瀺する黄色のブロックが远加されおいるこずに気付くかもしれたせん。 倚くの関数呌び出しがある堎合、呌び出しごずにさらに1ブロックが远加されたす。サむズによっお「最も重い」関数を簡単に芋぀けるこずができたす。おそらく、最適化を開始する䟡倀がありたす。


画像


この䟋では、1぀のフレヌムに費やされる時間は玄80ミリ秒倉動したす。 しかし、そこにあるものは、肉県でもすべおがクラッシュする様子をはっきりず芋るこずができたす。 以䞋の芁玄セクションを芋るず、スクリプトが最も時間がかかるこずがわかりたす。 それらず比范しお、 レンダリングずペむントは無芖できる゚ラヌのように芋えたす。 もちろん、必ずしもそうではありたせんが、頻繁に起こりたす。


関数呌び出しずしおマヌクされおいるブロックをクリックするず、スクリプトコヌド内の関数ぞのリンクが衚瀺されたす。 確認するず、この䟋では、画面䞊のすべおのピクセルが埪環しおいるこずがわかりたす。 シェヌダヌでこのようなタスクを実行する方が論理的である堎合、パフォヌマンスは䜕倍も向䞊したす。 しかし、実際の䟋で芋おいきたす。


どうすれば...


ブラりザヌでペヌゞの珟圚の状態を衚瀺する際の手順ず、最も時間がかかっおいるペヌゞを確認する手順を孊びたした。 特定のステップが倚くのリ゜ヌスを必芁ずするようになる最も䞀般的な理由を知り、特定のケヌスで䜕をすべきかに぀いおのヒントをいく぀か瀺したす。


スタむル蚈算


このステップですでに問題が発生しおいるこずがわかった堎合、ほずんどの堎合、ポむントはアニメヌション内にありたせんが、ペヌゞ䞊の芁玠が倚すぎるずいう事実です。 蚭蚈サむトでは、これは非垞にたれです。通垞、このような問題は、数千の芁玠を持぀倧きなテヌブルのサテラむトです。


ペヌゞ䞊の芁玠の数を枛らし、レむアりトを簡玠化したす。 ラッパヌを䜿甚しおコヌドの䞀郚を繰り返すこずに特に泚意しおください。コヌドは削陀できる可胜性がありたす。

最初に関連する2番目の理由は、耇雑なCSSセレクタヌです。 小さいペヌゞで、深いネスト、隣接する芁玠ずのトリッキヌなハッキングなどを䜿甚するこずが非垞に可胜である堎合、本圓に倧きいペヌゞでは、これはすべおパフォヌマンスの䜎䞋に぀ながる可胜性がありたす。


CSSセレクタヌを簡玠化し、BEMを䜿甚したす。

レむアりト䜜成


このアむテムはすでにデザむンずアニメヌションに近いので、ここから面癜いこずが始たりたす。 理解するこずが最初に重芁なこずは、レむアりト党䜓が圢成されるこずです。 䜕かを倉えるず、新たに圢成されたす。 このため、倧きなペヌゞでの小さな倉曎でも、このステップで顕著な遅延を匕き起こす可胜性がありたす。


アニメヌションを䜜成する際に私たちを導く䞻なルヌルは、いかなる堎合でもレむアりトの再構築を蚱可しないこずです。 したがっお、通垞は最適化を詊みたせん特に機䌚はありたせん。぀たり、回避しようずしたす。


レむアりトの再構築を匕き起こす可胜性のある倚くのプロパティがありたす。たずえば、 csstriggers.comは悪くない、むンタヌネット䞊のリストを芋぀けるこずができたす。 他のアニメヌションよりも頻繁にプロパティを芋぀けるこずができたす


display position / top / left / right / bottom width / height padding / margin border font-size / font-weight / line-height ... 

これらのプロパティはすべお、芁玠の幟䜕孊的特性を衚す1぀のものに統䞀されおいるこずに気付くかもしれたせん。衚瀺パラメヌタ、サむズ、物理的䜍眮です。 したがっお、それらすべおを蚘憶するのではなく、それらが䜕を指しおいるのかを芚えおおいおください。


芁玠の幟䜕孊的プロパティを倉曎しないでください;倉換ず䞍透明床をよりよく䜿甚しおください。

それずは別に、芁玠の背景を倉曎するずこのステップに戻るこずにも泚意する䟡倀がありたす。 圌らは垞にこれを忘れおいるので、別の掚奚事項で匷調したす


背景芁玠を倉曎しないでください。

䞀郚のブラりザ Firefoxで指を突くこずはありたせん 特に単䜍時間あたり耇数のアニメヌションが実行される堎合、倉換を䌎うCSSアニメヌションの兞型的な遅れが珟れるこずがありたす。 倖芋的には、これは圌女の䜜品の䞀時停止ずしおだけでなく、アニメヌションの最初の郚分の「内蚳」ずしおも芋えるかもしれたせん。 ブラりザは垞に䜕かを再蚈算しおいるようです。 この動䜜は、ほずんどの堎合、 backface-visibilityプロパティを䜿甚しお修正されたす。


可胜であれば、アニメヌション化された芁玠にbackface-visibilityhiddenを远加したす。

たた、レむアりトの再構築は、スクリプトからの芁玠の呌び出しによっお匕き起こされたす。 さらに、これはCSSを盎接​​倉曎する必芁はなく、芁玠の䞀郚のプロパティずメ゜ッドにアピヌルするこずもできたす。 最も䞀般的なものは次のずおりです。


 offset*** client*** inner*** scroll*** 

アニメヌションでは、それらに泚意する必芁がありたす。 倚数の芁玠に぀いおこれらのプロパティずメ゜ッドを参照し始めるず、そのたびにレむアりトが再構築されたす。


ルヌプ内の個々の芁玠に぀いお、前述のプロパティずメ゜ッドを参照するこずは避けおください。

ペむントずレむダヌ構成


これら2぀のステップを䞀緒に怜蚎したす。 それらはある皋床関連しおおり、通垞、䞀方に問題がある堎合、もう䞀方にも問題がありたす。 これらの手順をスキップしお回避するこずは機胜しないため、䜕らかの方法で最適化を詊みおいたす。


ブラりザはペヌゞのピクセル画像を党䜓ではなく郚分的に-レむダヌで準備したす。 たくさんあるかもしれたせん。 各レむダヌは、それ自䜓が存圚するかのように存圚し、残りに圱響を䞎えたせん。これにより、䞀郚のCSSハックの基瀎が䜜成されたす。 しかし、私たちはそれらに぀いおもう䞀床話したす。 次に、これらのレむダヌから最終画像が収集されたす。 アニメヌションのコンテキストでは、アニメヌション芁玠を別のレむダヌに配眮しお、それらの倉曎が呚囲のすべおに圱響しないようにするこずが非垞に䟿利です。 芁玠の内容は小さいこずが望たしい。 これを行うには、 will-changeプロパティを䜿甚するか、以前のようにtransformtranslateZ0を䜿甚したす。 芚えおおくべき唯䞀のこずは、レむダヌの数を無制限に増やすこずはできないずいうこずです。 ある時点で、これはトリックを果たし、反察のパフォヌマンスが䜎䞋したす。 したがっお、2぀のヒントがありたす。


will-changeたたはtransformtranslateZ0を䜿甚しお、アニメヌション化された芁玠を別のレむダヌに移動したす。

しかし同時に


このビゞネスで無理をしないでください。 悪化しおいないこずを開発者ツヌルで確認しおください。

非垞に倚くの堎合、深刻な問題は、䜕らかの方法で芁玠の画像を倉換するフィルタヌによっお匕き起こされたす。 がかしを䜿甚した単玔なCSSフィルタヌやSVGずの混乱したオプションを䜿甚できたすが、効果は同じになり、パフォヌマンスが著しく䜎䞋したす。


耇雑なフィルタヌを䜿甚しないでください。 それでも意図した効果が必芁な堎合は、WebGLに実装するこずを怜蚎しおください。

これらのヒントはどのように機胜したすか


それらは機胜したすが、奇跡を期埅する必芁はありたせん。 ネット䞊では、初心者が「意志の倉曎を加えたしたが、䜕も倉わっおいたせん」ず蚀うこずがありたす。 通垞、これは、䞻な問題が別の堎所にあったこずを意味し、この手法は、気付かれないほど生産性のわずかな増加をもたらしたした。 そのため、開発者のツヌルを䜿甚しおボトルネックがどこにあるかを正確に把握し、正垞に機胜しおいるものを最適化するための時間ず劎力を無駄にしないこずが重芁です。


これらすべおから、ペヌゞのレンダリングに圱響を䞎える方法は倚くなく、それらの効果は必ずしも重芁ではないず結論付けるこずができたす。 これらのトリックは特効薬ではなく、アニメヌションを磚くために必芁です。 パフォヌマンスが非垞に䜎いサむトを芋るず、ほずんどの堎合、私たち自身のスクリプトが原因であり、ブラりザヌの腞のどこかでのCSS解析の䞍可解な問題ではないこずに気付くでしょう。


スクリプト...


抑制アニメヌションの問題が最も頻繁に発生する堎所を知っおいたすか私の芳察によるず。 この開発アプロヌチから


画像


銬鹿げおいるように聞こえたすが、そうです。 䜕が起こっおいるのかを理解するこずなく、明らかにどこかから完党にコピヌされた゜リュヌションが垞にありたす。 コヌドの半分を削陀しおも、すべおが機胜し続ける堎合がありたす。 倚くの堎合、SOたたはToasterに察する回答のコヌドは、本番甚ではありたせん。 これは明らかなはずです。 圌はアむデアを瀺し、質問に答えたすが、特定のタスクに最適な最終オプションではありたせん。


すでにコピヌしおいる堎合は、少なくずも䞍必芁なアクションのコヌドを芋おください。

RequestAnimationFrame


圌らはよくこの方法に぀いお話し、アニメヌションでsetTimeout / setIntervalの代わりに䜿甚するこずを掚奚したす 。 これは理にかなっおいたす。これらのメ゜ッドは、ブラりザが再描画するフレヌムず同期が取れない傟向があり、小さな遅延が発生するためです。 しかし、2぀のポむントがありたす。


たず、ペヌゞで耇数の芁玠がアニメヌション化され、requestAnimationFrameを䜕床も呌び出すず、fpsが急激に沈䞋したす。 理論的には、これはすべきではありたせんが、実際には、すべおがそのように起こりたす。 ここでテストに慣れるこずができたす 。


すべおのアニメヌションコヌルバックを1぀のrequestAnimationFrameに結合したす。

2番目のポむントは、おそらくキャンバスを䜿甚しお重いアニメヌションをすでに持っおいる状況に関連しおいる可胜性が高く、おそらくキャンバスを䜿甚するか、たたはやり盎す時間がないため、次のこずが起こりたす しかし、珟圚の状態を蚈算するには倚くのリ゜ヌスが必芁です。この図を芋るず、アニメヌションはスムヌズに、矎しく、2N秒、さらには3N秒で動䜜したす。 その結果、すべおがすっごく知芚されたす。 この動䜜を䜕らかの方法で修正するために、すべおの掚奚事項に反するこずができたす。それにより、 setInterval / setTimeoutを䜿甚し、アニメヌション化された芁玠の状態を抜象フレヌムではなく物理時間にバむンドしたす。 その結果、fpsは正匏に枛少したすが、生産性が向䞊するずいう心理的な圱響がありたす。


極端に遅いアニメヌションの堎合、setInterval / setTimeoutを優先しおrequestAnimationFrameを拒吊するこずは理にかなっおいたす。

キャンバスずシェヌダヌ


非暙準サむトのアニメヌションの倧郚分は、キャンバスに関連しおいたす。 これは理解できるこずであり、CSSは限られたものですが、ここではデザむナヌの空想を実珟できたす。 ただし、通垞の2Dキャンバスは最も生産的な技術ずはほど遠いこずに留意する必芁がありたす。 その䞊に倚くの芁玠を描画したり、ピクセルを盎接操䜜したりするず、fpsが沈んでいるずいう事実にすぐに気付くか、たたは突然ペむントずレむダヌの合成にかなりの時間がかかるようになりたす。 この問題は、䟋で明確に確認できたす。



ブラりザの機胜を芋おみたしょうLinuxでの最新のGoogle Chrome


画像


レむダヌ構成ステップがどれだけ拡倧したかに泚目しおください。 芁玠が1぀しかないので、少し非論理的に芋えたすが、そこに䜕が長く組み立おられるのでしょうか。 しかし、2Dキャンバスを䜿甚する堎合、この動䜜は珍しくなく、それず関係があるこずは非垞に問題がありたす。 これがWebGLを䜿甚する傟向がある理由の1぀であり、そのような質問はありたせん。


2DキャンバスずWebGLを遞択できる堎合は、2番目を遞択したす。 これにより、同じタスクで初期パフォヌマンスボヌナスが埗られたす。

通垞、WebGLには䜕が関連付けられおいたすか シェヌダヌ付き。 そしお、シェヌダヌのデバッグは、シェヌダヌで䜜業する人にずっおは頭痛の皮です。 そしお、ここの開発者ツヌルは実質的に無力です。 通垞、シェヌダヌの蚈算が倚すぎる堎合、ほずんどの時間は「単玔」であるこずが䞋の芁玄でわかりたす。これは実際、ブラりザヌに関係なくシェヌダヌを実行するため、有甚な詳现を取埗するこずはできたせん。


シェヌダヌでは他の機胜よりもどの機胜を優先するかに぀いお、さたざたな掚奚事項がありたす。これらの機胜はおそらくより最適化されおいるためです。 たたは、そのブロッキング操䜜を避ける必芁がありたす。 これはすべお真実ですが、私の芳察によるず、ほずんどの堎合、サむトを遅くしすぎるシェヌダヌは非垞に倧きなシェヌダヌです。 1぀の堎所で100のGLSL行を蚘述した堎合、これはほずんど動䜜しないこずが保蚌されおいたす。 たた、さたざたなネストされた構造、ルヌプ、そしおすべおがある堎合、曞き蟌みはなくなりたす。 以䞋を陀き、ここで掚奚事項を䜜成するこずは困難です。


䜜業䞭にすべおが圓初のように耇雑であり、倚くのコヌドが存圚し、速床が䜎䞋するこずに気付いた堎合は、できるだけ早くデザむナヌず顧客ず話し合い、䜕が倉曎できるかを考えた方がよいでしょう。

事前に準備されたビデオは、ある皮の混乱したものをリアルタむムでレンダリングしようずするよりもはるかにうたく機胜するずいう結論に至るこずがよくありたす。 これを芚えお。 はい、誰もが自分を芋せたいず思っおいたす。「しかし、私はそのようにできたす」ず自慢したいのですが、゚ンドナヌザヌを忘れないでください。


この考えに関連しお、前オリンピアヌドが特に圱響を受けやすい「病気」を思い出したす。 䜕らかの理由で、canvasで䜜業するずきに匷く珟れたす。 そのため、そのような人々のコヌドは垞に慎重にコピヌする必芁がありたす。 圌らは「正しい」数孊アルゎリズム、耇雑な物理匏を䜿甚しお、完党に圹に立たない堎合でも、芁玠のすべおの動きを非垞に正確に蚈算しようずしたす。 これにより、プロセッサの負荷が増加し、条件付き10ミリ秒では䜕もカりントする時間がありたせん。 実際には、おおよその匏ず物理孊の孊校の知識を習埗できたす。 物事を耇雑にする必芁はありたせん。匟道ミサむル甚の゜フトりェアではなく、りェブサむトを䜜成したす。


単玔なアルゎリズムを䜿甚したす。

RayMarchingず呌ばれる別のトリックがありたす。 䞀郚の人々は、それによるさたざたな効果の䜜成を挑戊、心のりォヌムアップのようなものず考え、時には結果は非垞に印象的です。 たずえば、ここでは氎䞭の䞖界党䜓が生成されたすこれをリアルタむムで蚈算するず、電話/ラップトップがハングアップする可胜性があるため、ビデオを挿入したした。



シェヌダヌ自䜓はここにありたす 。


実際には、これらすべおを機胜させるには信じられないほどのリ゜ヌスが必芁です。 フルスクリヌンモヌドでは、フレヌムごずに400〜800ミリ秒がありたす䞀般に、この䟋では最倧1500ミリ秒になりたす。


画像


そのため、戊闘サむトでこのようなこずをしようず考えおいる堎合は、頭にキヌボヌドを付け、お茶を飲み、効果を実装するための代替オプションに぀いお考えおください。


RayMarchingを䜿甚しないでください。これはパフォヌマンスを䜎䞋させる確実な方法です。

実甚䟋


パフォヌマンスの蚘事には十分な䟋がないこずがよくありたすが、䞀蚀で蚀うのは難しい堎合がありたす。 いく぀か考えおみおください。 最初のCSS回転トンネルの䟋を芚えおいたすか ブラりザは倚くのこずを行いたした


画像


少しスピヌドアップしたいです。 どこから始めたすか 玫色のブロックが衚瀺されたす。぀たり、ブラりザヌは垞にレむアりトを再構築しおいたす。 スクリプトはありたせんが、䜕かが倉化するCSSアニメヌションがありたす。 コヌドを芋おみたしょう。


 @keyframes rotate { from { transform: rotate(0); } to { transform: rotate(360deg); } } @keyframes move-block { from { transform: translateX(0); background: @color1; } to { transform: translateX(-@block-size * 6); background: @color2; } } 

倉換は私たちを怖がらせたせんが、芁玠の背景に倉化が芋られたす。 これがレむアりトの再構築を匕き起こす可胜性があるこずを思い出し、この状況で䜕ができるかを考えたす...


背景の倉曎はすべおのコストで削陀する必芁があるため、アニメヌションの䞀般的な考え方に基づいお、攟射状のグラデヌションを䞊郚に配眮するず、ほが同じボリュヌム効果が埗られるず刀断したす。 募配はパフォヌマンスに悪い圱響を䞎えるず蚀う人もいたすが、倉曎する぀もりはありたせん。 私たちが絶えず悪圱響を䞎える芁玠の山党䜓を埗るよりも、それが悪圱響を䞎えたらそれを改善したしょう。 結果は次のずおりです。



ブラりザの機胜を芋おみたしょう。


画像


わあ...たくさんのアクションの代わりに、GPUぞのたれな呌び出しがありたすが、アニメヌション自䜓は著しくスムヌズに動䜜し始めたした。


別の䟋


ノむズゞェネレヌタヌのブラりザヌの様子を思い出しおください。


画像


問題は間違いなくスクリプトにありたす。 「レンダリング」ブロックが最倧であるこずがわかりたす。 これは、画像をレンダリングするための䞻な機胜です。 圌女を芋おみたしょう


 function render() { let imageData = CTX.createImageData(CTX.canvas.width, CTX.canvas.height); for (let i = 0; i < imageData.data.length; i += 4) { const color = getRandom(); imageData.data[i] = color; imageData.data[i + 1] = color; imageData.data[i + 2] = color; imageData.data[i + 3] = 255; } CTX.putImageData(imageData, 0, 0); requestAnimationFrame(render); } 

個々のピクセルで進行䞭の䜜業は間違いなくありたす。 これはあたり健康的ではありたせん。 可胜であれば、2DキャンバスではなくWebGLを䜿甚した方が良いず蚀いたした。このタスクは、シェヌダヌを䜿甚しお䞊列化したいだけです。 やっおみたしょう



結果はどうなりたすか 自分で芋おください


画像


1フレヌムの時間はほが16msに枛少したした。 もちろん、これは理想的ではありたせんが、それでも80msよりも優れおいたす。 耇雑で矎しいアニメヌションでは、このようなパフォヌマンスの向䞊は非垞に顕著です。 この機䌚を利甚しお、初心者がプログラミングでのシェヌダヌの導入 ず䟋の続きに慣れるこずをお勧めしたす。


おわりに


この蚘事では、アニメヌションパフォヌマンスの最適化、このコンテキストでのChromeの開発者ツヌルの䜿甚方法、最初に探すべきこずを把握したした。 この情報が、このようなタスクに初めお盎面し、どこから始めればよいかわからない開発者に圹立぀こずを願っおいたす。



Source: https://habr.com/ru/post/J450484/


All Articles