Canvasで降る雪のアニメヌションは、DOMのアニメヌションよりも数倍効果的です

。 DOM芁玠のネむティブJSず比范しお、Canvasでのアニメヌションアルゎリズムの実装は通垞、䜕倍も生産的です。 これはよく知られた事実ですが埌で説明する少数のパヌティクルの機胜を䜿甚、埓来の「NG」を劚げるもののすべおを実装する方法を芋぀けるこずができたすが、合理的なナヌザヌ「雪が降る」に駆動されたす。 負荷を軜くするために、近幎では、最小限の雪片5〜15で、ほずんど目立たないように、サむト䞊で雪を「発射」するのが良いず考えられおいたす。 効果があり、プロセッサにほずんど負荷がかかりたせん。



したがっお、冬がNGたで数日になるたで 、キャンバスに最高のアルゎリズムずDOMの類䌌物を実装するためのハッカ゜ンを手配するこずを提案したす。䞻に叀代のネむティブアルゎリズムをベヌスずしお、最倧でjQueryプラグむンでラップしお接続しやすくしたす。 これらのアルゎリズムのほずんどは、プロセッサの負荷を分散しおいないか、効率が悪いため、雪片の数が少ない堎合でも、プロセッサの負荷は100です。 以䞋はレビュヌ蚘事の䟋です 。10を超える実装が考慮されおいたすが、すべおが自然界にあるわけではありたせん。 さらに、アルゎリズムの開発ずその実装を効率よく行うための基盀を埗るために、いく぀かのお気に入りを怜蚎したす別の5〜6のオプションを取埗したす。 これに基づいお、リビゞョンを䜜成できたす。 Githubには12のデモ以䞋にリンクを繰り返したすずいく぀かのアルゎリズムがありたす。



い぀ものように、Habréの蚘事の寿呜は1.5日を超えないため、有効な圚庫を数えるこずはできたせん。 しかし、新幎の埌、さたざたな奇跡が起こりたす。蚪問者の流れが萜ち、ランダムな狂人が5日間、1぀の蚘事を忘れないチャンスを埗たす。 圌らは圌らに賭けた。



匿名のサンタクロヌスのクラブなどの長いプロセスに結び付けられおおり、「雪が降る」ためのオプションを議論し、開発するためのバむンディングをい぀でも取埗できるず同時に、䌑日に密接に結び付けられおいない方が良いです。 結果は珟圚ここにありたす geekadm.ru / # / 2015 、そしおもちろん46.101.141.171/snow.html?v=4のような䞭間実隓がありたす-HabraAdmの雪には远加の効果がありたす。



予備的な「ハッカ゜ン」は、1察の参加者ずたたはクラブの蚪問者1 、 2によっおアレンゞされたした。 その結果、Canvasを䜿甚した゚ンゞンで最倧10個のオプションが刀明したした。 それらの数ははるかに倚くなる可胜性がありたすが、すべおに自由時間が必芁なので、アクションはオヌプンなものに倉わりたした。 たずえば、Peter Gehrigによる雪片の萜䞋モデルを2003幎に既に䜜成された゚ンゞンに「ねじ蟌む」こずができたす。 2005-2006幎の改蚂では、20-30枚の雪片がプロセッサにわずかに負荷をかける10-20、電源ずビデオカヌドに䟝存したす。以䞋、JSはシングルスレッドであるため、 1぀のプロセッサコアの読み蟌みに぀いお説明したす 叀いフォヌラムによるず、Opera 9やIE6などの叀いブラりザヌでも同様でしたが、やや劣っおいたした。 同じアルゎリズムを䜿甚するCanvasでは、5倍以䞊のオブゞェクトを実行できたす。









デモ








歎史を芋お、そのコヌスを芋おみたしょう



2002幎から2005幎頃たで、最初から始めたしょう。 Javascriptは、萜䞋する雪片をアニメヌション化する胜力を瀺したした。 確かに、それは刀明したした。圓然のこずですが、スクリプト䞊のアニメヌションは非生産的であるか、プロセッサに倧きな負荷をかけおいたす。 そのため、圓時はリ゜ヌスを倧幅に節玄するか、ブラりザストリヌムで最倧100たでプロセッサをロヌドする必芁があり1コアで、他のタブOpera 9などのブラりザずりィンドりを遅くしたした。そしお、これはそのようなペヌゞぞの蚪問者のひどく隠されたdigりを匕き起こしたした。



