[IGC2018] PC-콘솔-모바일을 넘나드는 '포트나이트' 최적화

게임뉴스 | 이두현 기자 | 댓글: 16개 |



[인벤게임컨퍼런스(IGC) 발표자 소개] 신광섭 리드 개발자는 에픽게임즈 코리아에서 릴레이션 리드 및 프로그래머로 재직 중이다. 이전에는 언리얼 엔진 2, 3을 이용한 ‘마그나카르타’ PS2/PSP와 XBox 360 버전 개발에 참여했다. 그는 IGC에서 다양한 디바이스에 맞춘 '포트나이트' 최적화를 소개한다.

에픽게임즈는 두 가지 모습을 지닌 회사다. 현재는 '포트나이트'를 만든 게임 개발사로 유명하지만, 이전까지는 게임 엔진 '언리얼 엔진'의 개발사로 더 알려졌었다. 에픽게임즈는 자신들이 만든 엔진의 자부심을 보이기 위해 게임을 직접 만든다. '이만큼 멋진 게임'을 언리얼 엔진으로 만듦을 보여주고, 게임을 만드는 과정에서 발견한 문제를 고쳐 곧바로 자신들의 엔진에 적용한다.

IGC 2018의 강연자로 나선 에픽게임즈 코리아 신광섭 차장은 디벨로퍼 릴레이션스 리더로서 엔진의 다양한 기능을 소개한다. 그는 최적화의 끝을 보여주는 '포트나이트'의 멀티 플랫폼 적용과 크로스 플레이를 지원하는 과정의 노하우를 상세하게 설명했다.


■ 강연주제: 언리얼 엔진4, '포트나이트' 멀티 플랫폼 크로스 플레이




에픽게임즈가 '포트나이트'에 가진 목표는 뚜렷하다. PC(윈도우), Mac, PS4, Xbox One, iOS, 안드로이드, 닌텐도 스위치 등 모든 플랫폼의 유저가 같이 크로스 플레이를 하도록 지원하는 것이다. 에픽게임즈는 같은 콘텐츠를 모든 하드웨어가 지원하도록 하며, 업데이트 역시 동시에 지원되도록 하고자 했다.

말조차 쉽지 않아 보이는 목표다. 단순히 포팅으로 PC 게임을 모바일 버전에 맞추는 건 어떻게든 된다. 그러나 에픽게임즈는 맵과 콘텐츠를 바꾸지 않고서 모바일까지도 지원하도록 했다. 모바일은 안드로이드와 iOS로 나뉘며, 안드로이드는 수백여 종의 기기로 구분된다. 특히 코스튬까지도 신경 써야 하니 굉장히 높은 수준의 프로파일링이 요구됐다. 신광섭 차장은 "최적화와 최적화, 그리고 최적화가 가장 중요하다"며 프로파일링을 강조했다.

에픽게임즈는 '포트나이트' 최적화 부분을 시그니피캔스 매니저(Significance manager), 티킹(Ticking), 블루프린트, 스트리밍, 서버 퍼포먼스, 프로파일링, HLOD, 콘솔@60Hz, CPU, GPU, 모바일로 나눴다.

최적화의 기본 원리는 속임수다. 멀리 있는 적은 잘 안 보이는 것을 이용해 일부러 그래픽을 낮춰 표현한다. 시그니피캔스는 거리와 위치에 따라 중요한 오브젝트를 판단하는 기능이다. 가까운 적의 그래픽을 100% 표현해야 하지만, 1km 멀리 있는 적까지 100% 구현할 필요는 없다. 단순히 점 정도로만 표현해도 플레이어는 이상한 점을 느끼지 못한다.



▲ 플레이어 카메라 위치와 중요도에 따라 해상도를 결정한다

에픽게임즈는 '포트나이트'를 개발하다가 시그니피캔스 기능이 필요해 언리얼 엔진4에 추가했다. 개발자는 자신이 원하는 수준을 직접 설정해 적용할 수 있다. 이 기능은 주어진 하드웨어 제약 안에서 최대한의 프레임을 낼 수 있도록 돕는다.

티킹은 틱(tick)마다 일어나는 이벤트 그래프의 블루프린트를 C++로 변경하는 과정이다. '포트나이트'의 캐릭터는 코스튬 등을 위해 다섯 부분으로 나뉜다. 각 파츠를 매번 부르니 무거워지는 단점이 있다. 디자인했던 블루프린트를 네이티브 코드인 C++로 변경해 빠른 반응 속도를 기대할 수 있다.

