長年の疑問だった「Lightmap Bakingで何が原因で重くなるのか」問題、いい加減決着をつける


# はじめに
UnityのLightmapを焼き付ける処理である 「Lightmap Baking」だが、非常に重い。全く終わらないことがしばしばある。今まではなんとなく「これ下げよ」「これ消してみよ」とか適当に済ませて、ベイク時間を短縮していた。
しかし、それでは毎回不必要なことをしている。何が原因かをここではっきりしてみたい。

# 前提条件
OS: Windows10 Pro
CPU:Ryzen 7 5800X 8Core
GPU:GeForce RTX 3080
ストレージ:外付けSSD
Unity: 2020.2.7f1
計測方法:Lightmapping.BakeAsync()を使って開始時間と終了時間の差で計測
条件：
広域マップの屋外に限定する。屋内はベイク面積が狭く、ベイク時間が超絶に肥大化することはないと思われるため。

# 検証
## 検証方法


## 検証１：ベイクされる地面の方の面積が広いと時間がかかるのではないか？
|　Planeの面積を | ベイク時間 | ベイク結果画像|
|:-:|:-:|:-:|
|  1倍 |  0:00:34 |<img width="128" alt="2021-03-24_22h15_08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/e34a5ca0-70fe-f3a2-52aa-518de1681c91.png">|
|  2倍 | 0:00:56  |<img width="128" alt="2021-03-24_22h16_09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/8526b337-3665-ccc3-ec58-b61c6ec9f44e.png">|
|  3倍 | 0:01:22  |<img width="128" alt="2021-03-24_22h17_25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/f5953133-a1c6-da00-bb4e-614e7424a2b8.png">|
### 検証結果
ベイクされる面積が広がると、ベイク時間も比例して長くなる。なお、スケールして面積を大きくしても、メッシュサイズ面積を大きくしても結果は同じだった。つまり実寸の広さが関係する。

というわけで、**ベイクされる方は極力狭くした方が良い**。
## 検証２：ベイクする対象物が多いと時間がかかるか？
平面にCubeを置いて実験

|　Cubeの数 | ベイク時間 | ベイク結果画像|
|:-:|:-:|:-:|
|  1個 |  0:00:09 |<img width="128" alt="2021-03-24_22h25_52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/7ab45062-5134-d44e-e04c-60fc9b952d40.png">|
|  8個 | 0:00:11  |<img width="128" alt="2021-03-24_22h26_10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/fe03b50f-9540-8137-479c-e6343283a104.png">|
|  32個 | 0:00:15  |<img width="128" alt="2021-03-24_22h27_32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/e524bc76-f011-6e54-4423-db94f23dda1e.png">|
### 検証結果
増えてはいるが、比例はしていない。CUBEが単純だからかもしれない。

## 検証３：ベイクする複雑な対象物が多いと時間がかかるか？
平面に木を置いて実験

|　Cubeの数 | ベイク時間 | ベイク結果画像|
|:-:|:-:|:-:|
|  1個 |  0:00:16 |<img width="128" alt="2021-03-24_23h08_15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/3276c3ea-a6f5-5480-79a9-642fe02674b9.png">|
|  8個 |0:00:29  |<img width="128" alt="2021-03-24_23h08_39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/be0ebe46-4049-4d78-a4b0-5c9e0ca20166.png">|
|  32個 | 0:00:34  |<img width="128" alt="2021-03-24_23h08_53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/6078088c-73ee-c310-5305-6e1c967aa6e2.png">|
### 検証結果
やはりCubeより木は複雑な分、時間はかかるようだが、比例はしていない。８個→３２個の間にサチレイト（漸近）している気がする。
おそらく影を落とす面積に関連しているのではないか。つまり２０個あたりで影を落とす面積がいっぱいになっており、それ以上は木が増えても影の面積が変わらないので、ベイク時間が増えないのではないかという予測。

## 検証４：ベイクする対象物の大きさ（落とす影の広さ）でベイク時間が変わるか

木を１０分の１にして、検証してみた。

|　Cubeの数 | ベイク時間 | ベイク結果画像|
|:-:|:-:|:-:|
|  1個 |  0:00:10 |<img width="128" alt="2021-03-24_22h54_14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/494a6230-cc6c-bbc2-e036-46f4390ace1f.png">|
|  8個 | 0:00:13   ||
|  32個 | 0:00:22  |<img width="128" alt="2021-03-24_22h53_55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/f457fb27-c33e-6025-24c5-c06cb334d783.png">|

### 検証結果
こちらは先ほどよりは比例してそう。
以上のことから、**落とす影の面積が多ければベイク時間がかかる** ということが言えそうである。

## 検証５：Lightmap Resolution を減少した場合のベイク時間
![ExQHpzRXMAEYoBz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/e86c98f4-1244-eb8c-8600-e8820487d8df.png)

### 検証結果
見事に比例している。レゾリューションをあげればベイク時間がかかる。
当然のことながら、ベイクされた影は劣化していく（解像度が低くなる）。
これはベイク時間と見た目の綺麗さのトレードオフで調整していくことになる。

## 検証６：GPU Lightmapper はどれぐらい早くなるのか
|　　| ベイク時間 | ベイク結果画像|
|:-:|:-:|:-:|
| CPU <br> (Ryzen 7 5800X 8Core) | 0:03:38 |<img width="128" alt="ExQNR-aXAAkvCru.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/9a143957-7d50-5432-8194-af41c3f21a96.png">|
| GPU <br> (RTX 3080)| 0:00:35  |<img width="128" alt="ExQNSiCXMAUmCXX.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/b3d6bd4a-c19e-95f1-c038-0817cd2a8f2c.png">|


