'포트나이트'는 처음부터 다양한 플랫폼에서 함께 즐길 수 있는 크로스 멀티플랫폼을 목표로 개발됐다. 당시 개발진에는 한가지 과제가 주어졌는데 100명의 플레이어가 한 자리에서 겨룰 수 있어야 했으며, 필드에서 플레이어는 뭔가를 만들거나 파괴할 수 있어야 했다. 그러면서도 프레임은 안정적이어야 했으니 개발진으로서는 쉽지 않은 과제였다.

사실 프레임을 유지하는 등의 최적화는 어려울 게 없다. 어찌 보면 뻔한 것들이다. 드로우 콜과 트라이앵글 수를 줄이거나, 버텍스 및 픽셀 셰이더의 인스트럭션 비용을 절감해야 했고 메모리를 절약하는 게 대부분이다. 그리고 이건 '포트나이트'도 마찬가지였다.

▲ 에픽게임즈 코리아 최용훈 TA


■ 캐릭터 최적화


우선 '포트나이트'는 캐릭터 최적화부터 시작했다. 머티리얼 섹션을 하나로 합쳤으며, 사용하지 않는 섹션을 제거했다. 그러면서 원래는 좀 더 복잡하게 구현됐던 캐릭터을 머리, 몸, 배낭, 무기로 네 부분으로 나눠서 단순화했다.

여기에 캐릭터의 LOD는 4개, 무기 LOD는 3개로 구성했으며, 얼굴은 본 없이 LOD 포즈를 배이크해 사용했다. 그러면서 모바일 플랫폼에서는 LOD1을 최소 LOD로 썼다. 동시에 LOD 세팅을 정의할 수 있는 새로운 종류의 어셋을 만들었다. LOD1은 패이셜 본을 제거해 사용했고, LOD2는 손가락, 트위스트 본을 제거해 사용했다. 아울러 애니메이션을 만들다보면 여러 동작을 취하는데 디테일하게 만들면 노이즈가 생기는 문제가 발생해 애디티브 노이즈를 추가하는 방식으로 긴 디테일 애니메이션을 최적화했다.

동시에 기존에 마스크(Masked)해 사용하던 파츠들을 선택적으로 랜더링하는 방식으로 최적화를 꾀했다. 하지만 이 방식의 경우 오버드로우가 발생하는 문제가 있었다. 일반적인 게임이라면 넘겼을 수준이었지만, '포트나이트'는 한 화면에서 수많은 유저가 등장할 수도 있어서 오버드로우도 최소활 필요가 있었다. 그래서 버텍스 셰이더에서 버텍스 컬러를 사용해 그릴지 말지 결정하도록 했다.


한편, 캐릭터 화면에서는 스포트라이트를 여러 개 사용해 캐릭터를 멋지게 표현했는데 모바일에서는 퍼포먼스가 저하하는 문제가 있었다. 그래서 모바일에선 포인트 라이트 및 스포트라이트 셰이더를 비 활성화해서 셰이더 퍼뮤테이션을 줄이고, 테크 아티스트가 블루프린트를 통해 플랫폼에 맞게 라이트를 교체할 수 있도록 만들었다.


■ 이펙트 & 머티리얼 & 텍스처 최적화


이펙트를 최적화하기 위해서 '포트나이트'에 명시적 디테일 모드를 추가했다. 기존에 있던 디테일 모드에선 하이 디테일 모드에서도 간혹 저퀄리티의 이미터가 나오곤 했다. 그래서 디테일 모드를 확실히 정해 모바일 등 저사양에서는 반드시 낮은 퀄리티의 이미터만 나오도록 만들었다.

동시에 모바일에선 쓸 수 없기에 FX에서 모프 타겟 메시를 삭제했으며, FX의 중요도(우선권) 설정을 할 수 있도록 구현해 파티클이 많이 터지거나 프레임이 떨어지는 상황이 발생하면 중요도가 낮은 것부터 꺼버릴 수 있도록 해 60프레임을 유지되도록 했다.


머티리얼에서는 액터의 여러 구성 요소를 머티리얼과 하나로 합쳐서 최적화하고 사용하지 않는 정적 스위치들을 머티리얼에서 제거했다. 모바일에선 Fully Rough를 사용해 스페큘러 등의 값을 강제로 0으로 바꿔서 렌더링할 때 부하를 줄이는 방식과 외곽선 포스트 프로세스 머티리얼을 제거해 최적화했다.