8幎埌、この問題の解決策がブラりザヌレベルで芋぀かりたした。 Chromeから始たる䞻芁なブラりザは、非衚瀺のタブでスクリプトの実行を䞀時停止し始めたした。 これは、他のりィンドりやプログラムの衚瀺を劚げないようにしたしたただし、別のりィンドりに切り替えおも䞀時停止せず、りィンドりが画面に描画されおいないか、郚分的に衚瀺されおいる堎合のみ負荷を軜枛したす。 ただし、モバむル時代に関連しお、アニメヌションを読み蟌んでペヌゞを開くこずはただ積極的に認識されおいたせん。



しかし、長幎にわたっお、より高床なアニメヌションメカニズムであるCanvasが登堎したした。 別の革新的なメカニズム-CSSのアニメヌション-は負荷を節玄するのに圹立ちたせん。たた、Javascript + DOMのアニメヌションずたったく同じようにプロセッサの゚ネルギヌを消費したす。 ぀たり、最適な゜リュヌションを探す堎合は、Canvasで行う必芁がありたす。



䟋でわかるように、Canvasでは、平均的なデスクトップコンピュヌタヌたたはラップトップで、30〜40の負荷で100個の雪片を起動できたす。 これは、最適化されたJS + DOMアルゎリズムが実行できるよりも玄5倍効率的です。



歎史ぞのオマヌゞュずしお、最適化ずCanvasぞの倉換を埅っおいる「叀兞的な」アルゎリズムを怜蚎したす。



「snowfall js」、「snow flakes js」などの単語をGithubで怜玢するず、倚くのアルゎリズムを簡単に芋぀けるこずができたす。 これらは、 䞊蚘のデモリンク たたは拡匵コピヌ で12のスクリプトの適切な遞択を補完したす 。



アルゎリズムの抂芁ず䟋



䟋を含むペヌゞを衚瀺するずきは、プロセッサコアの100の読み蟌みに備えおください。蚘事にリンクを衚瀺するずきは、読み蟌みレベルが譊告されたす。



倚くのアルゎリズムは、効率が悪いこずに加えお、雪片の実際の動䜜ず動䜜が䌌おいたせん。 おそらく、倚くの人は、正匊波䞊の雪片の動きの珟実の印象的な䞍䞀臎を芚えおいたす。 䞀床たたはより新しい  芋られるず、吊定的な䟋ずしお長い間蚘憶されおいたす。 したがっお、アルゎリズムのタスクは効果的であるだけでなく、珟実を反映するこずでもありたす。 効率の芳点から、調和関数の蚈算も倱われるはずです。



以前にレビュヌしたアルゎリズムのうち、2぀は珟実に最も近いず考えるこずができたす-ランダムな動き座暙ではなく速床を倉える必芁がありたすず前述のPeter Gehrigアルゎリズム2003では、動きは4぀の倉数によっお制埡され、そのうちの1぀は調和的に倉化し、 「ねじれ」の呚期的な圱響。 ただし、この機䌚に、新しい実装を議論しお貯金箱に远加できたす。



芋぀かったP. Gehrigアルゎリズムの実装から、䟋のあるペヌゞが芋぀かりたした www.softtime.ru/javascript/snow-falling.html 。 䜕が危機にatしおいるのかは明らかです。 少数の雪片15-20がプロセッサヌをあたりロヌドしたせん匱いノヌトパ゜コンでは10-20。ChromeおよびFirefoxで動䜜したすが、Opera 9、IE5および6、および初期のFirefoxの䞀郚はサポヌトリストに蚘茉されおいたす。 もちろん、圌らはCanvasを知りたせんでした。



私たちが芋たものをテヌブルに持っお行きたしょう。

*粒子の数。

*アニメヌションのタむプ。

*実隓甚のサンドボックスの存圚。

*CPU負荷MacBook、Firefox 43Chromeは通垞10効率的です;

*機胜に関するコメント。



実際のプロセッサロヌドデヌタは、さたざたなコンピュヌタ、さたざたなグラフィックカヌドを搭茉したコンピュヌタ、および広範囲にわたるモバむルデバむスに察しお瀺されたものずは異なりたす。これらは、グラフィックスが統合された䞭電力ラップトップの向きを瀺しおいたす。



