Skip to content

macOS Firefoxで /macOS が常時重い #19

Description

@eai04191

macOSのFirefoxで https://azookey.com/macOS を開くと、ページ最上部のidle状態で常時重く、Compositorが約20fpsに張り付く。スクロールするとフレームレートが回復する。Chromeでは発生しない。

環境

  • Firefox 150.0.3
  • macOS 15.7.4

再現手順

  1. macOSのFirefoxで https://azookey.com/macOS を開く
  2. about:configgfx.webrender.debug.profilertrueにしてFPSオーバーレイを表示
  3. ページ最上部 (scrollY=0) のidle状態でFPSを観察 → 約20fps
  4. 少しスクロール → 60fps付近に回復

プロファイル

https://share.firefox.dev/42ETa92

5秒idle → スクロール → 5秒idleの計測。Compositorフレームを1秒ウィンドウで集計:

経過秒 状態 frames/s avg frame time drawCalls/frame picture cache invalidations/frame
0–4s scrollY=0でidle 20–21 47ms 304 18
5–6s スクロール中 45–59 8–12ms 150–190 14–17
7–9s スクロール後idle 59–60 3–5ms 190 9

スクロール後はavg 3ms/frame (GPU実質idle) まで落ちる。スクロール後の状態ではfixedのmini-headerfeature-card × 3、footerbackdrop-filterを持つ状態で同時に表示されているが60fps出ているため、backdrop-filter単独の負荷は要因ではない。

該当範囲のサンプル統計 (scrollY=0のidle時):

  • Rendererスレッドのサンプル大半がiokit_user_client_trap (GPU待ち)
  • メインスレッドのStylesは負荷なし
  • Render reason ANIMATED_PROPERTYが支配的

GPU律速で、引き金はhero内で常時稼働している.neural-gridのCSSアニメーション。

切り分け

DevToolsのStyle EditorでscrollY=0のidle状態に以下を1つずつ適用してFPSを計測した。

検証 適用内容 FPS
A ベースライン 18
B .neural-grid { animation: none !important } 60
C mini-header / feature-card / footer等のbackdrop-filterを全削除 18
D .neural-grid { will-change: transform !important } 18
E .neural-gridbackground-imageをsolid colorに置換 60
F @keyframes neuralFlowからrotate(...)を削除 (translateのみ残す) 60

読み取れること:

  • backdrop-filterは今回の症状に寄与していない (C、プロファイルのscroll後データとも整合)
  • will-changeでレイヤpromotionを明示しても改善しない (D)
  • rotateを抜く (F) またはradial-gradient背景を抜く (E) のどちらかで60fpsに戻る

.neural-gridのrotateを含むtransformアニメとradial-gradient背景の組み合わせで、毎フレームgradientの再評価が発生している挙動と一致する。

修正案

@keyframes neuralFlow {
0%, 100% { transform: translate(0, 0) rotate(0deg); }
33% { transform: translate(30px, -30px) rotate(1deg); }
66% { transform: translate(-20px, 20px) rotate(-1deg); }
}
のkeyframesからrotate(...)を削除する。検証Fで60fpsに戻ることを確認済み。

@keyframes neuralFlow {
    0%,
    100% {
        transform: translate(0, 0);
    }
    33% {
        transform: translate(30px, -30px);
    }
    66% {
        transform: translate(-20px, 20px);
    }
}

回転角は元々±1degと微小なので、視覚的な差はほぼ出ないはず。

(このissueは主にclaude codeによって書かれました)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions