[DirectX 11] 원시 포인터를 스마트 포인터로 바꾸자. part 1. (ComPtr, shared_ptr, unique_ptr)
- 방향
- 원시 포인터(raw pointer)들의 메모리를 해제하는 일은 휴먼에러가 있기 마련.
- 모두 스마트 포인터로 변경하자.
- DirectX 함수들에서 사용하는 변수들은 Dx 전용 포인터 ComPtr을 이용
- 변수 선언
- 변경 전
- 변경 후
- 함수
- 변경 전
- 변경 후
- 호출 (중요)
- 변경 전
- 변경 후
- ComPtr 변수를 포인터에 넘길 때 ‘&’ 를 없애고 .Get() 으로 변경
- 더블 포인터에 넘길 때는 .GetAddressOf() 를 사용
- 버그 발생
- 렌더링이 안 되는 버그
- 디버깅 방법
-
그래픽 진단 디버깅
-
정상 디버깅 화면
- 오류 디버깅 화면
-
-
검증
- 정상 디버깅 화면
- 오류 디버깅 화면
- 픽셀 셰이더, 샘플러 상태 등에서 정상일 때와 비교해 배열이 생성이 안 되어 있었음
-
코드 확인
- 픽셀 셰이더 hlsl로 넘겨주는 코드와 샘플러 상태 코드를 조사한 결과,
- 스마트 포인터 사용 시 레퍼런스(&)를 사용 중인 미비된 곳 발견
- ComPtr 사용 시 & 를 인자로 넘기면 렌더링 되지 않음을 이해함
- .Get(), .GetAddressOf()로 모두 교체
-
일반 스마트 포인터
-
일반 포인터들은 shared_ptr, unique_ptr 중 적절히 선택
-
스마트 포인터 배열 (C++.17)
- C++17 에서 도입된 shared_ptr 의 배열 생성 방식을 적극 사용함
-
-
미비된 사항
- 부모 Matrix 포인터
- 게임 오브젝트(액터)들이 부모의 SRT를 받는 Matrix* p 멤버를 가지고 있는데,
- 스마트 포인터로 변경할 시 렌더링이 안된다.
- part 2에서 다시 도전
- fmod 포인터
- fmod 함수 이용 시 shared_ptr을 더블 포인터로 변경해줘야 하는데 잘 안 됐다.
- part 2에서 다시 도전
- 부모 Matrix 포인터
댓글남기기