Nintendo Switch의 성공적인 출시로, 이제 개발자들에게는 제품을 출시할 아주 새롭고 특별한 플랫폼이 생겼습니다. 많은 스튜디오가 이전에 출시했던 게임을 새로운 관객에게 선보일 수 있게 된 것입니다. 저희는 벌크헤드 인터랙티브(Bulkhead Interactive)에서 2016년에 출시한 퍼즐 게임인 튜링 테스트(The Turing Test)를 닌텐도 스위치에 이식하기로 결정했습니다. 새로운 플랫폼을 알아보기에 적합한 방법이라고 생각했습니다.
이 프로젝트의 첫 단계는 언리얼 엔진의 새롭고 멋진 기능을 사용할 수 있도록 엔진의 최신 버전으로 업그레이드 하는 것이었습니다. 출시한지 3년이 지난 게임으로서는 엄청난 작업이었으나 해당 코드의 이식은 대부분 간단한 수정 작업과 더불어 순조롭게 진행되었습니다.
이 업그레이드에는 몇 가지 중요한 렌더링 변경 사항이 적용되었는데 그 중에서도 새로운 필름 톤매퍼의 도입은 최종 화면을 완전히 다르게 보이도록 만들었습니다. 이러한 변화에는 아티스트의 원래 비전이 게임에 더욱 잘 드러나도록 컬러 그레이딩, 스페큘러의 미세한 조정, 레벨에 따른 리플렉션 패스 설정 작업이 동반되었습니다.
스토리 기반 게임에는 몰입감이 중요하므로 로딩 화면에 소요되는 시간이 적을수록 좋습니다. 이를 위해 언리얼 엔진은 여러 게임 아키텍처를 대상으로 일반적인 레벨 스트리밍부터 더 전문적인 월드 컴포지션까지 아우르는 다양한 솔루션을 제공합니다. 튜링 테스트와 같은 대부분의 선형적인 게임의 경우, 일반 레벨 스트리밍은 낮은 메모리 오버헤드를 유지하고 가능한 게임이 멈추는 로딩을 줄이면서 게임 월드로 들어오고 나갈 때 많은 양을 로드하는 데 드는 비용을 나누어서 처리하도록 허용하는 강력한 솔루션입니다.
그러나 게임플레이 시 게임 스레드의 스파이크를 일으키는 가비지 콜렉터가 더 많은 일을 해야 하는 단점이 있습니다. 이는 닌텐도 스위치와 같이 상대적으로 제약이 있는 휴대용 시스템에서 레벨 스트리밍 시 상당한 문제를 야기합니다. 가비지 콜렉터가 사용 중이 아닌 엔티티를 처리하는 동안 신규 액터 및 컴포넌트는 월드에 추가될 때 등록, 초기화, 조회되어야 합니다. 이러한 문제는 게임 전반에 걸쳐 사용된 많은 컴포넌트와 복잡한 액터에 의해 발생하는데, 일반적으로 다른 플랫폼에서는 문제가 되지 않았습니다.
저희는 히치를 간과하고 레벨 전환 중에 플레이어가 자유롭게 이동하는 것을 실험했습니다. 그 결과 부족한 월드 틱 상황에서 신(scene)에서 보여야되는 필수적인 액터(여러 레벨에서 진행되어야 하는 오브젝트)에서 플레이어와 충돌한 후 불안정한 피직스 인터랙션이 발생했습니다. 결국 다음 레벨로 스트리밍할 때 약간의 딜레이를 두어 플레이어가 움직이지는 못하되 한 자리에서 둘러볼 수만 있도록 일종의 타협안을 사용했습니다.
비슷한 경우에 대해 한 가지 팁을 공유하자면, 레벨 스트리밍(프로젝트 세팅 > 스트리밍)에 대한 사용 가능한 옵션을 살펴 보라는 것입니다. 액터와 컴포넌트 초기화 및 해제, 기타 중요 변수에서 사용하는 프레임당 시간을 제한할 수 있습니다.
이전에는 튜링 테스트가 모두 영어로만 출시되었으나, 닌텐도 스위치의 인증을 통과하기 위해서는 기본적으로 영어, 프랑스어, 이탈리아어, 독일어, 스페인어 현지화가 필요합니다. 배경 텍스처로 구워진 많은 양의 문자 정보가 스토리텔링 요소로써 중요한 역할을 하는 튜링 테스트에게는 하나의 도전이었죠.
이를 해결하고자 동적 위젯을 생성하고 텍스처에 렌더링했는데 로딩 화면 또는 플레이어가 수동으로 게임 언어를 변경할 때에만 실행되도록 했습니다. 이 시스템은 월드에서 각 인스턴스의 다중 텍스처 보유로 인한 과부하를 덜어주고 번역을 반복하는 동안 추가 작업이 없도록 도와주었습니다.
플레이어에게 원활한 환경을 제공하기 위해 렌더링과 게임 스레드가 게임의 프레임 속도에 미치는 영향을 줄여야 했습니다. 게임플레이 코드가 전 부분에 걸쳐 최적화된 후에 대부분의 파트는 GPU 병목이었습니다. 저희는 주요 관심 영역을 진단하기 위해 명령줄에서 사용할 수 있는 다양한 통계 명령을 활용했습니다. 문제를 식별한 후에는 최근에 도입된 언리얼 인사이트를 포함한 내장 프로파일러 또는 플랫폼에서 제공하는 그래픽 디버그 툴을 이용해 더 깊게 파고들어 비용이 발생하는 부분을 분석하고 해결 방안을 모색했습니다.
저희는 가능하다면 고비용의 블루프린트 연산을 C++로 변환하여 불필요한 액터가 티킹되는 것을 방지했습니다. 다수의 스켈레탈 메시를 스태틱 메시로 교체하고 팬과 같이 움직이는 오브젝트에서의 콜리전을 제거하여 게임 스레드의 비용 관리가 원할하도록 했습니다. 투명도가 문제가 된 일부 영역에서는 셰이더 복잡도 뷰 모드를 활용해 오버드로가 발생한 곳을 식별했습니다. 그런 다음에 프레임 속도가 일정하게 유지되도록 머티리얼, 메시 및 파티클 시스템을 수정했습니다.
저희가 고민을 많이 했던 선택은 게임의 프레임 속도를 45FPS로 제한하는 것이었습니다. 여러 논리적, 그래픽적으로 수준있는 신(scene)을 유지할 수 있는 합리적인 목표라고 판단했습니다. 60FPS라는 탐나는 값은 아니지만 30FPS보다는 한층 발전한 수치입니다. 일부 표준 프레임 속도 중 하나에 대해 그래픽 옵션을 약간 조절하는 건 이득이 거의 없었습니다.
또는 언리얼 엔진의 동적 해상도 같은 최신 렌더링 기능을 상요할수도 있었지만, 숙고한 끝에 기존의 접근법을 따르기로 했습니다.
닌텐도 스위치에서 파악한 가장 강력한 리얼타임 렌더링 기능은 앰비언트 오클루전 및 스크린 스페이스 리플렉션입니다. 환경의 시각적 충실도에 중요한 기능들이므로, 저희는 목표를 달성하기에 합리적인 수준으로 신중하게 퀄리티를 조정했습니다. 엔진의 훌륭한 지원 덕분에 개발 과정에서 많은 그래픽 미세 조정을 신속하게 처리할 수 있었습니다. 최종 목표에 서서히 다가가면서, 프로젝트 종료에 이르기까지는 디바이스 프로파일을 활용했습니다.
결과적으로, 저희는 언리얼 엔진이 제공하는 툴과 기능을 사용하여 게임을 닌텐도 스위치에 빠르게 이식할 수 있었고 애셋과 코드를 최적화할 시간을 얻어 플레이어에게 더욱 원활하고 맞춤화된 경험을 제공할 수 있었습니다.