유니티 블로그 구독자라면, 모바일 게임 최적화를 다룬 최근 포스팅 시리즈에서 그래픽스와 에셋, 프로파일링과 메모리, 코드 아키텍처, 그리고 물리, UI 및 오디오와 관련한 유용한 팁을 확인하셨을 겁니다.
이번에는 더 많은 간편한 팁과 함께, 콘솔에서 고사양 그래픽스를 최적화하는 방법에 대해 알아봅니다. 배치 카운트를 줄이는 방법을 비롯하여 지양해야 하는 셰이더, 렌더링 옵션 등 다양한 팁을 살펴보세요. 이번 블로그에서 소개하는 팁은 PC와 콘솔 게임을 위한 고급 최적화 기술을 다루는 최신 전자책에서 발췌했으며, 해당 전자책은 무료로 다운로드할 수 있습니다.
Xbox 및 PlayStation 게임의 개발 과정은 PC 게임 개발과 비슷하지만, 플랫폼 고유의 풀어야 할 과제가 있습니다. 원활한 프레임 속도를 확보하기 위해 GPU 최적화에 집중해야 하는 경우가 많습니다.
우선 GPU 로드가 높은 프레임을 찾습니다. Microsoft와 Sony에서는 CPU 및 GPU에 대한 프로젝트의 성능을 분석할 수 있는 훌륭한 툴을 제공합니다. Xbox의 경우 PIX를, PlayStation의 경우 Razor를 툴박스에 추가하여 각 플랫폼에서 최적화 작업을 수행할 때 사용하세요.
각 네이티브 프로파일러를 사용하여 프레임 비용을 세부 분류하세요. 그래픽스 성능을 개선하기 위한 기본 정보로 사용할 수 있습니다.
다른 플랫폼과 마찬가지로 콘솔에서도 최적화 작업 시 드로우 콜 배치를 줄여야 하는 경우가 많습니다. 이때 유용한 몇 가지 기술이 있습니다.
SRP Batcher는 바인드 및 드로우 GPU 명령을 배칭하여 드로우 콜 사이에 소모되는 GPU 설정 비용을 줄입니다. 이러한 SRP 배칭의 장점을 활용하려면, 머티리얼을 필요한 만큼 사용하되, 서로 호환되는 소수의 셰이더(예: URP와 HDRP의 릿 셰이더와 언릿 셰이더)와 함께 사용하세요.
Player Settings > Other Settings에서 이 옵션을 활성화하여 PlayStation이나 Xbox의 멀티 코어 프로세서를 활용합니다. Graphics Jobs(실험 단계)를 사용하면 Unity에서 여러 CPU 코어에 렌더링 작업을 분산하므로 렌더 스레드의 부담을 해소할 수 있습니다. 자세한 내용은 멀티스레드 렌더링 및 Graphics Jobs 튜토리얼을 참조하세요.
콘솔에 최적화된 포스트 프로세싱 에셋을 사용하세요. PC용으로 저작된 에셋 스토어의 툴은 Xbox나 PlayStation에서 필요 이상으로 많은 리소스를 소모할 수 있습니다. 네이티브 프로파일러로 프로파일링하여 확인하세요.
테셀레이션은 셰이프를 더 작은 버전의 셰이프로 분할합니다. 그렇게 하면 지오메트리가 늘어 디테일 수준을 높일 수 있습니다. 테셀레이션을 사용하는 것이 적절한 경우도 있지만(예: 사자의 서(Book of the Dead)의 사실적인 나무 껍질) 일반적인 경우에는 콘솔에서 테셀레이션 사용을 지양하세요. GPU에서 많은 리소스를 소모할 수 있습니다.
테셀레이션 셰이더와 마찬가지로 지오메트리 셰이더와 버텍스 셰이더는 뎁스 프리패스 시 한 번 실행되고, 섀도우 패스 시 다시 한 번 실행되므로, GPU에서 프레임당 두 번 실행됩니다.
GPU에서 버텍스 데이터를 생성하거나 수정하고 싶다면, 지오메트리 셰이더보다 컴퓨트 셰이더를 사용하는 편이 바람직한 경우가 많습니다 컴퓨트 셰이더에서 작업하면 실제로 지오메트리를 렌더링하는 버텍스 셰이더가 상대적으로 빠르고 간소해집니다.
GPU에 드로우 콜을 보내면, Unity에서 GPU 내 사용 가능한 SIMD 전체에 이를 배포하여 여러 웨이브프론트에 작업이 분할됩니다.
각 SIMD에는 동시 실행 가능한 최대 웨이브프론트 수가 있습니다. 웨이브프론트 점유율은 이러한 최대치와 비교하여 현재 사용 중인 웨이브프론트의 수를 나타냅니다. 이를 통해 GPU 성능이 얼마나 충분히 활용되고 있는지 측정할 수 있습니다. PIX와 Razor는 웨이브프론트 점유율을 매우 상세하게 보여줍니다.
사자의 서에서 가져온 이 예시에서 버텍스 셰이더 웨이브프론트는 녹색, 픽셀 셰이더 웨이브프론트는 파란색으로 표시되어 있습니다. 아래쪽 그래프를 보면, 픽셀 셰이더 활동이 별로 없는데 상당한 양의 버텍스 셰이더 웨이브프론트가 나타납니다. 따라서 GPU 성능 활용도가 낮음을 알 수 있습니다.
픽셀로 표시되지 않는 버텍스 셰이더 작업이 많다면 이는 비효율적일 수 있습니다. 웨이브프론트 점유율이 낮다는 사실이 무조건 나쁜 것은 아니지만, 셰이더를 최적화하고 다른 병목 현상을 확인하는 지표로 활용할 수 있습니다. 예를 들어 메모리나 컴퓨팅 작업으로 인해 지연이 생긴다면, 점유율을 높여 성능을 개선할 수 있습니다. 반면에 너무 많은 웨이브프론트가 실행된 경우에도 캐시 스레싱(cache thrashing)이 발생하고 성능이 저하될 수 있습니다.
프로젝트에서 HDRP를 사용한다면 빌트인 패스와 커스텀 패스를 활용하세요. 씬 렌더링에 도움이 될 수 있습니다. 빌트인 패스는 셰이더를 최적화하는 데 도움이 됩니다. HDRP는 셰이더에 커스텀 패스를 추가할 수 있는 여러 인젝션 포인트를 포함하고 있습니다.
투명 머티리얼의 동작을 최적화하려면, 렌더러 및 머티리얼 우선 순위에 대해 다룬 이 페이지를 참조하세요.
HDRP의 High Quality 설정은 기본적으로 4K 섀도우 맵을 사용합니다. 섀도우 맵 해상도를 낮추고 프레임 비용에 미치는 영향을 측정하세요. 참고로 광원 설정을 통해 화질의 변화를 보완해야 할 수 있습니다.
GPU 사용률이 낮은 구간이 있을 때 Async Compute를 활용하면, 유용한 컴퓨트 셰이더 작업을 그래픽스 대기열에 병렬로 이동할 수 있고, 이를 통해 GPU 리소스 활용을 개선할 수 있습니다.
예를 들어, GPU는 섀도우 맵이 생성되는 동안 뎁스 전용 렌더링을 수행합니다. 이때 픽셀 셰이더 작업은 거의 수행되지 않으며, 많은 웨이브프론트들이 비점유 상태로 유지됩니다.
일부 컴퓨트 셰이더 작업을 뎁스 전용 렌더링과 동기화하면, 전반적인 GPU 사용률을 개선할 수 있습니다. 사용되지 않는 웨이브프론트를 스크린 공간 앰비언트 오클루전이나 현재 진행되는 작업을 보완하는 데 활용할 수도 있습니다.
사자의 서를 보면, 여러 최적화를 통해 섀도우 매핑, 조명 패스, 대기 구현에서 수 밀리 초를 단축했습니다. 그 결과 프레임 비용이 낮아져 PS4 Pro에서 30fps에 애플리케이션을 실행할 수 있게 되었습니다.
Unity 그래픽스 개발자 Rob Thompson이 사자의 서를 PlayStation 4에 이식하는 과정에 대해 설명하는 고사양 콘솔에서 성능 최적화 활용 사례를 시청하세요. 콘솔 게임 그래픽스 최적화를 위한 10가지 팁에서도 자세한 내용을 확인할 수 있습니다.