게임 개발에서 최적화는 성능과 플레이어 경험을 동시에 잡는 중요한 과정입니다. Unity 3D에서는 LOD와 Occlusion Culling 같은 기술을 통해 퍼포먼스를 극대화할 수 있습니다. 이번 글에서는 이러한 최적화 기법들을 자세히 알아보겠습니다.
- LOD 사용
- Occlusion Culling 사용

- LOD(Level of Detail)는 카메라와의 거리 또는 성능 요구사항에 따라 오브젝트의 디테일 수준을 변경하여 성능을 최적화하는 기술입니다.
- None : LOD 전환 시 즉시 변경.
- CrossFade : 점진적으로 디테일이 변화되며 부드러운 전환을 제공합니다.
- Animate Cross-Fading : LOD 간 전환을 애니메이션처럼 처리하여 더 자연스러운 시각 효과를 제공합니다.
- LOD 0 : 가장 높은 디테일 수준
- LOD 1,2 : 점점 낮은 디테일 수준
- Culled : 카메라에서 너무 멀어 렌더링이 완전히 제거되는 상태

- LOD를 하려고 하는 오브젝트의 AddComponet -> LOD Group을 추가해줍니다.
- LOD 0,1,Culled는 기본으로 포함되어 있습니다.

- 저 같은 경우에는 이미 존재합니다.. 에셋을 구매한지라

- 자신이 원하는 설정으로 정해주시면 됩니다.
- 위에 각 부분에 대한 설명이 있으니 보면서 하시면 될 것 같습니다.

- 카메라의 거리에 따라 Set Pass Calls의 숫자의 변동이 일어나는 것을 알 수 있고
모양 역시 바뀌는 부분을 알 수 있습니다. Culled의 조건을 만족하게 되면 Object를 렌더링 하지 않는 모습을 알 수 있습니다.

- Occlusion Culling은 카메라에 보이지 않는 오브젝트를 렌더링하지 않도록 처리하여 성능을 최적화하는 기술입니다. 특히, 복잡한 씬이나 오브젝트가 많은 환경에서 GPU와 CPU의 부하를 줄이는 데 매우 효과적입니다.
- 카메라가 특정 오브젝트를 볼 수 있는지 여부를 판단합니다
- Occluder : 다른 오브젝트를 가리는 역할을 하는 오브젝트
- Occludee : 카메라에 보이지 않으면 렌더링하지 않음
- 가려진 오브젝트는 GPU에서 렌더링되지 않고, 게임의 최종 프레임에서 제외됩니다
- Unity의 Occlusion Culling은 씬 내에서 정적 오브젝트를 기준으로 카메라 위치에 따라 실시간으로 판단합니다

- Occlusion Culling을 적용할 오브젝트를 선택한 뒤 Inspector 창 -> Static 체크박스에서 Occluder Static과 Occludee Static을 활성화합니다
- Occluder Static: 다른 오브젝트를 가릴 수 있는 오브젝트
- Occludee Static: 가려질 수 있는 오브젝트

- Window > Rendering > Occlusion Culling을 선택합니다

- Smallest Occluder: 가림막으로 처리할 수 있는 최소 크기
- Smallest Hole: 가림막 사이의 작은 구멍 크기
- Backface Threshold: 오브젝트의 가려진 면을 판단하는 기준
- 자신의 프로젝트에 맞게끔 입력한 뒤 Bake 버튼을 눌러줍시다.

- Bake 시 이런식으로 Scene에 보이며 격자 하나하나가 Occlusion Cell로, 카메라에서의 가시성을 판단하는 기본 단위입니다

- 카메라의 보이는 부분만 렌더링 됩니다.

- 그리고 문제가 발생하였는데 카메라가 멀리있는 경우에는 렌더링이 모두 다 되는 문제가 발생했습니다.
해당 문제의 발생 원인은 파란 격자의 영역이 오브젝트 근처에만 존재하여 발생한 문제입니다.


- 이 문제를 해결하기 위해 Occlusion Area를 만든 뒤 벽과 바위를 포함하도록 설정했습니다.

- 수정한 뒤 테스트해보니 이제 멀리 있어도 정상적으로 잘 작동합니다.
- 실제 프로젝트에서 사용할때에는 Occlusion Area 내 맵의 크기에 맞게 설정해줘야 할 것 같습니다.



LOD와 Occlusion Culling을 적용하면서 가장 크게 느낀 점은 성능 최적화가 게임 개발에서 얼마나 중요한 요소인지 다시 한번 깨달았습니다.
초기 설정 부분에서 생각보다 까다로웠고 세세하게는 못한 것 같습니다.
아직 테스트의 필요성을 느꼈으며 맵이 크면 클수록 관리가 어려울 것 같습니다..
지금은 Occlusion Area의 사이즈를 크게하여 조절하였는데 찾아보니
구역별로 나누어서 사용하는 방법도 있어서 그 부분도 한번 구현해보며 비교 테스트를 해봐야 할 것 같습니다.