Canvasを䜿甚しおスクリプトを簡単に芋おみたしょう。

玔粋ではないjs デモ400x400、 雪が降る雪だるた
デモごずのパヌティクル 100




タむプキャンバス
サンドボックス- はい
負荷 70
コヌド行 106 + ProcessingJS800K
これは、Rapierのような蚀語を䜜成する800Kの非圧瞮コヌドのProcessingJS環境で描画されたす。 雪だるたは同じコヌドで描かれおいたす。 䟋は特別なものです。 耇雑な方法で単玔な問題を解決するためにシェルで䜕でもできるこずを瀺しおいたす。この堎合でも、Canvasは壊滅的にDOM゜リュヌションに負けおいたせん。
蚘事en 、2012 コヌド Github デモ 党画面
デモごずのパヌティクル 500




タむプキャンバス
サンドボックス いや
負荷 100
コヌド行* .html + ThreeCanvasJSの50 + 10072K
ThreeCanvas.jsラむブラリからの72K圧瞮アンパックコヌド。 マりスの動きが回転する3Dシヌン。 ここでは、スムヌズな動きのために䜎ビットレヌトが蚭定されおいるため、すべおが矎しいですが、バックグラりンドアクションずしおはあたり適切ではありたせん。
幎2010 コヌド JS デモず説明 党画面
デモあたりのパヌティクル 60 、画像の平面内でスピン




タむプキャンバス
サンドボックス いや
負荷 100
コヌド行 160
非垞に頻繁なアニメヌションでは、Canvasの利点を理解できたせん。 描かれた雪片はその軞を䞭心に回転しおおり、さたようこずのあるゆっくりずした萜䞋です。 しかし、それらのいく぀かは正匊波に沿っお「歩き」たす。1぀の平面のねじれはたったくリアリズムを䞎えたせん。反察に、効果の知芚を拒吊し、むしろ重芁な効果を䜜成したす。 コヌド-それどころか、その力ずコンパクトさを瀺しおいたす。 芁するに、優れた努力は、消費者に察する効果ずはわずかに異なる効果を達成するこずを目的ずしおいたす-DOM䞊の゚ネルギヌ消費゚ンゞンよりも優れおいたせん。


CanvasなしでDOMレむダヌで動䜜するスクリプトの䟋を芋おみたしょう。



幎2009 デモ jSnow-jQuery Snow Effect 、フルスクリヌン コヌド JS 非圧瞮のレガシヌ
デモごずのパヌティクル 25




タむプDOM
サンドボックス いや
負荷 70
コヌド行 160 + jQuery
Fiddleサンドボックスのオプションどこでもシンボリックスノヌフレヌクが䜿甚されたす

  • jQuery 2に適応した、サンドボックス内のパックされた難読化された オリゞナルコヌド 。

  • パックされおいないが、jQuery 2に適応したサンドボックス内のmod 1のmod 1コヌドの動きが悪い小さな正匊波。

  • サンドボックス内のこのスクリプトの名前、スタむル、 最も類䌌した動䜜コヌドフィドルのリファクタリングにより埩元されたした。 停止ボタンで停止/開始したす。 圧瞮圢匏で-1.5K。

  • ブロックたたはりィンドり党䜓で耇数のオブゞェクトを実行する機胜に拡匵されたした。 コレクションを実行したす。 圧瞮圢匏-1.8 K、オリゞナルよりも小さく、異なるmodの堎合は2.2〜2.4です。
このスクリプトには、粒子の動きの特城的な手曞き文字がありたす偎面に匷く。 よく芋るず、これらは非垞に倧きな正匊波であり、窓の䞭倮にある倧きな枊巻きのように芋えたす。 圌は資源の浪費に非垞に拘束されおいたす。 ゜ヌスコヌドバヌゞョン1.2-パッカヌによっお玛倱たたは垞に難読化された。 アンパックされたバヌゞョン1.1.mod2他の䜜成者によっお倉曎された-Codepenサンドボックスにありたすが、キャンセルされた$ .browserを参照するため、新しいjQueryでは機​​胜したせん。 そしお、圌らは開梱の兆候を瀺しおいたす。 正匊波が芋萜ずす時間がないずきに、䜎いヘッダヌ 䟋 で芋栄えがしたす。 数十の䟋のうち、2぀実行ずコヌドを詳しく芋るず、この䟋もその1぀です。 そのため、サンドボックスでjSnowバヌゞョンを実行しお培底的に取り䞊げたす。

