LoginSignup
45
40

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-03-27

はじめに

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

前提条件

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

検証

検証方法

検証1:ベイクされる地面の方の面積が広いと時間がかかるのではないか?

 Planeの面積を ベイク時間 ベイク結果画像
1倍 0:00:34 2021-03-24_22h15_08.png
2倍 0:00:56 2021-03-24_22h16_09.png
3倍 0:01:22 2021-03-24_22h17_25.png

検証結果

ベイクされる面積が広がると、ベイク時間も比例して長くなる。なお、スケールして面積を大きくしても、メッシュサイズ面積を大きくしても結果は同じだった。つまり実寸の広さが関係する。

というわけで、ベイクされる方は極力狭くした方が良い

検証2:ベイクする対象物が多いと時間がかかるか?

平面にCubeを置いて実験

 Cubeの数 ベイク時間 ベイク結果画像
1個 0:00:09 2021-03-24_22h25_52.png
8個 0:00:11 2021-03-24_22h26_10.png
32個 0:00:15 2021-03-24_22h27_32.png

検証結果

増えてはいるが、比例はしていない。CUBEが単純だからかもしれない。

検証3:ベイクする複雑な対象物が多いと時間がかかるか?

平面に木を置いて実験

 Cubeの数 ベイク時間 ベイク結果画像
1個 0:00:16 2021-03-24_23h08_15.png
8個 0:00:29 2021-03-24_23h08_39.png
32個 0:00:34 2021-03-24_23h08_53.png

検証結果

やはりCubeより木は複雑な分、時間はかかるようだが、比例はしていない。8個→32個の間にサチレイト(漸近)している気がする。
おそらく影を落とす面積に関連しているのではないか。つまり20個あたりで影を落とす面積がいっぱいになっており、それ以上は木が増えても影の面積が変わらないので、ベイク時間が増えないのではないかという予測。

検証4:ベイクする対象物の大きさ(落とす影の広さ)でベイク時間が変わるか

木を10分の1にして、検証してみた。

 Cubeの数 ベイク時間 ベイク結果画像
1個 0:00:10 2021-03-24_22h54_14.png
8個 0:00:13
32個 0:00:22 2021-03-24_22h53_55.png

検証結果

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

検証5:Lightmap Resolution を減少した場合のベイク時間

ExQHpzRXMAEYoBz.png

検証結果

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

検証6:GPU Lightmapper はどれぐらい早くなるのか

   ベイク時間 ベイク結果画像
CPU
(Ryzen 7 5800X 8Core)
0:03:38 ExQNR-aXAAkvCru.png
GPU
(RTX 3080)
0:00:35 ExQNSiCXMAUmCXX.png

検証結果

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

検証7:Direct Samplesはベイク時間に関係があるか

ベイク時間もベイク結果もほとんど同じだった。

検証結果

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

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

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

検証8:Indirect Sampleはベイク時間に関係があるか

 Indirect
Sample
ベイク時間 ベイク結果画像
512 00:02:11 ExQSffMXEAAK1ly.png
8 00:00:57 ExQSgCXWUAsBKq3.png

検証結果

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

検証9:Environment Samplesはベイク時間に関係があるか

 Environment
Samples
ベイク時間 ベイク結果画像
128 0:01:54 2021-03-25_00h28_41.png
64 0:01:40 2021-03-25_00h34_15.png
8 0:01:34 2021-03-25_00h47_50.png

検証結果

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

検証10:Max Lightmap Sizeでベイク時間が変わるか

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

 Max
Lightmap
Size
ベイク時間 ベイク結果画像
4096 0:00:26 ExQYatFVkAE7D_y.png
1024 0:00:11 ExQYZ7FVoAI9EW7.png

検証結果

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

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

検証11:Ambient Occulusion設定でベイク時間が変わるか

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

 Cubeの数 ベイク時間 ベイク結果画像
AOあり
Indirect Contribution:1
0:00:41 2021-03-27_10h06_48.png
AOあり
Indirect Contribution:4
0:00:41 2021-03-27_10h07_48.png
AOなし 0:00:38 2021-03-27_10h09_00.png

検証結果

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

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

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

45
40
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
40