Ubuntu 20.04 LTSにおけるGNOME Shellのパフォーマンス改善

これはUbuntuのデスクトップチームのDaniel Van Vugtが投稿した「[GNOME Shell Performance Improvements in Ubuntu 20.04](https://discourse.ubuntu.com/t/gnome-shell-performance-improvements-in-ubuntu-20-04/15972/1)」を[許可をもらって](https://discourse.ubuntu.com/t/gnome-shell-performance-improvements-in-ubuntu-20-04/15972/10)日本語に翻訳したものです。

記事にもあるように18.04からは大きく改善しています。[19.04](https://qiita.com/m-shibata/items/727e20f295602bba8213)と[19.10](https://qiita.com/m-shibata/items/e3677caf1eeac836d9ed)の同様の記事と合わせて読むと、さらに良いかもしれません。


# Ubuntu 20.04 LTSにおけるGNOME Shellのパフォーマンス改善

Ubuntu 20.04 LTSのリリースでは、GNOME Shell 3.36とともにさまざまな領域でのパフォーマンスの改善が行われています。この記事では、Canonicalが貢献した改善点を紹介しましょう。

Ubuntuユーザーの多くは、LTSリリースのみを利用しており、18.04からアップグレードすることになるでしょう。その場合、[19.04](https://discourse.ubuntu.com/t/gnome-3-32-performance-ubuntu-19-04/10208)や[とくに19.10](https://discourse.ubuntu.com/t/boosting-the-real-time-performance-of-gnome-shell-3-34-in-ubuntu-19-10/13095)で行われたパフォーマンスの改善によって大きく変わっていることに気づくはずです。まずはそちらの記事を読んだほうが良いでしょう。

## 20.04で新しいポイント

### [すべてのアニメーションが少しスムーズになり、一部は遅延が小さくなりました](https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/724)

アニメーションとは単に何かが時間的・空間的に動くというものです。しかしながら、フレームがスキップされない（つまり時間的に滑らかな）アニメーションであっても、見た目はそれほど滑らかではありませんでした。これはアニメーションが画面上の不規則な位置を利用しているときに発生します。そこでスクリーンが光子を放出する厳密な間隔に、その位置を同期させるようにしました。これにより見た目の滑らかさもわずかながら改善しています。

光子が放出されるタイミングを細かく把握できるようになったので、画面のコンテンツを（実際には画面のコンテンツとは別扱いになっている）マウスポインターとより同期させられるようになりました。このため、Ubuntu 20.04 LTSでウィンドウを移動すると、マウスポインターの追随性が改善していることに気がつくでしょう。

### [ディスプレイのスケーリングが数メガバイトのメモリを消費していました](https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1004)

元の壁紙画像に存在するよりも多くの詳細を保存しようとしていました。今は解消されているものの、同様の問題がコードのどこかに残っている可能性があります。これは100%以上のディスプレイスケーリングがパフォーマンスに与える影響を調べるための、継続的な取り組みの開始を意味します。

### [マウスの移動はもはやJavaScriptを必要としません](https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/925)

客観的にはJavaScriptの実行は遅くはないものの、JavaScriptを実行しないよりは数倍遅くなります。これを避けることができるところでは、そうしています。よってマウス（やタッチパッド）をよく動かしているときのCPU使用率やバッテリーの消費量はわずかばかり下がることになるでしょう。

### [アイコングリッドのオープンやクローズの反応がわずかながら速くなりました](https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1002)

GNOME Shellは複雑なシステムですが、JavaScriptを利用して可能な限りシンプルに保たれています。しかしながら、ときどきある変化が予想もしない副作用を引き起こすことがあります。少しおもしろいのは、JavaScriptは複数のフレームに渡って実行されることがあり、ある関数がどれくらいのフレームを消費するかすぐにはわからないということです。1フレーム以下を期待していたとしても、ときどきそうではないことがあります。

### [ウィンドウのスライドアニメーションはより効率的で滑らかになりました](https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/936)

GNOME ShellはClutterツールキットを用いたMutter上で構築されています。Clutterツールキットは別のプロジェクトでしたが、現在はMutterの中でメンテナンスされています。

Clutterのもっともパフォーマンスに影響する部分のひとつが、「再レイアウト」によってGUIエレメントが「再割り当てされる」タイミングです。これはすべてのGUIエレメントのサイズと位置を把握する作業です。一度把握できれば、より効率的に個々のエレメントを再描画できます。問題は、GNOME Shellがこの処理に参加するとき、割り当ての関数はすべてJavaScriptで書かれるということです。これは（Clutter/Mutterのような）Cで書かれた関数よりは遅くなります。そしてGNOME Shell GUI自身がJavaScriptで書かれている以上、割り当て関数もそうでなくてはならないため、簡単には変更できないのです。

変更可能なのは割り当ての頻度です。そしてそれは一部のアニメーションを `x` / `y` プロパティから `translation-x` と `translation-y` プロパティに変更することになります。後者については再割り当てが発生しない、つまり少なくともアニメーションの間においては、JavaScrpitを実行する必要はないということになります。より効率的にCPUを使用することになり、より滑らかな見た目になります。これはSuperキー（Windowsキー）をタップすることで確認できます。

### [アイコンのspring/swarmアニメーションはより効率的で滑らかになりました](https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/926)

Ubuntu 19.10よりもさらに改善されました。これには一つ前と同じアプローチが使われています。

### [再レイアウトはより効率的になりました](https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/575)

祖先の要素が再レイアウトに参加しないとき、再レイアウトしないようにしました。ただし、これだけでパフォーマンスが劇的に改善するわけではありません。将来的な新しいAPIの導入によって、多くのパフォーマンス問題の解決が簡単になるでしょう。


### [画面上の複数に別れたものを変更する際のパフォーマンスが改善されます（改善されることがあります）](https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/969)

3.36において上流のMutterに、画面上の複数の部分を描画する際に、ひとつにまとめてから描画するのではなく、個別に描画できる新機能が導入されました。問題は数が増えてきたときに3.34よりパフォーマンスが実際に悪化することでした。そこで、3.34と比較できる程度の修正を導入しました。

### [GJSは大幅にパフォーマンスが向上しています](https://gitlab.gnome.org/GNOME/gjs/issues/302)

GJSはGNOME Shellと（Mozillaの）JavaScriptエンジンの仲立ちをするソフトウェアです。これに対してあるアニメーションの実行中同じコードを繰り返し実行してしまう[不具合](https://gitlab.gnome.org/GNOME/gjs/issues/302)が見つかりました。これはGNOME 3.36で修正されています。

Canonicalがこの問題を見つけ、最初の修正を行ったのですが、[最終的な修正](https://gitlab.gnome.org/GNOME/gjs/-/merge_requests/394)は[Philip Chimento](https://gitlab.gnome.org/ptomato)によって行われました。ありがとうございます！

## 「けれどもまだパフォーマンスの問題があります」

いくつかの問題はまだ未修正であることを把握しています。GNOME Shellのパフォーマンスは将来的なリリースでさらに改善されることでしょう。しかしながら、あなたが遭遇したのと同じ問題をすでに誰かが遭遇していると仮定しないでください。もし十分な速度がでていない問題を見つけたら、ぜひ次のコマンドで私たちに知らせてください：

```
ubuntu-bug gnome-shell
```

今後のリリースであなたが満足することを楽しみにしています。