Macで快適にeGPUと外部ディスプレイを使うための方法について

MacのeGPU対応について色々と試行錯誤した結果、現状最も最適なソリューションと思われる環境を実現できたので共有します。
※ 特に Mac mini 2018 についてはかなり酷い状態でした。

## 0. Mac の FileVault を OFF にする
**FileVault がONになっていると、外部デバイスの認識をせずにログイン画面まで行ってしまう**ため、 Mac に標準で付いている HDMI ポートを利用してまずログインを行う必要性があります。つまり、ログインしてから eGPU の電源を ON にするという面倒な事をしないといけなくなります。
HFS+ の時は暗号化のソリューションとして FileVault を ON にするのがデファクトでしたが、 [Ask The Expert: APFS Encryption](https://www.blackbagtech.com/blog/2018/04/02/ask-expert-apfs-encryption/) にあるように、 APFS はそれだけでも十分なセキュリティレベルを担保してくれるため、 FileVault までかける必要性はほとんどありません。従って、ディスクの APFS 化と FileVault を OFF にする作業を事前に行っておきます。
※ 最近の Mac は全て SSD がデフォルトなので、 HFS+ よりも APFS の方が効率が良い、というのもあります。

## 1. パフォーマンス優先にする
据え置き型の Mac mini で消費電力を気にしてアプリの挙動がもっさりするのは嫌なので、まずはパフォーマンスを優先させます。
refs: [OS X 10.9 Mavericksからの新機能「App Nap」をシステム全体で無効にするdefaultsコマンド](https://applech2.com/archives/38771283.html)

以下コマンドを入力して再起動すれば、App Nap (Power Nap) をアプリ毎に設定しなくても、システム全体で App Nap が無効になります。

```
$ defaults write NSGlobalDomain NSAppSleepDisabled -bool YES
```

MacBook を使っている場合はバッテリーの減りが早くなるため、この操作はしない方が良いです。必要なアプリだけ個別に設定してください。

## 2. ディスプレイの並び替えを行う
eGPU に接続すると、ディスプレイが理論上2倍に増えるため、例えばデュアルディスプレイの場合は以下のように配置をしなおします。
上部2枚のディスプレイは、 Mac 本体の GPU を使っているもの。下部2枚のディスプレイは eGPU 経由で出力しているものです。それぞれ出力先は同じディスプレイにして、ディスプレイ側の別の HDMI （またはDisplayPort） 入力端子に接続します。
白いバーの部分がメインディスプレイとして登録されるため、 eGPU を利用しているディスプレイに白いバーを移動しておきます。
<img width="780" alt="ScreenShot 2019-02-06 18-58-09.png" src="https://qiita-image-store.s3.amazonaws.com/0/361127/b4591f93-7422-2c86-492a-ee56f19de7e3.png">
デュアルディスプレイの場合、ディスプレイの名称を変更できる機能が欲しいところですが、それはできないようなので、一旦諦めておきます。**知っている方がいれば教えてください。**

なお、裏技として[2入力1出力対応の HDMI 切替器](https://www.amazon.co.jp/dp/B07BDF6DBV/ref=cm_sw_em_r_mt_dp_U_JhGzCb6V97TQX)を購入して Mac 標準の HDMI ポートに繋ぎ、普段は Mac からの入力をナシにしておいて、 eGPU を使わない時だけスイッチで切り替えをすると、非常に楽に電力消費を抑えつつ eGPU と Mac の HDMI ポート両方の恩恵を受けることができます。
検証してませんが、Mac mini は CPU 上に GPU 領域があるため、この方が処理速度も上がるのではないかと思っていたりします。

## 3. アプリ毎のウィンドウの位置を記憶するアプリを使って eGPU ON/OFF 時の差異をできるだけ減らす
アプリ毎のウィンドウの位置を記憶するアプリについては ![Bad Request]()
Mac App Store で販売されている [‎Stay](https://itunes.apple.com/jp/app/stay/id435410196?mt=12) などを買うといいです。

`Stay` は、ディスプレイ接続環境が変わった際に自動でウィンドウを再配置してくれます。
各アプリのウィンドウのデフォルト位置を決めたら、タスクバーのアイコンをクリックして `Store Windows for All Applications` を選択すると、ウィンドウの場所を一気に保存してくれます。
<img width="308" alt="ScreenShot_2019-02-06_19-04-39.png" src="https://qiita-image-store.s3.amazonaws.com/0/361127/1147c55b-8043-4511-754e-97a137408f65.png">
この操作は eGPU 利用時と Mac の GPU 利用時の両方で設定しておくと良いです。
eGPU は便利ですが、電力を喰うので、ドキュメント作成などの作業時には不要になるかと思います。そのため、両方のパターンで記憶させておくと、 `Stay` が状況に合わせて自動的にウィンドウの配置を直してくれます。

## 4. ディスプレイ解像度を細かく調整する
Mac App Storeで [‎Display Menu](https://itunes.apple.com/jp/app/display-menu/id549083868?mt=12) というアプリがあり、かなり細かくディスプレイの解像度を設定できます。これを使って、以下のような形で設定を行い、 Mac 側の GPU を使いたくない時は余計な負荷を下げるために解像度を落とせる範囲で落としておきます。
`Alt+Click` で解像度を記憶できるので、以下のように調整しています。
<img width="401" alt="ScreenShot_2019-02-06_19-14-41.png" src="https://qiita-image-store.s3.amazonaws.com/0/361127/ee3b3534-13f0-fc21-9217-9c0090b18a69.png">
自分の場合は、ディスプレイを1つだけ使いたい時もあるため、設定は以下のように1枚、2枚、4枚という風に分けて個別保存しています。
<img width="714" alt="ScreenShot_2019-02-06_20-22-16.png" src="https://qiita-image-store.s3.amazonaws.com/0/361127/8590a7d8-6fec-1654-d33d-7412435044d6.png">

解像度ごとに違う設定ができるため、非常に便利です。

## 5. ここまでの操作を `システム情報` で確認する
画面左上のアップルマークから `このMacについて` をクリックし、表示された画面にある `システムレポート…` をクリックします。 `ハードウェア` 内に `グラフィクス/ディスプレイ` という項目があるので、そこをクリックします。
以下のように、それぞれのビデオカード毎に正しく解像度が設定できていれば、ここまでの設定は完了です。
<img width="876" alt="ScreenShot_2019-02-06_19-29-09.png" src="https://qiita-image-store.s3.amazonaws.com/0/361127/119aae53-476d-b1b2-9eb2-a01d6d703304.png">
<img width="876" alt="ScreenShot_2019-02-06_19-29-21.png" src="https://qiita-image-store.s3.amazonaws.com/0/361127/f8681b88-9adf-27d1-34fc-2c5a82c3bcd8.png">

解像度の変更により、ディスプレイの配置がおかしくなっているので、以下のように設定しなおします。
<img width="780" alt="ScreenShot 2019-02-06 19-31-15.png" src="https://qiita-image-store.s3.amazonaws.com/0/361127/9dac9c6f-9346-c3e0-b4ca-423a3c3e9de6.png">
上記のようにしておくと、マウスカーソルが変な場所に行くことを限りなく回避できるようになります。

## 6. すべてのアプリで「外部GPUを優先」をオンにする
refs: [Mac で Blackmagic eGPU を使う - Apple サポート](https://support.apple.com/ja-jp/HT208897)

`/Applications` 以下をひたすら手作業で修正します。すべてのアプリを選択した状態で `Cmd+I` を押して、ここから作業を始めるのが楽です。
Adobeとかのアプリのように、ディレクトリになっているものはフォルダの中身を個別に設定する必要があるので注意してください。
以下のような感じでチェックを入れていくだけです。
<img width="259" alt="ScreenShot_2019-02-06_18-37-50.png" src="https://qiita-image-store.s3.amazonaws.com/0/361127/422db33f-3468-3ead-d346-931576e7da12.png">
以上で eGPU を使って可能な限り Mac のパフォーマンスを上げる設定は完了です。お疲れ様でした。

## ※ 注意事項
**Mac 本体側の GPU から eGPU への切り替えはそのままできますが、 eGPU から本体の GPU に切り替えをする際は一旦ログアウトされます。** 大事なデータが消えないように eGPU を取り外す際には充分に気をつけて行ってください。
特にコンパイルだったり、ゲーム、イラスト作成、画像加工中などは即死だと思います。