### 検証結果

圧倒的にGPUが早い。ベイク結果もCPUと違いがわからない。
**GPU Lightmapper は極力利用したほうが良い**だろう。


## 検証７：Direct Samplesはベイク時間に関係があるか
ベイク時間もベイク結果もほとんど同じだった。

### 検証結果
Direct Sampleは直接光のサンプリング数なのだが、やった感じそれほど変化がなかった。ベイク時間も変わらないので、デフォルトのまま変更しなくて良いだろう。
ただ、以下の記事によると、

https://unity3d.com/jp/how-to/progressive-lightmapper-optimization-tips

> この値を大きくすることでライトマップの品質を改善できますが、ベイキング時間が長くなってしまいます。

とあるので、条件によってベイク時間が変わるのかもしれない。おそらく屋内の話だと思われる。

## 検証８：Indirect Sampleはベイク時間に関係があるか
|　Indirect<br>Sample | ベイク時間 | ベイク結果画像|
|:-:|:-:|:-:|
|  512 |  00:02:11 |<img width="128" alt="ExQSffMXEAAK1ly.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/7e517b35-ff43-a310-ba8b-7255650eac9e.png">|
|  8 | 00:00:57  |<img width="128" alt="ExQSgCXWUAsBKq3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/a662e989-9bf9-92d3-1859-89763fe30ca8.png">|

### 検証結果

Indirect Sampleを下げるとベイク時間は短くなる。今回の屋外設定においては画像の劣化という現象は確認できなかった。
以上のことから、**最初最低の８にしておいて、ノイズが気になるようなら上げる**、というような戦略が良いと思われる。



## 検証９：Environment Samplesはベイク時間に関係があるか



|　Environment<br>Samples | ベイク時間 | ベイク結果画像|
|:-:|:-:|:-:|
|  128 |  0:01:54 |<img width="128" alt="2021-03-25_00h28_41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/32de6dad-2533-3871-0f44-18f849d41760.png">|
|  64 | 0:01:40   |<img width="128" alt="2021-03-25_00h34_15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/86fbfdd0-2c21-45c0-b836-6137be8090e6.png">|
|  8 | 0:01:34  |<img width="128" alt="2021-03-25_00h47_50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/228b18ff-d1d1-014b-8594-6856d84e16c4.png">|

### 検証結果

ある程度関係があるが、大幅に下げている割に下げ幅はそれほどでもないので、128のままである方が無難な気がする



## 検証１０：Max Lightmap Sizeでベイク時間が変わるか

Max Lightmap Sizeはライトマップが生成される１枚の画像サイズ。大きくなれば、陰影が当然綺麗になる。

|　Max<br>Lightmap<br>Size | ベイク時間 | ベイク結果画像|
|:-:|:-:|:-:|
|  4096 | 0:00:26  |<img width="128" alt="ExQYatFVkAE7D_y.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/67c161b4-04dc-67cc-9343-9f21d514645f.png">|
|  1024 | 0:00:11  |<img width="128" alt="ExQYZ7FVoAI9EW7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/70113f33-0b79-b83d-2ca9-7d2ccc15af73.png">|

### 検証結果

ベイク結果画像を見て分かる通り、解像度が落ちるとにじむ。逆ににじんだほうがよい時もあるので、その時は解像度をわざと落とすということもアリ。

時間に関しては、もろにキレイさとトレードオフになる感じ。
とりあえず最初は、512ぐらいにしておいてベイク時間をが許せば多くしていく、というのでも良い。
「Lightmap Resolution」と同様、**ベイク時間の調整弁として利用**していく。

## 検証１１：Ambient Occulusion設定でベイク時間が変わるか

Ambient Occulusion (以下AO) は、オブジェクトの角とかにできる影のような黒いしみのこと。これで立体感がでるらしい。あとこれは影ではなくホコリという説もあるが、どうなんだろう？
Max Distanceは黒いしみの広がる長さ。0.1ならば10cmしみが広がる
Indirect Contributionは黒いしみの強さ。
Direct Contributionも黒いしみの強さ

|　Cubeの数 | ベイク時間 | ベイク結果画像|
|:-:|:-:|:-:|
|  AOあり<br>Indirect Contribution:1 |  0:00:41 |<img width="128" alt="2021-03-27_10h06_48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/2c1ac0b5-f097-74a6-649a-d372d5d19dc9.png">|
|  AOあり<br>Indirect Contribution:4 | 0:00:41   |<img width="128" alt="2021-03-27_10h07_48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/4393cb77-4c63-fac3-7c14-c3596445db74.png">|
|AOなし|0:00:38|<img width="128" alt="2021-03-27_10h09_00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72960/560606ec-46a6-e7b8-37c5-6716cd58bff0.png">|

### 検証結果
AOはベイク時間に多少影響がある。もう少し複雑な形状を入り込むともっとベイク時間に変わりがあるかもしれない。
とりあえず最初はAOなしでベイクして、立体感が欲しい場合はAOありでもう一回やる、ぐらいで良いのかもしれない。

長くなったので、以降は別の記事にする。

続き記事→[続・長年の疑問だった「Lightmap Bakingで何が原因で重くなるのか」問題、いい加減決着をつける](https://qiita.com/warapuri/items/fb1dc3fa9f63a361d396)