문제가 되는 틱은 덤프틱(Dumpticks) 명령어로 쉽게 찾을 수 있다. 풍차나 '움직이는 토마토' 같은 경우 매번 로테이션 값을 요구해 불필요한 이벤트를 일으킨다. 언리얼 엔진4는 반복된 움직임을 설정하는 컴포넌트가 아예 있어 빠르게 작동한다. 이 기능을 통해 틱을 최적화할 수 있다.

빌딩 액션 게임인 '포트나이트'는 건설과 파괴 때마다 많은 부하가 생긴다. 특히 맵의 거의 대부분의 요소를 파괴할 수 있다 보니 보통의 게임보다 부하가 더 심하다. 언리얼 엔진4는 액터를 생성할 때마다 일어나는 일을 엔진 단에서 모두 분석해 최적화한다. 기능 중 하나는 파티클 풀링(pooling) 시스템으로, 관련 콤포넌트와 메소드 등으로 쉽게 제어할 수 있다.

'포트나이트'에는 맵에 시간마다 다양한 빛 효과가 나타난다. 맑은 아침이나 저녁노을, 밤 등이다. 빛에 따라 반응하는 오브젝트가 값은 통째로 변경될 수 있도록 '머터리얼 파라미터 컬렉션'을 추가했다. 이 에셋은 많은 라이팅 관련 변수를 변경할 수 있고, 프레임당 하나의 변경만 업데이트하도록 시스템 최적화를 돕는다.

레벨 스트리밍은 PC와 콘솔 플랫폼까지는 메모리가 충분히 필요하지 않던 기능이다. 이후 모바일까지 도모하게 되면서 필요성이 대두됐고, 2018년 1월에 업데이트됐다. 레벨 스트리밍은 메모리에 맵을 로드/언로드하거나 그 표시여부(visibility)를 토글 시키는 작업 모두 플레이 도중 할 수 있도록 해 주는 기능이다. 이를 통해 모바일에서 최적화를 이룰 수 있었고, 결과적으로 PC와 콘솔에서도 좋은 메모리 사용량을 낮출 수 있었다.

레벨 스트리밍의 쓰임새 예는 다이빙과 전투 시에 구분된다. 게임을 시작하고서 다이빙 때까지는 특별히 할 일이 없다. 이때 스트리밍 시간을 더 주고 게임에 필요한 정보를 로딩한다. 착지하고 나서는 다양한 액션이 요구되니 스트리밍 시간을 줄인다. 이 차이는 실시간으로 일어난다.



▲ 다이빙 때는 딱히 할 게 없으니 로딩에 할애한다

MMO에 필요한 데디케이티드 서버를 다시 정의했다. '포트나이트' 한 맵에는 많은 유저의 슈팅 정보가 발생한다. 이때 모든 유저가 서로의 모든 정보를 공유할 필요는 없다. 에픽게임즈는 정보를 최대한 필터링해서 필요한 정보만 주고받게 했다.

클라이언트 부분에서는 캐릭터 이동을 합쳐 처리하도록 노력했다. '포트나이트'에서 가장 많은 정보가 발생하는 게 캐릭터의 이동이다. 높은 FPS에서 많은 RPC 호출은 되도록 피하고, 공격적으로 최소 프레임으로 처리했다. 레이턴시를 줄이기 위해서 중요한 이동은 바로 보내도록 했다. 애니메이션은 서버가 아닌 클라이언트가 처리한다. 이외에 불필요한 모든 컴포넌트를 제거했다.

프로파일링의 중요성은 아무리 강조해도 지나치지 않다. 에픽게임즈의 '포트나이트' QA 팀은 매일 100인 플레이 테스트에서 데이터를 수집한다. 하나의 완벽한 게임에서 얻어진 프로파일 데이터로 게임에서 발생한 히치를 찾는다. 히치는 플레이 시 툭툭 끊기는 순간이다. 모든 데이터는 리플레이 기능으로 다시 재현해 모든 플랫폼에서 테스트할 수 있다.



▲ 위 그래프로 틱 구간을 확인해 아래처럼 안정화한다

모든 플랫폼에서 리플레이를 구현할 수 있으니 최적화도 편하다. PC에서 발생한 문제가 iOS에서 같이 발생하는지 확인해 빠른 최적화가 가능하다.

