Quick Flow
startup failure -> log full executable path, asset root, HRESULT, missing DLL/shader
Present result -> status와 error를 먼저 구분
DEVICE_REMOVED/RESET -> GetDeviceRemovedReason으로 HUNG·driver·adapter 원인 분리
recovery -> device-dependent resources 전체 재생성Process working directory는 실행 방법에 따라 달라질 수 있습니다. Asset path는 executable 또는 명시적 content root 기준으로 만들고 실패한 최종 경로를 log합니다.
Release 차이
Release optimization은 초기화되지 않은 값, 수명 종료 뒤 pointer, race condition을 Debug와 다르게 드러낼 수 있습니다. Debug Layer 부재만 원인으로 단정하지 말고 compiler warning, sanitizer·Application Verifier, crash dump와 GPU validation을 나눠 사용합니다.
Present가 DXGI_ERROR_DEVICE_REMOVED 또는 DXGI_ERROR_DEVICE_RESET을 반환했을 때 device removal 경로로 들어가 GetDeviceRemovedReason을 호출합니다. DXGI_STATUS_OCCLUDED는 창이 가려진 상태이고 DXGI_ERROR_INVALID_CALL은 호출 인수나 swap chain 상태 문제이므로 같은 복구 절차로 처리하지 않습니다. 제거 사유가 DXGI_ERROR_DEVICE_HUNG이면 종료되지 않는 shader나 잘못된 GPU command를, RESET·REMOVED이면 driver reset·adapter change를 조사합니다. 복구 시 device, context, swap chain뿐 아니라 모든 buffer, texture, view, shader와 state object를 새 device에서 다시 만듭니다.
자주 틀리는 점
- Absolute 개발자 PC path를 배포 asset lookup에 남기지 않습니다.
- Device lost 뒤 이전 COM resource를 새 context에 binding하지 않습니다.
- HRESULT를 숫자만 남기지 말고 호출 위치와 제거 사유를 함께 기록합니다.
- Recovery loop가 계속 실패할 때 무한 재생성을 반복하지 않습니다.
참고 링크
3 sources