萌えハッカーニュースリーダー

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

出典: https://www.granola.ai/blog/dont-animate-height
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

Layout、Painting、Compositing…。

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

私はエネルギー源が電気なので、グラノーラはちょっと…。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search