mcpField
P
performance-optimization

performance-optimization

github.com/dylantarre開発134522 回インストール43 週間前に更新
リポジトリ

performance-optimization について

遅い、または途切れるアニメーションの診断と改善を支援する開発スキルです。Disneyの12原則を基に、ブラウザー向けの実践的な対策を示します。

主な機能

  1. 01アニメーション性能の診断
  2. 02CSSとキーフレームの推奨
  3. 03transformとopacityの利用指針
  4. 04表示状態に応じたアニメーション停止
  5. 05性能調査チェックリスト

活用シーン

  1. 01フレーム落ちやカクつきを調べる
  2. 02アニメーションUIのレイアウト計算を減らす
  3. 03低消費電力デバイスでの動作を確認する

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/dylantarre/animation-principles --skill performance-optimization

インストール後、Claude Code で/performance-optimizationを入力して読み込まれたか確認します。

詳細

パフォーマンスの最適化

ディズニーの12原則を使って、遅いアニメーションやカクつくアニメーションを診断し、修正します。

問題の兆候

  • フレームレートが60fpsを下回る
  • 動きが途切れたり、カクついたりする
  • UI の反応が鈍く感じられる
  • モバイルでバッテリーの消耗が早い
  • レイアウトの再計算が頻繁に発生する

原則ごとの診断

ストレートアヘッドとポーズ・トゥ・ポーズ

問題:すべてのフレームをリアルタイムで計算している
修正:ポーズ・トゥ・ポーズ(キーフレーム)アニメーションを使います。CSS トランジションまたは will-change を使って、状態間をブラウザーに補間させます。

タイミング

問題:同時に実行されるアニメーションが多すぎる
修正:アニメーションの開始をずらします。開始時刻を50~100msずつずらして、同時に行われる計算を減らします。

セカンダリーアクション

問題:セカンダリーエフェクトが多すぎる
修正:低消費電力デバイスでは、不可欠でないセカンダリーアニメーションを削除します。prefers-reduced-motion クエリを使います。

ソリッドドローイング

問題:コストの高いプロパティ(width、height、top、left)をアニメーションさせている
修正:アニメーションさせるのは transform と opacity のみにします。これらは GPU で高速化され、レイアウトやペイントをスキップできます。

ステージング

問題:画面外の要素をアニメーションさせている
修正:表示されているものだけをアニメーションさせます。Intersection Observer を使って、画面外のアニメーションを一時停止します。

すぐにできる修正

  1. JS アニメーションを CSS に置き換える - ブラウザー向けに最適化されています
  2. 位置プロパティの代わりに transform を使う - GPU レイヤーを使用します
  3. will-change は控えめに追加する - ブラウザーにヒントを与えます
  4. 同時に実行するアニメーションを減らす - 開始をずらすか、順番に実行します
  5. モバイルではアニメーションの複雑さを抑える - デバイスの性能を検出します

トラブルシューティングのチェックリスト

  • DevTools の Performance タブで長いフレームがないか確認する
  • アニメーションで transform と opacity だけを使っていることを確認する
  • 同時に実行されるアニメーションの数を数える(3~4個未満にする)
  • 対象デバイスのうち最も性能の低いものでテストする
  • レイアウトの再計算(強制リフロー)が頻繁に発生していないか確認する
  • will-change を過剰に使用していないことを確認する
  • CPU スロットリングを有効にしてテストする
  • タブが非表示のときにアニメーションが一時停止するか確認する

コードパターン

/* Fast */
.element {
  will-change: transform;
  transition: transform 200ms ease-out;
}
.element:hover {
  transform: translateY(-4px);
}

/* Slow - avoid */
.element:hover {
  top: -4px; /* Triggers layout */
}

コメント