メインコンテンツへスキップ
  1. 記事/

LandscapeのSubSectionについて

UnrealEngine UE4.26 Landscape

普段はあまり使わない、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 #

1x1SubsectionsのDrawcall

2x2Subsections #

2x2SubsectionsのDrawcall

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/

Related

UnrealEngineからBlenderへSkeletalMeshをExportするときの注意点(検証中)
UnrealEngine Blender UE4.26 Blender2.9 ExportFBX Rigs
[UE4] NavLinkProxyを使って、分かれたNavMeshの間を移動する
UnrealEngine UE4.26 NavMesh AI
[UE4] MovieRenderQueueで連番画像を書き出すときのウォームアップ設定
UnrealEngine UE4.26 MovieRenderQueue