텍스처의 경우 스트리밍하지 않으면 렌더링할 때 굉장히 무서워서 하지 않는 것들을 우선적으로 찾아서 처리하도록 했으며, 일부 UI 텍스처는 다른 플랫폼에서 크기를 조정할 수 있도록 mips를 지정했다. 그리고 유사한 텍스처를 하나로 합혀서 공유할 수 있도록 했는데 하나의 리소스로 여러 플랫폼에서 사용하기에 테크 아티스트가 플랫폼에 최적화된 텍스처를 선별할 수 있게 만들었다.


■ 배경 오브젝트 최적화


배경 오브젝트 최적화를 위해서 우선 뷰 디스턴스 스케일 값을 사용해 플랫폼별로 컬링 처리를 하도록 했다. 게임에 영향을 끼치지 않는 작은 오브젝트의 경우 모바일에선 필요가 없기에 처음부터 컬링 처리를 한 거다. 물론 컬 티스턴스 세팅만으론 플랫폼별로 처리가 힘든 데 뷰 디스턴스 스케일 값을 곱해서 플랫폼에 맞게 컬링 처리를 할 수 있었다.

또한, 기존 방식은 설정값 1이 최소 처리 조건이었는데 이 값을 1에서 상향 조정하도록 해 게임을 낮은 품질로 설정한 후 플레이어의 디스턴스 값과 비교해 최적화 작업을 할 수 있도록 했다.

앞서 플레이어보다 작은 오브젝트에 대한 적극적인 컬링 처리를 하도록 했다 했는데 이게 바로 인바이런 먼트 컬링이다. 프로젝트 전반에 걸쳐 컬디스턴스(Culldistances)를 변경해 이 처리를 수월하게 했다. 또한, 액터의 디테일 모드를 사용해 로우, 미디움, 하이 값으로 조정할 수 있는데 모바일에선 장식용 오브젝트는 렌더링하지 않도록 처리했다.


아울러 보통 LOD를 3~4개를 쓰는데 모바일에선 최적화를 위해 극단적으로 낮은 LOD만 사용해 트라이앵글 수를 조절했다. 동시에 가능한 한 많은 메시를 합해 드로우 콜과 메모리에 추가하는 고유한 메시 사이의 균형을 유지하기 위해 노력했다.

한편, 다른 게임과 차별화된 특징으로 '포트나이트'에는 플레이어가 벽이나 건물을 제작할 수 있는데 이런 벽에 대한 커스텀 LOD를 생성해 폴리 카운트를 대폭으로 감소 처리했다. 또한, 고사양에서는 오브젝트를 파괴할 때 버텍스 애니메이션으로 파괴되는 메시를 처리했는데 모바일에선 마스킹 된 균열 머티리얼만 렌더링하는 방식을 통해 최적화를 이뤘다.


■ 드로우 콜 최적화


드로우 콜 최적화는 '포트나이트'의 가장 큰 숙제 중 하나였다. 일반적인 도시 건물은 300~400개의 파괴 가능한 조각으로 구성됐는데 틸티드 타워의 경우 거의 2000개의 드로우 콜을 가질 정도였다. 더군다나 건물들의 경우 은엄폐에 쓰이기도 해서 극단적인 컬링은 크로스 플레이를 불가능하게 해서 그렇게 할 수도 없었다.

보통 이 경우 계층적 LOD를 쓰지만, '포트나이트'에는 이마저도 불가능했고, 결국 HLOD를 만들어 드로우 콜을 1개로 줄이는 걸 목표로 했다. 300~400개의 조각으로 구성된 건물들이지만 원거리에선 디테일하게 표현할 필요가 없었기 때문이다. 이렇게 각 빌딩 조각은 수작업으로 최대한 실루엣이 비슷하게 만들어졌다.


또한, DHLOD를 엔진에 세팅했다. DHLOD 구현을 위해 HLOD레벨 2개를 생성해 레벨0은 '심플리피 메시' 옵션을 꺼서 드로우 콜을 유지했으며, 레벨1은 '심플리피 메시' 옵션을 켜서 메시를 합쳐 드로우 콜이 1개가 되도록 했다. 또한, '머지 세팅'에서 '머지 머티리얼'을 활성화하고, 파괴를 지원하는 머티리얼을 적용했다.

이렇게 함으로써 가까이 있는 건물에는 오리지널 메시를 쓰고 원거리의 건물은 드로우 콜 하나로만 처리하도록 해 디테일을 유지한채로 최적화할 수 있었다.


■ 랜드스케이프 최적화