콘솔 최적화에서 30fps 게임을 60fps로 올리는 데는 업스케일링이 유용했다. 좋은 퍼포먼스를 내면서도 해상도를 낮추는 효과가 있다. 해상도를 낮춰 픽셀 수를 줄이니 효과가 바로 온다. 다만, 해상도를 바꾸면 다소 뭉개지는 단점이 있다. 모바일은 어쩔 수 없더라도, PS4까지 타협하기는 어려워 에픽게임즈는 새로운 기능을 추가했다.

템퍼럴 업샘플링(Temporal Upsampling)은 언리얼 엔진 4.19 버전에 추가된 옵션이다. 높은 퀄리티의 업샘플링이 가능하고, TemporalAA 패스에서 업샘플링 된다. 여기에 다이나믹 레졸루션(Dynamic Resolution)으로 GPU 부하에 따라 자동으로 해상도가 변경되게끔 했다. 해상도가 변해도 템퍼럴 업샘플링 덕으로 그 변화는 거의 느껴지지 않는다.

닌텐도 스위치는 기기 한계로 어쩔 수 없이 30Hz에 맞췄다. 도킹 모드에서는 GPU를 최대한 활용해 다이나믹 레졸루션과 TAAU, 디퍼드 렌더러를 사용한다. 핸드 모드에서는 배터리 사용량으로 인해 모든 퍼포먼스를 발휘하지 않는다. 최근에는 클러스터 포워드 렌더러(Clustered Forward Renderer)로 변경해 10% 더 빠른 퍼포먼스를 보일 수 있게 됐다.

캐릭터 최적화는 거리에 따라 4단계로 구분했다. 가장 가까이서는 이목구비가 선명하고, 멀어질수록 불분명해진다. 최대 3만 개의 LOD는 가장 멀 때 300개로 낮아진다. 개발자가 하나하나 만들지 않더라도 언리얼 엔진4에는 자동으로 LOD를 생성해주는 기능이 있다.



▲ 거리에 따라 캐릭터 LOD 세트를 활용한다

맵 전체에 깔린 나무들은 착시 효과를 적용했다. Hemi-octahedral를 이용해 기존 3D 오브젝트를 2D 텍스처 아틀라스로 묶는다. 이를 vector octahedron 변환을 이용해 프레임 인덱싱한다. UV 공간에서 +X, +Y, +XY 주변 좌표를 통해 간단히 프레임에 접근한다. 즉, 여러 장의 2D 이미지를 유저 카메라 각도에 따라 적합한 컷을 보여준다. 그러면 실제로 2D 이미지를 유저는 3D 나무라 여기게 된다. 이를 통해 기존 38만 개의 나무 트라이앵글을 6000개까지 줄일 수 있었다.

"모바일 최적화는 최고난도의 기술이 요구됐다"고 신광섭 차장은 전했다. 모바일 최적화는 CPU, 메모리, 드로우콜 줄이기, GPU 단계로 나뉜다.

CPU에서 문제는 최대치로 활용할 경우 열이 발생했고 디바이스는 열을 낮추기 위해 자동으로 다운클럭을 시행했다. 에픽게임즈는 해결하기 위해 CPU를 속이는 트릭을 썼다. CPU 코어들이 시간의 약 50%는 아이들(idle) 상태로 있게 만들었다. 그래서 최적화는 60fps를 목표로 했고, 출력은 30fps에 맞췄다. 필요한 것보다 더 계산하도록 만들어 여유 있게 만드는 트릭이다.

모바일 메모리 최적화는 제조사가 제시한 것보다 낮은 수준을 기준으로 잡아야 했다. 아이폰의 경우 2GB 디바이스는 실제 1.4GB를 쓸 수 있었고 안드로이드는 파편화가 심해 경우의 수가 더 복잡했다. 경우에 따라 2GB에서 500mb만 쓸 수 있는 경우도 있다.



▲ 제조사가 제시한 스펙보다 기준을 낮게 잡는 게 좋다

iOS는 제한된 디바이스만 있어 값을 각각 세팅했다. 메모리 허용량은 폴리지 사용 여부에 따라 결정했고, 스케일러빌리티 세팅을 했다. 해상도와 그림자 of/off 기능 등이다. 안드로이드는 그래픽 API가 iOS만큼 빠르지 않았다. 때문에 낮은 사양의 안드로이드는 20hz를 사용하기도 했다.

신광섭 차장은 "다양한 플랫폼에서 크로스 플레이가 되도록 최적화하는 과정은 엄청난 노력이 필요했다"며 "이 과정을 통해 얻은 다양한 피드백을 통해 언리얼 엔진을 더 발전시킬 수 있었다"고 전했다.

댓글

새로고침
새로고침

기사 목록

1 2 3 4 5