興味深いこずに、䜜成者のパッケヌゞバヌゞョン1.1たたは1.2ははるかに高速です同じ倖郚蚭定でプロセッサにロヌドされるのは40で、 1.1.mod2は55です。 マルチりィンドりモヌドではフィドルも高速に動䜜したせん。おそらく、䞍必芁なチェックはスノヌフレヌクレンダリングサむクルに圱響を䞎えたす「機胜」がmodに远加されたした。 コヌド自䜓はあたり最適化されおいたせん-ルヌルで蚭定できるむンラむンスタむルを蚘述したす。



その埌、より興味深いものになりたした-テストされた蚭定でコヌド内に倚数のバグが芋぀かりたしたこれは、党員が芋぀かったずいう意味ではありたせん。 コヌドにいく぀かの倉曎を加える必芁がありたすjQ 2+ずの非互換性を削陀し、スノヌフレヌクの初期䜍眮を蚈算し、りィンドりの巊端を超えないようにしたす-ポピヌでは、スクロヌルバヌの「点滅」に぀ながり、䞋の境界線でも同じこずを行うず䟿利です、より改良された最新バヌゞョンを䜿甚しおください。



Mods-versions2009-2010はいく぀かの緊急の「機胜」を远加したした-雪片のスムヌズな消倱の蚭定fadeAway1および雪片のフィヌルドを移動せずにスクロヌルする機胜followScroll1。 開発者が呌んだように、名前は元のたたです。



叀いコヌドをデバッグする目的は、アルゎリズムをCanvasに転送し、速床を比范するこずです。 勝぀ための障害-十分な名誉ではありたせん。蚭定では、他の人を批刀したのず同じ間違いを繰り返したす。 開発者にずっおは、2Dで降るマルチカラヌの雪が発生しないこずは重芁ではありたせん。䞻なこずは、カラヌ化する技術的な可胜性があるこずです。 それでも、雪片が飛ぶのではなく、珟実には塊がありたす。 しかし、地球の人口の3/4がこれを知らないため、成功が埅っおいたす...雪片のセットでは、雪片に䌌たほずんどのUnicode文字が䜿甚されたした。



そのため、機胜を倱い、ストップスタヌトボタンを远加するこずなく、最高のMODよりも20行短く90行、パック圢匏で30少ない1.5K読みやすいコヌドが刀明したした。 この䞭間バヌゞョンはコンパクトですが、以前ず同様にりィンドりで機胜し、パラメヌタヌで高さ高さ数倀を絶察に蚭定できたす。 特にプラグむンはコンテキストコレクションをたったく䜿甚しないため、これはあたり䟿利ではありたせん。したがっお、$の奇劙な倖芳で問題ありたせん。JSnow...、぀たり コンテキストなし。 簡単にわかりたしたが、 ここではデモぞのリンクに限定したす 。



そしお、タスクを耇雑にしたす-jQueryコンテキストコレクションの䜿甚を開始したす。 コンテキストがない堎合、この動䜜を保持したす-りィンドりず$ 'body'のコンテキストのように、りィンドりでの䜜業を遞択し、コンテナヌブロックでの䜜業を远加したすたずえば、$ '。ContSnow'で実行したす。 。。 コンテナを準備する必芁がありたす。絶察䜍眮の挿入されたブロックが心地よいように、䜍眮盞察が必芁です。 りィンドり党䜓で異なる動䜜をするブロックはりィンドりをカバヌするため、そのようなブロックがある堎合はすべおのペヌゞコンテンツを䞊げる必芁がありたす。 それ以倖の堎合は以前ず同様に可胜ですが、なぜ耇雑なのでしょうかむしろ、最初のスクリプトたたは2番目のスクリプトのいずれかを䜿甚したす。次のような結果になりたす。



デモ レポゞトリ内のコヌド これはDOMです。負荷はストリヌムあたり3015-合蚈で、ビットレヌトは12です。

写真が倧きく透明であるずいう事実にある皋床圱響を受けおいたす。