랜드스케이프 최적화는 컴포넌트 크기를 줄이는 방식으로 진행했다. LOD 분포 설정 기능을 이용하면 랜드스케이프 LOD의 세부 분포를 조절할 수 있어 카메라에 보이는 부분과 그렇지 않은 부분을 다르게 설정, 최적화할 수 있다. 여기에 커스터마이즈드 UV를 이용해 모바일에서 과부하가 큰 픽셀 셰이더로 처리한 부분을 버텍스 셰이더로 대신 처리하도록 했다.

'포트나이트'는 모바일 버전이 따로 존재하지 않고 PC와 콘솔, 모바일이 모두 같은 레벨을 사용하고 있다. 다만 맵 2.0의 새로운 바이오메스로 인해 8개까지 확대된 레이어를 모두 구현할 수 없었다. 4.19 버전에서는 모바일 터레인 레이어가 최대 3개, 렌더러 업데이트로 최대 4개까지만 레이어를 구현할 수 있기 때문이다.


그래서 커스텀 매크로 데이터와 함께 모든 바이오메스 레이어를 하나의 텍스처로 만들기 위한 블루프린트 툴을 만들었다. 이를 통해 가장 낮은 밉 레벨에서 색을 추출해 매크로 텍스처로 만들어 진행했다. 그리고 모바일의 로우 퀄리티에서는 팬시 블렌딩(Fancy Blending)이나 엑스트라 클리프 텍스처(Extra Cliff Textures) 등을 비활성화하는 식으로 더욱 최적화했다.

여기에 퀄리티 스위치와 피처 레벨 스위치 두 스위치를 통해 PC나 콘솔 등 고사양 기기에서는 고사양 셰이더를, 모바일에서는 저사양 셰이더를 자동으로 변경하도록 만들었다.




■ 폴리지 최적화


'포트나이트'에는 폴리지가 굉장히 많다. 폴리지 페인트 툴, 프로시저럴 폴리지, 랜드스케이프 그래스 툴 3개의 폴리지 제작 툴이 있다. '포트나이트'는 이중 랜드스케이프 그래스 툴로 폴리지를 만들었다.

이렇게 만든 폴리지 최적화를 위해 컬 디스턴스로 멀리 있는 건 렌더링하지 않고 밀도 스케일을 조절해 모바일은 덜 생성하도록 만들었으며, 버텍스 셰이더의 회전 값을 제거했을 뿐 아니라 모바일에선 버텍스 셰이더를 거의 쓰지 않도록 했다. 여기에 폴리지가 겹치는 부분의 경우 컷아웃을 통해 컬링하도록 했다.


■ 임포스터 베이커


'포트나이트'에서는 다방면에서 볼 수 있는 나무가 너무 많아 렌더링 퍼포먼스에 부담이 됐다. 이를 해결하기 위해 옥타헤드럴(정팔면체) 임포스터를 활용했다. 임포스터 베이커란 간단히 말해 오픈 필드에서 자연물 렌더링 처리를 줄이기 위해 에픽게임즈에서 만든 언리얼 엔진4 플러그인으로, 쉽게 말해 좀 더 진화한 빌보드랄 수 있다. 가장 큰 특징으로는 카메라에 맞춰 메시만 회전하는 빌보드와 달리 메시와 텍스처가 함께 회전한다.

이를 위해 다양한 각도에서 대상을 캡처해 각 뷰를 아틀라스 텍스처로 저장하고 정팔면체와 반팔면체 형태로 매핑 처리한다. 그 결과 '포트나이트'에서는 200만 개의 폴리 카운트가 임포스터 베이커 이후 36만 개로 줄어들었다. 그렇지만 여전히 드로우 콜이 많은 상황. 에픽게임즈는 HLOD 기능을 통해 이 문제를 해결했다.

최종적으로는 HLOD 기능을 사용한 결과 38만 개의 지오메트리를 12,906개까지 줄일 수 있었다. 동시에 1,225개의 드로우 콜을 5개로까지 줄였다.


이러한 결과를 보고 임포스터로 HLOD를 만들면 어떨까 생각했고 이를 적용한 결과 드로우 콜은 여전히 5개지만 12,906개의 지오메트리를 6,000개로 줄일 수 있었다. 이뿐만이 아니라 퀄리티는 기존의 HLOD 기능만 사용했을 때보다 더 좋았다.



■ 최적화 팁


에디터 내부에는 프리뷰 렌더링 레벨에서 ES2 또는 iOS, 메탈 프리뷰 렌더링을 지원한다. 이를 통해 디바이스와 최대한 유사한 환경에서 바로 확인할 수 있고 지원하지 않는 기능 또는 셰이더 등을 테스트할 수 있다.