Mac で WindowServer の高 CPU を直す
WindowServer は macOS のディスプレイ合成器です。CPU 使用率は、複数のディスプレイにまたがってアプリの画面を合成するために必要な作業量を反映しますが、プロセス名だけでは、どのアプリが繰り返し再描画を起こしているかはわかりません。アニメーション中、画面共有中、またはディスプレイ構成の変更中に数値が高くなること自体は普通です。本当に見るべきシグナルは、アイドル時に続く負荷と、応答性・発熱・バッテリー駆動時間への測定できる影響です。
WindowServer とは何か
WindowServer は macOS のコンポジタです。画面上に見えるすべてのウィンドウ、メニュー、アニメーション、ピクセルは、すべてのディスプレイをまたいで WindowServer が描画・合成しています。画面上のすべてに関わるため、重いグラフィックス負荷は、原因となったアプリではなく WindowServer の CPU として現れます。そのため犯人のように見えますが、実際にはメッセンジャーです。
何が負荷を上げるのか
WindowServer を忙しくさせる要因は、だいたい次のようなものです。
- 多数のウィンドウと Spaces。 開いたままのウィンドウが何十個もあり、仮想デスクトップも多いと、すべてを追跡して合成する必要があります。
- 外部ディスプレイと高解像度ディスプレイ。 押し出すピクセルが増え、とくに 4K や 5K、あるいは複数モニター同時接続では、ベースラインが着実に上がります。
- スケーリングされた解像度。 ディスプレイをネイティブではない「〜のように見える」解像度で使うと、より大きなレンダーサーフェスとダウンサンプリングが必要になることがあります。コストは Mac、ディスプレイ、スケーリングモード、作業内容によって変わります。Retina スケーリングそのものは正常です。
- 透明度とモーション。 メニュー、Dock、Control Center のぼかしや半透明は、WindowServer が継続的に計算するライブ効果です。
- 常に再描画しているウィンドウの多いアプリ。 たとえば高速に出力し続けるターミナルや、バックグラウンドでアニメーションしているページなどです。
- キャプチャとリモートディスプレイのソフト。 画面収録、ビデオ通話、AirPlay、リモートデスクトップ、仮想ディスプレイ系のツールは、キャプチャや合成の作業を追加します。
- 高いリフレッシュレートと動きのあるデスクトップ。 フレームが増えたり、ピクセルが絶えず変わったりすると、ウィンドウに触れていなくても作業量が増えます。
落ち着かせる方法
まず、手軽に効くところから進めます。
- 透明度を下げる: System Settings > Accessibility > Display を開き、Reduce transparency をオンにします。Apple の Display settings guide に見た目の変化が説明されています。ライブ効果の負荷が下がることはありますが、パフォーマンス対策として残す前に、同じ場面で前後を比べてください。
- モーションを減らす: いまは Accessibility > Motion に専用パネルがあります。Apple の Motion guide によると、アプリを開く、デスクトップを切り替えるといった操作のアニメーションが変わります。
- デフォルトのディスプレイスケールや、低いリフレッシュレートを試し、同じ作業で比較します。スケーリングはすべて悪い、という前提だけで読みやすい文字を犠牲にしないでください。
- 使っていないウィンドウと Spaces を閉じるかまとめ、バックグラウンドで激しく再描画するアプリを終了します。
- 画面収録、リモートデスクトップ、動く壁紙、仮想ディスプレイを一度にひとつずつ一時停止し、持ち主を特定します。
- 診断としてディスプレイを 1 台外す。 ベースラインが変わるなら、そのディスプレイのスケール、リフレッシュレート、ケーブル、アダプタを別々に試します。
証拠を集めてからログアウトして再ログインしてください。これでユーザーのディスプレイセッションが再起動されます。再起動は、再描画バグの原因アプリを特定せずに症状だけ隠してしまうことがあります。
瞬間のパーセンテージだけで判断しないでください。Activity Monitor で同じアイドルの場面を数分見守り、アニメーションやキャプチャの負荷をひとつ再現し、疑わしい要因をひとつ外します。WindowServer は、入力が滑らかになる、発熱が下がる、バッテリーの挙動が良くなる、といった症状とセットで判断すべきです。数値だけ下がって見た目や熱に改善がなければ、有用な修正とは言えません。
内部の仕組み: コンポジタと、スケーリングがコストになる理由
WindowServer はコンポジタです。各アプリは、バッキングストアと呼ばれる各自のオフスクリーンバッファに描画し、WindowServer がそれらを各ディスプレイ用の最終画像に合成しながら、変換や効果を適用します。合成はシーンが変わるたびに走るので、絶え間ない再描画やキャプチャは CPU や GPU を継続的に使います。スケーリングモードによっては、より大きな中間サーフェスを使ってからダウンサンプルしますが、それは要因のひとつにすぎません。ピクセル数、リフレッシュレート、ディスプレイ数、再描画の頻度は、それぞれ独立して試す必要があります。
モニタが役立つところ
Activity Monitor や Mole の Status ビューは、WindowServer、CPU、GPU の傾向を示せますが、どちらもコンポジタのコストを自動で 1 つのアプリに割り当てることはできません。確実な方法は、制御した切り分けです。再描画源をひとつ止めるか、ディスプレイ変数をひとつ変え、アイドル時と負荷時のベースラインを比較します。
繰り返しできる診断
アイドル時と問題発生時の WindowServer を測り、アニメーションコンテンツ、キャプチャツール、ディスプレイ、スケール、リフレッシュレートを一度にひとつずつ切り分けます。メトリクスとユーザーが感じる症状の両方が改善したときだけ、その変更を残します。WindowServer を強制終了したり、普通の Retina スケールを故障扱いしたりしないでください。