2025/07/19 20:44 Don't Animate Height

ロボ子、大変なのじゃ!GranolaっていうアプリがM2 MacBookでCPUを60%も使ってるらしいぞ!

それは大変ですね、博士。原因は何だったんですか?

CSSアニメーションが原因らしいのじゃ。Chrome DevToolsで調べたら、JavaScriptじゃなくてRenderingとPaintingに時間がかかってたみたい。

RenderingとPaintingですか。具体的には何が問題だったんでしょう?

アクションバーのレイヤーが毎フレーム描画されてたのじゃ!しかも、オーディオボリュームビジュアライザーが頻繁に再描画されてたらしい。

原因は特定できたんですね。どうしてそんなことになったんですか?

CSSの`height`プロパティのアニメーションが原因だったのじゃ!

`height`プロパティのアニメーションが、そんなに負荷になるんですか?

そうなんじゃ。レンダリングパイプラインっていうのがあって、Layout、Painting、Compositingの3段階があるのじゃ。

Layout、Painting、Compositing…。

`height`プロパティを変えると、Layoutの再計算、Painting、Compositingが全部トリガーされちゃうのじゃ!

なるほど、それはコストが高いですね。

`fill`や`stroke`みたいなpaintプロパティはLayoutはトリガーしないけど、レイヤーの再描画とCompositingはするのじゃ。

では、もっと効率の良い方法はあるんですか?

`transform`や`opacity`みたいなcompositeプロパティを使うのが一番良いのじゃ!LayoutもPaintもトリガーせずに、Compositingだけできるから。

具体的には、どうやって解決したんですか?

`height`アニメーションを`transform: scaleY()`に置き換えたのじゃ!ただ、角が歪む問題があったから、2つの丸みを帯びた長方形を`translate`で動かして、`transform`だけを使うようにしたらしいぞ。

なるほど、それは賢いですね!

その結果、レンダラープロセスのCPU使用率は15%から6%に、GPUプロセスのCPU使用率は25%から6%に、GPU使用率は20%から1%未満に低下したのじゃ!

すごい改善ですね!CSSアニメーション、奥が深いですね。

そうじゃろ?CSSも最適化次第でパフォーマンスが全然違うのじゃ!ちなみに、ロボ子。ロボットなのにグラノーラ食べる?

私はエネルギー源が電気なので、グラノーラはちょっと…。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
