게임엔진에서 Culling은 최적화를 위해 Rendering과정에서 굳이 렌더링하지 않아도 된다고 판단된 오브젝트들을 제외하는 것을 말한다.
Culling과정을 거치면 cpu,gpu의 부담을 덜어줄 수 있기에 퍼포먼스적인 이점을 얻을 수 있다.
언리얼에서는 크게 4가지 방식으로 Culling방식을 제공한다. 어떤 방식이 있는지, 장단점은 어떠한지 알아보자.
Distance Culling은 액터와 플레이어 카메라 사이의 거리에 따라 오브젝트를 Culling시키는 방식이다.
거리가 멀어진 오브젝트는 굳이 랜더링하지 않아도 된다는 아이디어에서 나온 기술이다.
Distance Culling의 작동방식을 알아보기 위해 다음과 같은 실험을 진행했다.
Place Actors-> Cull Distance Volume으로 Distance Culling을 할 Volume을 월드에 배치한다.
Cull Distance Volume안에 3개의 크기가 다른 바위를 생성하고
Cull Distance Volume옵션을 위와 같이 세팅하고 플레이어를 이동시켜봤다.
1.Cull Distance Volume의 Size와 Cull Distance의 의미는 'Size보다 크기가 작은 오브젝트는 Cull Distance이후 부터는 Culling된다'이다. 2.크기 별로 Culling되는 거리를 조절할 수 있어서 거대한 배경같은 오브젝트는 Culling에서 배제할 수 있다.
언리얼엔진은 Cull Distance Volume을 통해 Distance Culling을 지원하고 Size, Cull Distance수치 조절로 크기별로 Culling되는 거리를 달리할 수도 있다.
장점:FPS확보
단점:디테일한 부분을 출력하지 않으므로 게임 퀄리티가 안좋아 보일 수 있다.
++굳이 Cull Distance Volume을 쓰지 않고 Actor->Rendering->LOD->Desired Max Draw Distance값 조절로 각각의 액터에만 Distance Culling을 적용할 수도 있다.
View Frustum Culling을 이야기 하기 전에 먼저 Frustum이라는 개념을 이해할 필요가 있다.
Frustum위키피디아
Frustum은 각뿔,원뿔같은 한점으로 모이는 도형을 평행한 두면으로 잘라놓은 도형이다. 언리얼 엔진에서의 카메라가 바로 이 Frustum의 형태를 이루고 있다.
위 사진에서 보이는 보라색 영역이 바로 'View Frustum'이라고 할 수 있겠다.
그렇다면, View Frustum Culling은 무엇인가?
바로 View Frustum에서 벗어난 영역에 있는 오브젝트들을 Culling하는 것이다.
어차피 화면바깥에 있는 오브젝트들은 렌더링하지 않아도 된다는 아이디어에서 나온 기술이다.
View Frustum Culling의 작동방식을 알아보기 위해 다음과 같은 실험을 진행했다.
위 사진과 같이 돌 3개를 배치해놓은 맵을 만들고
게임 런타임에 첫번째 돌만을 바라본 상태에서 'FreezeRendering'이라는 커맨드를 입력해서 렌더링을 일시정지 시켜보았다.
FreezeRendering을 할때 화면영역 바깥에 있었던 두번째 돌과 세번째 돌이 렌더링 되지 않은 모습을 확인할 수 있다.
언리얼 엔진은 View Frustum Culling을 기본지원한다.
장점:FPS확보
단점:급격한 화면전환을 자주하는 게임의 경우 퍼포먼스 저하가 올수도 있다.
Precomputed Visibility는 오브젝트들의 Culling여부를 빌드타임에 미리 계산해놓는 방식을 말한다. 일정 영역을 여러개의 Cell로 나누어 놓고 각각의 Cell에 카메라가 있을때 어떤 Cell들을 Culling시킬지에 대한 정보를 저장해놓는 방식이다. Dynamic Occlusion Culling을 적용하기 어려운 하드웨어(모바일)에서 많이 사용한다고 한다.주의할 점으로 카메라가 항상 Precomputed Visibility cell안에 있어야 하기에 카메라가 항상 셀안에 있도록 조절이 필요하다(특히 높이).
Precompuited Visibility의 작동방식을 알아보기 위해 다음과 같은 실험을 진행했다.
world setting에서 Precomputed Visibility를 사용하겠다고 세팅을 하고, Precomputed Visibility Cell들을 눈으로 확인하기 위한 세팅을 진행했다.
빌드 전
빌드 후
언리얼 엔진은 Precomputed Visibility기능을 지원한다.
장점:낮은 퍼포먼스의 기기에서도 잘 동작하는 Culling방식
단점:크기가 큰 사각형단위의 Culling이다 보니 Dynamic Occlusion Culling방식에 비해 엉성한 부분이 있을 것으로 예상된다.
Dynamic Occlusion은 게임을 플레이하면서 실시간으로 물체를 가리는 오브젝트(Occluder)와 가려지는 오브젝트(Occludee)를 판단해서 Occludee를 Culling하는 것을 말한다.
GPU를 사용하는 하드웨어 오클루전 쿼리 방식, CPU를 사용하는 소프트웨어 오클루전 쿼리 등의 방식이 존재한다.
추후 작성 예정
추후 작성 예정
언리얼 엔진은 Dynamic Occlusion기능을 지원한다.
장점:안보이는 부분을 실시간으로 계산해내서 자연스럽게 최적화를 진행할 수 있다
단점:실시간 계산과정이 오히려 성능저하를 유발할수도 있다(추측)