普段はあまり使わない、Landscape の Subsection についての考察です
内容自体は公式ドキュメントに書いているのですが、わりと具体的な効果や使い方が分かりづらいですよね
そんな Landscape の Subsection について調べてみました
まず結論 #
通常は 1x1Subsections
で OK です
ただし、マップが広く、かつ大きく開けている場合、2x2Subsections
にするほうが負荷が軽くなる可能性があります
1x1Subsection
- ○ Culling や LOD の効率、バランスが良い
- ✕ Landscape が広くなればなるほど Component 数が爆発的に増加し、BasePass や DrawCall が増加する
2x2Subsection
- ○ 同じ解像度でもコンポーネント数が少なくなるため、BasePass や DrawCall の削減が見込める
- ✕ コンポーネントが大きくなるため、Culling が効きにくくなる
Component と Section の関係 #
Landscape は、複数の Component が寄り集まって構成されています
この Component が、レンダリングや Collision などにおける 1 単位として扱われます
Heightmap もこの単位で管理されるようです
通常、この Component には 1 つの Section を設定します
デフォルトで言う 1x1Subsections
です
この Section が、Landscape の LOD 計算の基本単位になります
2x2Subsections
は、1 つの Component を 4 つの Subsection に分割する設定です
つまり、同じ Component サイズならより細かい Section で、同じ Section サイズならより少ない Component 数で Landscape を扱うことができるようになります
画像は、同じ Landscape サイズ(Vert、Resolution)での比較です
TotalComponentSize
が大きく減っていることがわかります
Drawcall の変化 #
Component 数が Drawcall にどのような影響を与えるのかを見てみます
1x1Subsections #
2x2Subsections #
1x1
よりも 2x2
のほうが DrawCall が少ないことがわかります
Component の単位でレンダリングが行われるため、Component 数が少なければ DrawCall が減る、というわけです
この比較では BasePass に現れるほどの影響はありませんでしたが、Landscape が大きく、複雑になると、BasePass やその他も含めてかなり大きな削減になります
注意点 #
2x2Subsections
の方が Component 数が減るなら全部そうすればいい、と考えたくなりますがそうはいきません
2x2
の場合、同じサイズの 1x1
の Landscape に比べて、FrustumCulling や OcclusionCulling が効きづらくなります
崖や壁、建物などを StaticMesh で配置した場合、その Mesh に完全に隠れてしまうような Component は描画されません
しかし、 2x2
の場合、Component サイズそのものが大きくなるため、StaticMesh で隠れず、Culling されない…つまり、逆に DrawCall が増えてしまう可能性が出てきます
また、完全に画面外に出た Component は描画されないのですが、Component サイズが大きいと、端が画面内に引っかかっただけでも Component 全体が描画されてしまい、余計な描画負荷がかかる場合があります
大きく開けた Map であれば、Culling による差が少ないため、 2x2
の恩恵を大きく受けることができるようになります
関連資料 #
https://docs.unrealengine.com/4.26/ja/BuildingWorlds/Landscape/TechnicalGuide/