実際、jQueryがコレクションを提䟛できるのに、なぜ1぀のコンテナヌだけで動䜜するのですか 70-120個のパヌティクルに察しお30-50の負荷がかかるこずが刀明したした。 ストップスタヌトは、ボタンに分割するか、共有するこずもできたす。



曞かれたものを適甚しようずするず、すぐにコレクションでスクリプトを実行するこずの非実甚性に目がいきたす。 実行-はい、数十個のスクリプトのむンスタンスでさえ、雪片のそれぞれに配垃できたす。 ただし、同じパラメヌタヌがコレクションのすべおのブロックに報告されたすが、これは実甚的ではありたせん。 より倚くの堎合、別のタスクを実行する必芁がありたす-いく぀かのりィンドり仮想、ディヌバを起動したすが、異なるパラメヌタヌを䜿甚するため、1぀の芁玠にそれらを䌝える必芁がありたす。 ほずんどの堎合、倚くの芁玠、非垞に倚くの.jSnow起動が必芁であるこずが刀明したす。



CSSルヌルを蚘述するこずず類䌌しおいたす。 ルヌルは、プラグむンを実行するずきに行うパラメヌタヌの宣蚀ず同じです。プラグむンのセレクタヌも配眮されたす。 しかし、珟圚、メカニズムがルヌルの蚘述を埐々に蓄積する方法はありたせん䞀方のフォントサむズず他方のフォントサむズに䌌おいたす。 同じ芁玠でプラグむンを2回起動するず、プラグむンの別のむンスタンスクロヌゞャヌずシャットダりン機胜を備えた長時間実行機胜が远加され、既に実行䞭のプラグむンにはプロパティが远加されたせん。 この堎合、JSON蚭定ではなく、セレクタヌクラスを持぀文字列のみをリストする方が䟿利です。 しかし、蚭定を䜜成するこのような方法が必芁であり、機胜する単䞀のプラグむンを思い出したせん。 デモの最も高床なバヌゞョンでは、プラグむンができるように4぀の領域で起動を䜜成したす。





demo 、 レポの猫 、75個のパヌティクルず12 FPSで50を読み蟌みたす。



プラグむンの改善により玄300バむトの圧瞮コヌドが远加されたしたが、今ではより倚くの理由でプラグむンず呌ぶこずができたす。 確かに、1぀のメ゜ッドはありたせん。



DOMを操䜜するためのその他のスクリプト



そのような泚意は、最も高床なスクリプトではなく、1぀のスクリプトに向けられおいたす。先を芋るず、それはCanvasスクリプトの少しの競争盞手であるこずがわかりたす。 効果的に曞かれおいないものは競合他瀟にはなりたせん。したがっお、コヌドに䜙分なものを蚱可するこずはできないため、比范察象がありたす。



たずえば、 Snowstormずいう非垞に人気のあるDOMスクリプトがあり、20Kの圧瞮コヌド、非垞に倚数の蚭定、モバむルデバむスでの無効化などがありたす。小さなスクリプトに぀いお孊ぶべきこずがありたす。 しかし、䜙蚈なものずそれが損倱に぀ながるかどうかを研究するこずは、難しい䜜業です。 簡単に曞いお蚭定を拡匵したす。 それぞれの重芁性は、テストず実践を通じお明らかにされたす。



すぐに別の小さなスクリプトを芋おいきたしょう。これは、適切に蚭蚈されたデモやサンドボックスには芋られたせんでしたが、興味深い動䜜がありたす䞊蚘のP. Gehrigによる。 サンドボックスに眮くのに倧きな困難はありたせん。改善の必芁はありたせん。jQueryはそれを䜿甚したせんが、珟代のdoctypeに慣れるには時間がかかりたした。 たた、システムフォントの特殊なUnicode文字では以前は問題がありたしたが、今では改善されおいるため、萜䞋する文字は萜䞋するテキスト匷調衚瀺された雪片に眮き換えられたす。

幎2005幎、 蚭定 、 コヌド 、 jsFiddleで 雪が 降る
デモごずのパヌティクル 25
タむプ DOM
サンドボックス はい
負荷 10 8 FPSによる
コヌド行 90
元のスクリプト蚭定でのこのような小さなシステム負荷は、FPSセットが䜎いために発生したす。 もちろん、これは頻繁なスラむドショヌずしおの動きで顕著です。 これは叀いブラりザに必芁であり、叀いスクリプトのコメントで譊告されおいたす。 30 FPSでは、負荷は35で、同じ蚭定の以前のスクリプトずほが同じです。



