TL;DR
- DxTimingCaptureLibrary는 Windows 10·11에서 DirectX 개발자가 ETW 이벤트를 해석하고 게임 프로파일러 등에서 활용하도록 돕는 오픈소스 C++ 라이브러리임.
- 라이브러리는 여러 소스의 ETW 이벤트를 해석·연결하고, 애플리케이션 코드에서 사용할 수 있도록 콜백을 제공함.
- GPU 타이밍, API 객체 생성·삭제, 상주성 및 페이징, DirectStorage, D3D 런타임 오류 로그, 파이프라인 상태 컴파일, 모니터 VSync, WinPixEventRuntime 마커와 사용자 지정 카운터 데이터를 노출함.
- GitHub 저장소의 README를 따라 DirectX ETW 이벤트를 포함하는 ETW 세션을 설정하고, 이벤트 핸들러와 관련 콜백 인터페이스를 구성하는 방식임.
- 샘플은 상주성 로그, D3D12 저널 항목, Perfetto 추적 파일, 시스템·비디오 메모리 사용량 트리맵을 다룸.
DxTimingCaptureLibrary란?
- ETW(Event Tracing for Windows)는 낮은 오버헤드로 시스템 및 애플리케이션 이벤트를 상세히 수집하는 Windows 기능임. D3D12 런타임, DXGI, DirectX 커널 등 DirectX 구성 요소는 중요한 활동이 발생할 때 ETW 이벤트를 생성함.
- DxTimingCaptureLibrary는 게임 개발자가 이벤트를 해석하고 활용 가능한 정보를 얻도록 지원함. 여러 소스의 ETW 이벤트를 해석하고 연결하는 복잡한 작업을 처리한 뒤, 애플리케이션 코드에 간단한 콜백을 제공함.
- ETW 세션 구성과 라이브러리 사용 방법을 보여주는 샘플을 포함함.
- PIX Timing Captures의 코드를 추출해 독립 프로젝트로 분리해 제작함. PIX Timing Capture UI에 표시되는 모든 DirectX 데이터를 DxTimingCaptureLibrary를 통해 사용할 수 있음.
- GitHub에서 MIT 라이선스로 제공되며, Windows 10과 Windows 11의 모든 버전에서 작동함.
라이브러리 기능
- GPU 타이밍 데이터
- 각 커맨드 리스트 작업 항목의 파이프라인 시작 및 종료 시점 타임스탬프를 포함함.
- 타임스탬프는 D3D 히스토리 버퍼를 통해 드라이버가 채움.
- API 객체 생성 및 삭제: 타임스탬프, 객체 크기, 매개변수, 디버그 이름을 포함함.
- 상주성 및 페이징 이벤트: 페이징 또는 퇴출에 따라 DirectX 커널이 객체를 비디오 메모리와 시스템 메모리 사이에서 이동하는 시점을 표시함. VRAM 단편화 등에 따른 마이그레이션 실패도 표시함.
- DirectStorage 이벤트: 읽기 및 상태 요청을 포함함.
- D3D 런타임 실패 로그
- 파이프라인 상태 컴파일 이벤트
- 모니터 VSync 이벤트
- WinPixEventRuntime 이벤트 및 마커: CPU와 GPU 타임라인 모두에서 확인 가능함.
- PIX 사용자 지정 카운터 데이터: WinPixEventRuntime 카운터 API를 통해 제공함.
시작 방법
- GitHub 저장소의 README에 최신 시작 안내가 있음.
- 적절한 DirectX ETW 이벤트를 포함하도록 ETW 세션을 생성하고 구성함. 제공되는 샘플에서 세션 구성 방법을 확인할 수 있음.
- ETW 세션의 이벤트 핸들러가 DxTimingCaptureLibrary의 이벤트 핸들러를 호출하도록 구성함.
- 사용 사례에 적합한 DxTimingCaptureLibrary 콜백 인터페이스를 구현함.
- 해당 이벤트가 발생할 때 라이브러리가 콜백을 호출하도록 대기함.
샘플
- Basic Residency Logging: 각 DxTimingCaptureLibrary 콜백의 기본 구현이
printf방식으로 이벤트 데이터를 콘솔 출력 창에 기록함. 선택 모드에서는 MakeResident/Evict, Paging In/Out, 마이그레이션 실패를 포함한 DirectX 상주성·페이징 이벤트만 기록함. 라이브러리를 시작하기에 적합한 샘플임. - D3D12 Journal Entries: DxTimingCaptureLibrary의 D3D12 저널 콜백을 구현해 D3D12 코드에서 오류가 발생할 때 알림을 받음. 샘플은 잘못된
CopyBufferRegion()호출이 포함된 커맨드 리스트를 닫는 방식으로 유효하지 않은 D3D12 API 호출을 의도적으로 수행하며, 라이브러리는 저널 콜백을 통해 이를 보고함. 콜백은 D3D12 디버그 계층보다 세부 정보가 적지만 일반 D3D12 API보다 많은 정보를 제공하며, 리테일 D3D12 환경에서도 작동함. - Perfetto: GPU 타이밍 데이터 콜백을 구현해 Perfetto 추적 파일을 생성함. 추적은 각 커맨드 리스트 이벤트의 GPU 타임라인상 파이프라인 시작 및 종료 시점 타임스탬프를 표시하고, 해당 이벤트가 기록된 시점을 나타내는 CPU 타임라인 마커와 데이터를 연결함. 다른 프로세스의 GPU 작업과 해당 작업이 현재 프로세스에 간섭할 수 있는 방식도 표시함.
- Memory Treemap: 개발 진행 중인 샘플임. 리소스 생성 및 상주성 이벤트 콜백을 수신하고, 페이징 및 상주성 이벤트를 반영해 시스템 메모리와 비디오 메모리의 리소스 및 힙 사용량을 나타내는 트리맵 두 개를 채움.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요