공부

디버깅 관련 고찰

ayuriK152 2025. 1. 20. 21:47

최근에는 DirectX12를 공부하면서 직접 엔진 비스무리한 것을 만들어보고 있는데.. 여간 어려운게 아니다.

일단 작성하는 코드의 양이 이전과는 차원이 다르고, 자원의 할당과 해제 등 신경써야되는 것들이 진짜 무지막지하게 많기 때문이겠다..

 

갑자기 뜬금없이 무슨소리를 하는거냐 싶겠는데.. 사건은 오늘 점심쯤부터 시작한 코드의 리팩토링 및 기능 추가 작업부터 시작했다.

오늘의 목표는 한 파일에 몰려서 작성된 코드의 모듈화와 최적화 기법인 FrameResource를 추가하는 것이었는데, 일부분 모듈화를 마치고 진행한 FrameResource 추가작업부터 무언가 꼬이기 시작했다.

 

기존의 코드의 엔진구조는 기본적으로 렌더링에 관여하는 모든 객체를 Graphic 클래스가 보유하고 관리하고 있었는데, 이를 여러 조각으로 나누면서 코드는 해석하기 쉬워진 반면 정말 엔진 밑단에서 무언가 문제가 일어났을 경우 그 원인을 찾아내는 것이 어려워졌다.

필자의 경우 매 프레임마다 호출되는 Update, Render 메소드 부분의 코드를 압축하려고 많은 노력을 하는 중인데, FrameResource를 추가하는 과정에서 카메라의 좌표를 변경해도 클라이언트에서 시점이 변경되지 않는 문제가 발생했다.

 

물론 디버깅을 진행하면서 코드에 실수를 했다는 것을 알았고 이 부분들을 고쳤지만 오브젝트가 렌더링되지 않는 더 큰 문제가 발생해버렸다. 2~3시간정도 작업한 후에 어처구니 없는 원인을 찾았는데, 초기값으로 설정해준 카메라의 좌표가 문제였다.

XMVECTOR pos = XMVectorSet(_cameraPos.x, _cameraPos.y, _cameraPos.z, 1.0f);
XMVECTOR target = XMVectorZero();
XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);

XMMATRIX view = XMMatrixLookAtLH(pos, target, up);
XMStoreFloat4x4(&_view, view);

카메라의 좌표인 pos 값을 할당하는 부분과 target이 0으로 초기화되는 부분을 주목하자. 이 카메라는 좌표가 어디던지 월드좌표계의 원점을 바라보도록 되어있는데, 웃기게도 카메라의 up 벡터는 하늘을 수직으로 바라보고 있어야한다.

이 때문에 원점에 있는 물체를 바라보고 싶은데 지나치게 카메라가 가까이 있는 경우에는 그렇지 못한 사각지대가 생겨 마치 렌더링이 되지 않는 것처럼 보인 것이다.

참고로 디버깅당시 초기값은 -5.0f, 5.0f, 0.0f 였다.

 

결국에 무슨말을 하고 싶은거냐면, 디버깅을 할 때는 코드 자체의 문제가 아니라 파라미터에도 문제가 있지는 않은지 넓은 관점에서 바라봐야 한다는 것이다.

앞서 설명한 문제를 디버깅하면서 실직적인 엔진 코드의 수정도 진행되었지만 이미 문제가 해결되었음에도 문제가 해결되지 않은 것처럼 보이기 때문에 시간을 낭비하게 되는 비효율적인 일이 발생하기 때문이다.

 

여담이지만 좌표의 문제인지 모르고 갑자기 오브젝트가 눈앞에 렌더링 되었을 때의 공포감은 이루 말할 수 없다.. 버그를 해결했는데 그 이유를 모른다니

아무래도 앞으로는 입력값에 대한 검증도 더 세심하게 이뤄질듯 싶다..