このスクリプトには、ブラりン運動を远加し、画面の「遠方から」の萜䞋、増加および「融解」透明床の増加付近たたは䞋ぞの倉曎が加えられおいたす。

幎2006幎、 蚭定で「遠くから」萜ちおくる雪 、 jsFiddle
デモごずのパヌティクル 25

フルスクリヌンで芋る
タむプ DOM
サンドボックス はい
jsFiddleにダりンロヌド 60 16 FPS
コヌドの行 100
ここでは、サむズ蚭定は非垞に「気たぐれ」です-成長率のわずかな倉曎で、巚倧な雪片を取埗するか、成長しないこずができたす。したがっお、他の行動シナリオを遞択する必芁があり、効果は最終的にりィンドりのサむズず行動に䟝存したす自動調敎ではありたせん。 負荷の顕著な増加は、倧きな透明な文字画像のレンダリングに関連しおいたす。 ゜ヌスコヌドは厳密に蚘述されおいるため、間匕き埌の実際のコヌド量は2倍になりたす。



Githubですべおのコヌドオプションをsnowで曞きたしょう。 デモペヌゞを䜜成しなかった前任者の欠陥を考慮に入れるため、コヌドを芋る人ははるかに少なくなりたす。 Githubを䜿甚するず、gh-pagesブランチで䜜業する堎合にデモを非垞に簡単に実行できたす。 これで、すべおのバヌゞョン倉曎が倉曎履歎に簡単に蚘録され、違いが芋られたす。 Github github.com/spmbt/snowfalls



CSSアニメヌションはどうですか



さらに、効果的なアルゎリズムず玠晎らしい結果を求めお、他の人が曞いた䟋を芋おいきたす。



1. DOMスノヌフレヌクの回転を䌎うCSS3の負荷の高いアニメヌションの䟋ほが唯䞀のCSSアニメヌション  -www.jqueryscript.net/animation/jQuery-Plugin-For-Snowfall-Effect-with-Rotating-Snowflakes.html このサむトには、スクリプトごずの説明、コヌド、デモがありたすが、サンドボックスはありたせん。



2. CSSCodepenの3぀の画像レむダヌのアニメヌション。



システムにあたり負荷をかけないスクリプトを芋぀けるために、キャンバス䞊でより倚くのアニメヌションを芋るようにしたす。



マりスの動きによっおアクティブにされるCanvasのアニメヌションの䟋では、蚱容できる雪片の数は、画面䞊で玄200-300からの連続生成ではなく、玄50-100であるこずがわかりたす-www.jqueryscript.net/animation/Yet-Another-Falling- Snow-Animation-with-jQuery-Canvas-GlauserChristmas.html



ラむブラリのないCanvasの別のアニメヌション、䞭囜語のデモずコメント www.jqueryscript.net/animation/Nice-Snow-Falling-Effect-with-jQuery-Canvas-Nice-Snowing.html



䜕らかの理由で、Canvasを含むこれらすべおのアニメヌションは、プロセッサより正確には、シングルスレッドJSがロヌドできる1぀のコアをロヌドするように蚭定されおいたす。 これは、スクリプトのデモでは正垞ず芋なされるようです。 おそらく、これは個別のグラフィックスカヌドで圓おはたりたす。



どういうわけかそれはすべお奇劙です



snowを䜿甚したスクリプトの䞭で、CPUセヌバヌはほずんどありたせんが、DOMずCanvasの䞡方で䜿甚できたす。 100個ではなく、数千個の雪片でも同じ党負荷効果が埗られるこずを瀺しおいたす。200-400個の堎合、通垞のカヌネル負荷を10-20考慮するこずをお勧めしたす。



効果的なキャンバスの遞択



ただし、クリヌンなCanvasには経枈的なスクリプトが1぀ありたした。 ほが圌のスタむルで䟋を行いたす。

幎2015 デモ HTML5 CanvasずJavascriptを䜿甚した雪効果 、フルスクリヌン jsFiddleにコピヌする
デモごずのパヌティクル 25




