Unity 6에서의 DirectX 12 개선 사항
요약
Unity 6.1부터 DirectX 12가 새로운 프로젝트의 기본 그래픽 API로 설정되었으며, CPU 성능과 렌더링 품질을 높이기 위한 다양한 개선 사항이 도입되었습니다. Split Graphics Jobs를 통한 멀티스레딩 최적화, PSO Tracing을 이용한 렌더링 끊김 방지, 그리고 Variable Rate Shading(VRS) 지원을 통해 개발자에게 더 높은 제어권을 제공합니다.
핵심 포인트
- Unity 6.1부터 DirectX 12가 기본 그래픽 API로 채택되어 현대적인 저수준 추상화 제공
- Split Graphics Jobs 모드를 통해 메인 스레드와 그래픽 작업 스레드 간 동기화를 줄여 CPU 병목 현상 완화
- GraphicsStateCollection API를 활용한 PSO(Pipeline State Objects) 트레이싱으로 렌더링 끊김(stutter) 방지
- Variable Rate Shading(VRS) API 도입으로 셰이딩 성능과 시각적 품질 사이의 효율적인 균형 조절 가능
- DX12 멀티스레딩 사용 시 CPU 성능 향상과 그래픽 메모리 사용량 증가 사이의 트레이드오프 고려 필요
Unity Graphics 팀에서 인사드립니다! 이 포스트에서는 DirectX 12 (DX12) 그래픽 백엔드(backend)의 기능 및 성능에 대한 최신 개선 사항을 다룹니다. Unity 6.1부터 DirectX 12가 새로운 프로젝트를 위한 기본 그래픽 API (API)로 설정되었습니다. DX12는 그래픽 가속을 위해 현대적이고 더 낮은 수준(lower level)의 얇은 추상화(thinner abstraction)를 제공합니다. DX12는 애플리케이션이 GPU로 그래픽 명령(graphics commands)을 기록하고 제출하는 과정을 효율적으로 멀티스레딩(multi-thread)할 수 있도록 하여, 멀티 코어 CPU (multi core CPUs)를 더 잘 활용하도록 설계되었습니다. 또한 DX12의 최신 개선 사항을 다루는 최신 Unite Graphics Performance 세션을 시청하실 것을 권장합니다.
Split Graphics Jobs로 CPU 성능 가속화
DX12를 위한 새로운 Split Jobs 스레딩(threading) 모드는 메인 스레드(main thread)와 그래픽 작업(graphics jobs) 스레드 간의 동기화(synchronization)를 줄임으로써 기존의 “Native Jobs” 스레딩 모드를 개선합니다. 이는 대규모의 복잡한 환경을 렌더링하며 많은 드로우 콜(draw calls)을 제출하는, CPU 병목(CPU-bound)이 발생하는 게임에 특히 유익합니다.
Unity 6부터는 Scene 및 Game View의 렌더링 성능을 향상시키기 위해 DX12용 Unity Editor에서도 Split Graphics Jobs가 지원됩니다. 이제 Editor의 “Preferences” -> “Job Settings” 패널에서 Graphics Jobs를 토글(toggle)할 수 있습니다.
참고: DX12 멀티스레딩(multithreading)은 스레드당 추가 리소스 할당으로 인해 추가적인 그래픽 메모리(graphics memory) 비용이 발생합니다. 이는 CPU 성능과 메모리 사용량 사이의 트레이드오프(tradeoff)를 발생시키며, 싱글 스레드(single-threaded)인 DX11에 비해 메모리 사용량을 증가시킬 수 있습니다.
CPU 성능 외에도, DX12는 게임 개발자에게 최신 GPU 기능을 노출하여 충실도(fidelity)와 성능을 모두 향상시킬 수 있는 새로운 방법을 열어줍니다.
PSO Tracing으로 렌더링 끊김 방지
DX12를 사용하면 파이프라인 상태 객체(Pipeline State Objects, PSOs)를 생성하고 캐싱(caching)함으로써, 렌더링 시간보다 훨씬 앞서 필요한 그래픽 상태(graphics states)를 명시적으로 지정할 수 있습니다. 이 워크플로우(workflow)는 애플리케이션의 끊김(stutters/hitches)을 제거하여 더 부드러운 렌더링과 게임 플레이를 결과로 가져옵니다.
이를 활성화하기 위해, Unity 6는 새로운 GraphicsStateCollection API 지원을 도입합니다.
아래 예제에서는 씬(Scene)을 로드하기 전에 PSO(Pipeline State Objects)를 미리 컴파일(precook)하는 데 이 API를 사용합니다. 그 결과, Garden 데모를 끊김 없이(stutter-less) 비행하며 살펴볼 수 있습니다. PSO 트레이싱(tracing)에 대한 자세한 정보는 공식 Unity Discussions 게시물을 확인하세요.
Variable Rate Shading으로 셰이딩 성능과 품질의 균형 맞추기
DX12는 픽셀 셰이더(pixel shaders)와 드로우 콜(draw calls)의 셰이딩 속도를 제어하기 위한 Variable Rate Shading (VRS) 지원을 도입했습니다. Unity 6.1의 새로운 VRS API를 사용하면 텍스처로부터, 또는 셰이더를 사용하여 절차적(procedurally)으로 셰이딩 속도 이미지(shading rate image, SRI)를 생성할 수 있습니다. 일단 생성되면, CommandBuffer API 또는 Scriptable Render Passes를 사용하여 SRI를 적용할 수 있습니다.
아래 예제에서는 모션 블러(motion blur)의 영향을 받는 화면 영역에 더 낮은 셰이딩 속도를 적용하고 있습니다. 이는 시각적 충실도(visual fidelity)의 눈에 띄는 저하 없이 픽셀 셰이딩 오버헤드(pixel shading overhead)를 줄여줍니다. Variable Rate Shading에 대해 더 자세히 알아보려면 공식 Unity Discussions 게시물을 확인하세요.
Async Compute로 GPU 활용도 개선하기
DX12에서 도입된 또 다른 기능은 비동기 컴퓨트(Asynchronous Compute) 디스패치(dispatch)입니다. 이를 통해 컴퓨트 셰이더(Compute Shader) 실행을 무거운 래스터화(rasterization) 워크로드와 중첩시켜 GPU 병렬성(parallelism)을 향상할 수 있습니다. 래스터화 비중이 높은 패스(예: Shadowmaps)는 종종 지오메트리 처리(geometry processing)에 의해 제한되며, GPU의 셰이더 코어를 완전히 활용하지 못할 수 있습니다. 컴퓨트 커널(compute kernels)을 비동기적으로 디스패치함으로써 GPU 활용도를 높이고 프레임 타임(frame times)을 줄일 수 있습니다. DX12 전용 기능에 대한 자세한 정보는 공식 문서를 참조하십시오.
DirectX Ray Tracing으로 충실도를 극대화하기
Unity의 High Definition Render Pipeline (HDRP)은 타의 추종을 불허하는 시각적 충실도와 사실감을 달성하기 위해 DirectX 12 레이트레이싱 (DXR)을 활용합니다. 이는 HDRP와 DXR을 사용하여 놀라운 비주얼을 구현한 “Enemies” 실시간 데모를 통해 입증됩니다. Unity 6는 DXR 1.1 기능 수준(feature level) 호환성과 함께 레이트레이싱(Ray Tracing)에 대한 프로덕션 준비 완료(production-ready) 지원을 제공합니다.
이는 레이트레이싱 (Ray Tracing) 기능과 성능에 많은 개선 사항을 가져옵니다. Solid Angle Culling은 너무 작거나 멀리 있는 오브젝트를 폐기함으로써 레이트레이싱 성능을 향상시킬 수 있게 해줍니다. HDRP 레이트레이싱 설정(Culling Mode)을 통해 Angle Culling을 활성화하여 CPU 처리 시간을 크게 줄일 수 있습니다. DX12 레이트레이싱의 추가적인 개선 사항은 다음과 같습니다:
- 셰이더 내 인라인 레이트레이싱 (Inline Ray Tracing in Shaders)
- 레이트레이싱 가속 구조 빌드 플래그 (Ray Tracing Acceleration Structure Build Flags)
- 간접 레이트레이싱 디스패치 (Indirect Ray Tracing Dispatch)
- 간접 레이트레이싱 인스턴싱 (Indirect Ray Tracing Instancing)
Unity 6는 또한 다음과 같은 방법을 통해 DX12 레이트레이싱의 메모리 사용량을 줄입니다:
- BLAS 압축 (BLAS Compaction)은 정적 메시 (static meshes)의 메모리 사용량을 줄입니다.
- 작은 BLAS를 위한 커스텀 GPU 메모리 할당기 (Custom GPU memory allocator)는 작은 메시와 디테일의 메모리 사용량을 줄입니다.
- MinimizeMemory 플래그를 MeshRenderer별로 설정하여 메모리 사용량을 더욱 줄일 수 있습니다.
DirectX12 렌더 패스 (Render Pass)를 통한 메모리 대역폭 사용량 감소
Windows-on-ARM 지원이 도입됨에 따라, DX12는 새로운 렌더 패스 API (Render Pass API)를 통해 모바일 (타일 기반, tile-based) GPU 효율성을 개선합니다. DX12 렌더 패스는 Unity 6의 렌더 그래프 (Render Graph) 시스템에 의해 활용되며, 이 시스템은 호환 가능한 렌더 패스를 자동으로 추적하고 병합합니다. 아래 예시에서 렌더 그래프는 지오메트리 렌더 패스 (geometry render passes)를 병합하고, GBuffer 텍스처를 온칩 타일 메모리 (on-chip tile memory)에서 직접 로드할 수 있습니다. 이는 대역폭과 에너지 사용량뿐만 아니라 발열을 크게 줄여, 모바일 기기가 더 오래 작동하고 안정적인 프레임 레이트 (framerate)를 유지할 수 있게 합니다. URP에서의 온타일 렌더링 (on-tile rendering)에 대해 더 자세히 알아보려면 렌더 그래프 문서를 참조하십시오.
DirectML을 통한 신경망 추론 (Neural Network Inference) 가속
그래픽 개선 사항 외에도, DX12는 Sentis API를 통해 신경망 추론 성능을 향상시킬 수 있습니다. DX12와 Sentis GPU 백엔드 (GPU backend)를 사용할 때, 더 큰 합성곱 신경망 (Convolutional Neural Networks)을 실행할 경우 추론 시간이 최대 50%까지 단축되는 것을 확인했습니다. Sentis를 위한 DX12 가속에 대해 더 자세히 알아보려면 공식 Unity Discussions 게시물을 확인하십시오.
플랫폼 지원
DirectX 12는 최신 Windows 플랫폼에서 지원됩니다.
사용자의 PC에서 지원되는 DirectX 버전을 확인하려면 다음 지침을 따르십시오. 또한 DirectX 12 및 기능 수준 (feature level) 지원에 대한 GPU별 정보는 Wikipedia를 참조할 수 있습니다:
NVIDIA: https://en.wikipedia.org/wiki/List_of_Nvidia_graphics_processing_units
AMD: https://en.wikipedia.org/wiki/List_of_AMD_graphics_processing_units
Intel: https://en.wikipedia.org/wiki/List_of_Intel_graphics_processing_units
DirectX 12는 매우 오래된 GPU 모델이나 구버전 드라이버 버전에서는 권장되지 않을 수 있습니다. 레거시 (legacy) Windows 장치를 대상으로 하는 경우, 여전히 DirectX 11을 대상으로 하거나 폴백 (fallback) API로 유지하는 것을 권장합니다.
이 최신 DX12 개선 사항들을 직접 시도해 보시고 여러분의 의견을 알려주세요!
공개 로드맵 (public roadmap)을 통해 우리의 진행 상황을 확인할 수 있습니다. 찾고 있는 기능을 찾을 수 없는 경우, 자유롭게 기능 요청 (feature request)을 제출하거나 이 스레드 또는 그래픽스 토론 포럼 (graphics discussion forum)을 통해 팀에 직접 문의해 주시기 바랍니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Unity Blog의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기