GDC(Game Developers Conference) 첫날에는 전통적으로 다이렉트 X의 기술 튜토리얼인 Advanced Graphics Techniques Tutorial Day가 열리곤 합니다. 올해의 튜토리얼 데이에선 다이렉트 X 12는 좋지만 그걸 쓰는 데엔 상당한 주의가 필요하다는 세션이 두가지 있었는데요.
여기에선 Jurien Katsman(Studio Head, Nixxes Software)의 DX12 - and (How to avoid) death by a thousand Cuts와 유비소프트 몬트리얼의 Tiago Rodrigues 씨의 " Moving to DirectX 12 : Lessons Learned 중 첫번째 세션에 대해 소개하고자 합니다.
Katsman이 이끄는 Nixxes Software는 스퀘어 에닉스가 퍼블리싱하는 타이틀을 PC로 이식하는 작업을 많이 진행합니다. 이 회사에서 최근 작업한 다이렉트 X 12 지원 포팅으론 라이즈 오브 더 툼레이더, 데이어스 엑스: 맨카인드 디바이디드가 있는데, 여기서의 경험을 설명하면서 강연을 진행했습니다.
한마디로 요약하면 "다이렉트 X 12 지원은 참 간단해 보이나, 실제로 도전하면 어렵다"입니다. GPU 제조사마다 실행 특징이 달라, 다이렉트 X 11 버전을 완성시키고 다이렉트 X 12로 이식하면 생각만큼 성능이 오르지 않는다고 하네요.
라이즈 오브 더 툼레이더의 다이렉트 X 11 vs 다이렉트 X 12
데이어스 엑스: 맨카인드 디바이디드의 다이렉트 X 11 vs 다이렉트 X 12
사실 이는 Nixxes Software가 다이렉트 X 12 이식에 착수한 게 다이렉트 X 12가 막 등장했을 때라 그런 것도 있습니다. GPU에선 다이렉트 X 12 지원 디버깅 툴이 없었고, 개발 문서와 드라이버도 문제가 있었고, 각 기능의 최적화 수준은 GPU 제조사마다 달랐다고 합니다.
다이렉트 X 12는 리소스 관리와 렌더링 명령의 조합, 그리고 발급을 개발자가 직접 설계하고 구현하며 관리해야 합니다. 따라서 개발 난이도가 다이렉트 X 11보다 월등히 높아집니다. 가장 난이도가 높았던 건 메모리 관리로 다이렉트 X 11보다 성능이 더 떨어지기도 했다네요.
"우선 많은 자원을 만들자. 다이렉트 X 11처럼". 이런 생각은 다이렉트 X 12에선 불가능합니다. 필요한 만큼 먼저 확보하려 해도 이를 해결하는 방안을 동시에 넣어야 합니다.
또 메모리 관리 제어를 한번에 수행하면 게임 진행이 느려지는 경우가 있기에, 이를 분산해서 배치하는 것도 염두에 둬야 합니다.
다이렉트 X 11에선 CPU 프로그램이 드로잉 명령을 직접 구축하고 발행하지만, 다이렉트 X 12의 드로잉은 드라이버를 거쳐 GPU에 발송한 시점에서 그 GPU의 네이티브 명령 문자열로 변환됩니다.
이렇게 기본 명령어 라인을 버퍼링하는 메모리 확보는 다이렉트 X 12의 API인 Command Allocator를 통해 수행하나, 이를 확보하고 풀어주는 과정을 반복하면 성능에 그만큼 영향을 주게 됩니다. 명령 목록은 간단히 해결되나 명령 수집은 시간이 걸리는 것이죠. 이를 염두에 두고 파이프라인을 설계해야 합니다.
또한 다이렉트 X 12에선 데이터군이 어떤 형태인지를 기록하는 Descriptor라는 개념을 도입했으며, 링크 트리 구조의 Descriptor Heap 형식으로 Descriptor 데이터를 관리하는데, 이 Descriptor Heap의 업데이트 변경 처리가 NVIDIA GPU에선 성능의 발목을 잡습니다. 그래서 이 처리의 최적화가 NVIDIA GPU 기반 환경에서 높은 성능을 얻기 위해 꼭 필요합니다.
또한 멀티코어 CPU에서 멀티 스레드를 구현해 렌더링 명령을 병렬 구축할 수 있게 된 건 분명 다이렉트 X 12의 장점이나, 일정 분량을 정리해서 발급하면 렌더링 명령이 너무 많아져, 이를 모으는 데 걸린 시간만큼 지연이 생기게 됩니다.
비동기 컴퓨트는 그래픽 렌더링과 비동기 컴퓨트 쉐이더를 실행하는 것으로, AMD가 자사 GPU에서만 효율적으로 실행 가능하다고 주장해 화제가 됐었습니다. 다만 다이렉트 X 12가 나온 직후의 오래된 드라이버에선 동작이 불안정했다고 하네요. 또 최근엔 드라이버 최적화가 진행돼 AMD와 NVIDIA의 GPU 모두에서 비동기 컴퓨트는 안정적으로 작동했다고 합니다.
마지막은 다이렉트 X 12의 멀티 GPU 관련 기능입니다. 다이렉트 X 12에선 시스템에 여러 GPU가 탑재됐을 때 게임 프로그램에서 각각의 GPU를 특정 용도로 쓸 수 있다는 것이 장점입니다. 예를 들어 GPU 0은 그래픽 렌더링, GPU 1은 물리/AI 시뮬레이션으로 쓰고, GPU 0과 1의 비디오 메모리를 모두 사용할 수 있다. 뭐 이런 것 말입니다.
하지만 이게 말은 그럴싸해도 실제로 하려면 매우 어렵다고 합니다. 성능이 다른 GPU를, 게다가 사용자마다 어떻게 조합할지 모른 GPU를, 동시에 여러개를 가지고 효과적으로 활용하기란 매우 어렵다고 하네요. 그래서 라이즈 오브 더 툼레이더와 데이어스 엑스: 맨카인드 디바이디드는 스펙과 성능이 비슷한 2개의 GPU를 탑재한 환경에서만 교대로 렌더링해 성능을 높이는 AFR (Alternative Frame Rendering)만 쓰게 됩니다. 일반 게이머도 멀티 GPU를 개별적으로 쓰는 것보다 AFR로 프레임 속도를 향상시키는 쪽으로 기대하고 있다네요.
마이크로소프트와 GPU 제조사의 마케팅이 좋은 의미건, 나쁜 의미건 일반 사용자들에게 다이렉트 X 12에 대한 과도한 기대를 품게 만들고 있다고도 지적했습니다.
일반 게이머는 자신의 GPU가 다이렉트 X 12에서 얼마나 빨라질지를 기대합니다. 그러나 실제로 다이렉트 X 12 적용 후 더 느려지는 경우가 있어 이를 우려하는 사람들도 많습니다.
사실 다이렉트 X 12로 성능이 높아지는 건, 여기에 필요한 조건이 갖춰줬을 경우에 한정됩니다. 고성능 GPU와 CPU를 탑재한 하이엔드 시스템에서 다이렉트 X 12의 CPU 병목 현상은 거의 일어나지 않습니다. 또 4K 같은 고해상도나 PC에서나 가능한 높은 그래픽 설정을 선택하면 GPU의 부하가 늘어나 다이렉트 X 12에 의한 성능 향상이 거의 눈에 띄지 ㅇ낳게 됩니다.
그럼 다이렉트 X 12에 그만한 가치가 있을까요?
그 답은 '있다' 입니다. 하이엔드 CPU와 GPU를 탑재하지 않은 시스템은 성능에서 뚜렷한 효과를 볼 수 있으며, 게임 프로그램과 렌더링 파이프라인의 설계 방침도 PS4와 Xbox One 버전에 가까운 일관성을 지닐 수 있다는 점도 장점이 됩니다.
다이렉트 X 12의 지원은 정말 어렵습니다. 하지만 분명 가치는 있지요. 그러나 현실적인 관점에서 보아야 하며 과도한 기대를 가져선 안됩니다. 다이렉트 X 12에 대한 환상을 버리세요.
다이렉트 X 11과 12를 비교하지 마세요. 그냥 재밌는 게임을 만들면 결과는 나중에 옵니다.