タむプ キャンバス
サンドボックス- はい
負荷 45
コヌド行 90
この䟋は、䞊蚘の䟋のように、これ以䞊䜕もしないすべおのコヌドを制埡する堎合、成功は近いこずを瀺しおいたす。 200個のパヌティクルChrome内でも負荷は452぀たたは3぀のプロセス-Chromeず2぀のChromeヘルパヌを監芖する必芁がありたす、2000幎では60です。Firefoxの堎合-ほが同じですが、10遅い良い条件䞋よりランダムな抑制因子。
しかし、キャンバスは軜負荷では問題がありたす。 倚くの堎合、2぀のパヌティクルでの負荷は40〜60で、25の堎合ず同じであり、実行されおいないsetIntervalの堎合は0です。 ドラフトを䜜成するずプロセッサヌがロヌドされ30 FPS-30の割合、ドラフトの量はそれほど重芁ではありたせん。 明らかに、ビデオカヌドの品質が悪いず、結果は悪化し、どこかで改善が芋られなくなりたす。Canvasがある堎合は垞に速床が䜎䞋し始め、FPSを䞋げるこずによっおのみ修正を行うこずができたす。



より詳现には、結果は次のずおりです。 結果ぞの圱響が少ないjsFiddle を䜿甚し 、停止ボタンを远加しおサンプルをコピヌしたす。 プロセッサの費甚が萜ち着くたでマりスを動かさずに、䜕もせずに別の数の雪片を開始し、1分ほど埅ちたす。 アクティビティモニタヌIntel HD Graphics 5000ビデオを搭茉したMacBookで結果を確認したす。 たずえば、4コアプロセッサでWindowsを芋るず、25を超える負荷はありたせん。 蚘事でここで蚀及されおいる100は、シングルコアの読み蟌みに関連しおいたす 。 25に4を掛ける必芁がありたす。ブラりザは異なる方法で䞊列化する方法を知らないだけですが、ラップトップのこの負荷は非垞に敏感であり、おおよそビデオを芋るずきのように゚ネルギヌ消費に぀ながりたす。



未完成のレンダリング-10の負荷バックグラりンド。

0粒子-30;

2パヌト-35;

25個の粒子-40;

200個の粒子-50;

1000-55;

2000-65。

この堎合、読み取りは垞に繰り返されるわけではなく、他の実行䞭のプログラムずメモリ䜿甚量に䟝存したす。



これが、Canvasの出珟により、誰もがすぐにプログラミングを急ぐこずがなかった理由の鍵です。 プロセッサ、実装の最初の可胜な䞍完党性、およびブラりザでの䞍完党なサポヌトにより、蚱容されるビットレヌトを実珟できなかったため、動きの質が良奜な堎合、パヌティクルの数ではなくビットレヌトに䟝存し、同時に理想的には20に収たる「パフォヌマンスの資栌」を枡すこずができたした。 レむダヌ䞊のアニメヌションを䜿甚するず、少なくずも5぀のパヌティクルを実行し、この資栌に合栌できたす。 パフォヌマンスが向䞊し、Canvasを䜿甚しないIE8では玄0.5になりたした 。



カスタムキャンバスアルゎリズム



canvasで経枈的なアルゎリズムの独自のバリアントを䜜成したしょう。 最初に、平面をトヌラスに閉じ、雪片を各粒子の速床に適甚される小さなランダムりォヌクで颚䞋に移動させたす。 突颚の印象はありたせんが、それは非垞に自然に刀明したす。 2番目の効果は芖差です。これは、小さな粒子がよりゆっくりず萜䞋する堎合で、シヌンの立䜓感を生み出したす。



このような蚭定では、最初のパンケヌキが行きたした。

幎2015 : , ,
: 100




: Canvas
—
: 35%
: 50
, , , , . «» , . *.999 «». , . , .



— . , , , ( , ).
2 : ,
: 1000




: Canvas
—
: 40-50% (30 FPS)
: 50
, : , . «» .



, . , . .



, , . . , ( , 30% , 120 ).




Kafeman



䞊行しお、カフェマンは雪やその他の䌑日の効果で台本を䜜りたした。

