• 방향
    • 원시 포인터(raw pointer)들의 메모리를 해제하는 일은 휴먼에러가 있기 마련.
    • 모두 스마트 포인터로 변경하자.
    • DirectX 함수들에서 사용하는 변수들은 Dx 전용 포인터 ComPtr을 이용


  • 변수 선언
    • 변경 전

    image

    • 변경 후

    image


  • 함수
    • 변경 전

    image

    • 변경 후

    image


  • 호출 (중요)
    • 변경 전

    image

    • 변경 후

    image

    • ComPtr 변수를 포인터에 넘길 때 ‘&’ 를 없애고 .Get() 으로 변경
    • 더블 포인터에 넘길 때는 .GetAddressOf() 를 사용


  • 버그 발생
    • 렌더링이 안 되는 버그


  • 디버깅 방법
    • 그래픽 진단 디버깅

    • 정상 디버깅 화면

    image

    • 오류 디버깅 화면

    image


  • 검증

    • 정상 디버깅 화면

    image

    • 오류 디버깅 화면

    image

    • 픽셀 셰이더, 샘플러 상태 등에서 정상일 때와 비교해 배열이 생성이 안 되어 있었음


  • 코드 확인

    image image image image

    • 픽셀 셰이더 hlsl로 넘겨주는 코드와 샘플러 상태 코드를 조사한 결과,
    • 스마트 포인터 사용 시 레퍼런스(&)를 사용 중인 미비된 곳 발견
    • ComPtr 사용 시 & 를 인자로 넘기면 렌더링 되지 않음을 이해함
    • .Get(), .GetAddressOf()로 모두 교체



  • 일반 스마트 포인터

    • 일반 포인터들은 shared_ptr, unique_ptr 중 적절히 선택

    • 스마트 포인터 배열 (C++.17)

    image

    • C++17 에서 도입된 shared_ptr 의 배열 생성 방식을 적극 사용함



  • 미비된 사항

    • 부모 Matrix 포인터
      • 게임 오브젝트(액터)들이 부모의 SRT를 받는 Matrix* p 멤버를 가지고 있는데,
      • 스마트 포인터로 변경할 시 렌더링이 안된다.
      • part 2에서 다시 도전
    • fmod 포인터
      • fmod 함수 이용 시 shared_ptr을 더블 포인터로 변경해줘야 하는데 잘 안 됐다.
      • part 2에서 다시 도전

댓글남기기