最初のアむデアは、ADMクラブの蚪問者に効果のあるりェルカムペヌゞを䜜成するこずです。すべおがより深刻になる可胜性がありたすが、歎史は仮定法の気分を蚱容したせん。加えお、玔粋に実際の降雪芋に蚪れたアむデアを装食1、2、3ず密接にそれらの䞍快なちら぀きの雪粒子をシミュレヌトしたす。完璧はただ達成されおいたせんが、方向にはあらゆる理由がありたす。そうでなければ、顔に圫られた気を散らす雪は蚘憶されたせん。ここでは、圢のないフレヌクずそのがやけたちら぀きのレンダリングを詊す必芁がありたす。



そしお、䜕らかの方法で積雪を成長させる必芁がありたすjsfiddle.net/162e4jte/3ですが、宇宙飛行士が惑星党䜓を飲み蟌むほどではありたせん。最初に、圌は結栞ずしお解䜓し、溶けたしたjsfiddle.net/162e4jte/1。この動䜜は、他の著者のスクリプトで発芋されたした。



たあ、将来的には、゚ンゞンゞェネレヌタヌを1぀に結合するずいうアむデアも実行に倀したす。結果によるず、サヌドパヌティの著者のスクリプトの塊に加えお、3〜4個のパヌティクルモヌションアルゎリズムず2぀の実装方法があり、それらの共通郚分は提出されたサンドボックスずリポゞトリでかなり良奜です。



いく぀かの統蚈。地球枩暖化により、スキヌず同様にJavascriptず連動した雪ぞの関心が䜎䞋しおおり、CanvasずJavascript-成長しおいたす。これで、どの組み合わせで安定した関心が確保されるかがわかりたす。



おわりに



雪の効果に察しお実際に実行可胜な2぀のプログラミング方法DOMレむダヌずCanvasには、独自のアプリケヌションニッチがありたす。最倧玄50個のパヌティクルで、DOMが勝ちたすが、すべおのモヌドではなく、プロセッサヌの負荷が小さいタスクが必芁です。高ビットレヌトはバヌを䞋げたす。50を超えるただし、自信を持っお-200を超える-䜎いビットレヌトが望たしい-Canvasが勝ちたす。ただし、プロセッサリ゜ヌスの30からダりンロヌドを増やす必芁がありたす。境界ず基準は非垞に䞍安定であり、ハヌドりェア、ブラりザ、ブラりザでの゚ンゞン実装の成功に䟝存したす。モバむルナヌザヌは、5個以䞊のパヌティクルに察しお「ノヌ」ず断蚀したす。倧きなビデオカヌドを䜿甚する静止画は、DOMの200個のパヌティクルずCanvasの5000個の問題を真understandに理解したせん。



兞型的な商甚アプリケヌションのアルゎリズムから䜙蚈なもの䌑日の゚リアでのナヌザヌの泚意はすべお削陀し、異なるデバむスでアルゎリズムをテストし、ナヌザヌカバレッゞのニッチに぀いお決定する必芁がありたす。 Canvasでより倚くの勝利を収めた䜎ビットむルミネヌションや、短期的な花火があるかもしれたせん。どのボタンでアニメヌションをオフにし、ナヌザヌの蚭定で「アクションがうたくいった」こずを芚えおおいおも問題ありたせん。雪はYandexブラりザほど金銭的ではないので、このボタンを意識的に「壊す」理由はありたせん。数幎のうちに、キャンバスの状況が改善され、少数のパヌティクルず増加したビットレヌトの領域をゆっくり遞択するこずを期埅できたす。



雪の台本の衚珟の可胜性は基本的にこの段階で䜿い果たされたすこのグルヌプでは近幎、質的に新しいものは登堎しおいたせん。十分に完成したスクリプトには、必芁に応じお認識される倚くのプロパティがあり、䞀郚のパフォヌマンス䞊実行䞍可胜なプロパティ3D圢匏での雪片の回転は実行されたせんが、これは誰にも迷惑をかけたせん。ただし、キャンバスでの生産的なレンダリングにより、このようなスクリプトが衚瀺されるこずが予想されたす30の負荷で。



コヌディングの芖点-蚭定によっおDOMたたはCanvasのオブゞェクトを提䟛するコンストラクタヌを䜜成できたす。デザむナヌは異なる著者を曞くこずができたす。 このアプロヌチでは、プロゞェクトがHabraADMeGithabに線成されおいるgithub.com/clubadm/snowmachine。このリポゞトリからjsFiddleを介しお珟圚のコヌドを実行したす。



All Articles