본문 바로가기
TIL

[TIL] 20221101 성장일지

by 마두식 2022. 11. 1.
반응형
C/C++
  • 복사생성자

-  어떤 클래스 T에 대해 아래와 같이 정의됨.

T(const T& a); 

=>  다른 T의 객체 a를 상수 레퍼런스로 받는다.


-  복사 생성자는 오직 '생성' 시에만 호출된다

T b;
T a = b;

T b;
T a;
a = b;
위의 두 코드는 다른 것이다. 아래는 생성자만 호출되고 a에 b를 대입하는 연산이 발생하는 것 뿐이다.


-  C++ 컴파일러는 디폴트 복사 생성자를 지원한다.

=>  디폴트 생성자나 디폴트 소멸자가 하는 일이 아무 것도 없었던 것과 달리 디폴트 복사 생성자는 실제로 '복사'를 해준다.
=>  간단한 클래스의 경우 귀찮게 복사 생성자를 써주지 않고도 디폴트 복사 생성자만 이용해서 복사 생성을 쉽게 처리할 수 있다.


-  깊은 복사와 얕은 복사 (포인터 변수에 대한 복사 처리의 차이)

=>  디폴트 복사 생성자는 얕은 복사만 가능하므로 깊은 복사가 필요한 경우 사용자가 직접 복사 생성자를 만들어야 한다.

 

  • 초기화리스트(Initializer list)

-  초기화리스트는 멤버변수 이름과 생성자의 매개변수 이름이 같아도 된다.

=>  바깥쪽 변수는 무조건 멤버 변수를 지칭하게 되고 괄호 안의 변수는 원칙상 생성자가 인자로 받은 변수를 우선적으로 지칭하는 것이기 때문이다.


-  초기화리스트는 생성과 동시에 초기화가 되는 것이고, 일반 생성자는 생성을 먼저 하고 그 다음에 대입을 하는 것이다.

=>  초기화리스트를 이용하는 게 조금 더 효율적이다.
=>  반드시 생성과 동시에 초기화 되어야 하는 것들이 있다(ex: 레퍼런스와 상수)

 

  • const

-  중요한 값들을 상수로 처리하는 것이 좋다

=>  다른 프로그래머가 해당 클래스를 사용하면서 실수로 해당 값을 변경하는 명령을 집어넣더라도 컴파일 오류가 발생하여 훨씬 효율적으로 오류를 발견할 수 있기 때문이다.

 

  • 전역변수의 경우 프로젝트의 크기가 커질수록 프로그래머의 실수로 인해 서로 겹쳐서 오류가 날 가능성이 높으므로 꼭 필요한 경우가 아니면 사용하지 않는다.

 

 

 

DirectX 11
  • 교재의 모든 예제 응용 프로그램은 일관되게 D3DApp의 다섯 가상 함수를 재정의한다.

-  다섯 가상 함수는 특정 예제에 고유한 코드를 구현하는 데 쓰인다.
-  초기화 코드나 메시지 처리 등이 D3DApp 클래스에 구현되어 있으므로 응용 프로그램을 위한 파생 클래스는 응용 프로그램에 필요한 구체적인 코드에만 집중할 수 있다.

 

  • 프레임을 렌더링하는 데 걸린 평균 시간인 프레임당 시간, 줄여서 프레임 시간은 FPS와는 다른 수량이다.

-  실무에서는 프레임 시간이 FPS보다 훨씬 유용하다.
-  장면을 변경했을 때 한 프레임을 렌더링하는 데 걸리는 시간이 얼마나 늘거나 주는지를 직관적으로 알 수 있기 때문이다.

 

  • WM_SIZE 메시지 처리 시 주의사항

-  사용자가 크기 조정 테두리를 끄는 동안에는 WM_SIZE 메시지가 계속 전달되며, 이럴 때마다 버퍼를 계속해서 갱신하는 것은 바람직하지 않다.
-  사용자가 크기 조정 테두리를 끄는 동안에는 아무 일도 하지 않다가, 끌기를 멈추면 실제로 버퍼들을 갱신해야 한다.
-  이를 위해 WM_EXITSIZEMOVE 메시지를 처리한다.
-  WM_EXITSIZEMOVE : 사용자가 크기 변경 테두리를 놓으면 발생한다.

 

  • GET_X_LPARAM 매크로와 GET_Y_LPARAM 매크로를 사용하려면 반드시 #include <Winodwsx.h>가 필요하다.

 

  • 응용 프로그램이 생성한 IDXGISwapChain 인터페이스는 자동으로 Alt-Enter 키 조합을 인식해서 응용 프로그램을 전체화면 ↔ 창 모드로 전환한다.

-  모드 전환에 의해 응용 프로그램의 창 크기가 변하면 WM_SIZE 메시지가 전달된다.
-  DirectX 9에서 다루던 장치 소실 문제는 DirectX 11에서는 발생하지 않는다.

 

  • 디버깅(4.5장 151p)

-  d3dUtil.h에 매크로를 이용하여 제공됨
-  dxerr.h 헤더파일에 오류처리에 관련된 함수가 정의되어 있음

( HRESULT WINAPI DXTraceW( _In_z_ const WCHAR* strFile, _In_ DWORD dwLine, _In_ HRESULT hr, _In_opt_ const WCHAR* strMsg, _In_ bool bPopMsgBox ); )


-  마지막 매개변수인 bPopMsgBox를 false로 하면 메시지 상자 대신 메시지 정보가 Visual C++ 출력창에 출력된다.
-  또한 이런 오류처리는 함수가 아닌 매크로로 해야만 한다.

=>  함수로 정의하면 오류 발생시, 오류가 발생한 파일과 행번호를 가리키는게 아니라 그 함수가 구현된 파일과 행번호를 가리키기 때문이다.


-  사용법은 간단하다. HRESULT를 돌려주는 Direct3D의 호출을 HR(x) 여기의 x 자리에 대신 넣어주기만 하면 된다.
-  이런 오류 처리 방식이 예제에서는 잘 맞지만, 실제 응용 프로그램이라면 프로그램 출시 이후 발생할 수 있는 오류들(하드웨어 미지원, 파일 누락 등등)도 적절히 처리할 수 있어야 한다.

 

 


 

 

 

  • 예제 프로그램 Alt-Enter 문제 발생

Alt-Enter를 누르면 이상한 가로 줄이 생기면서 왔다갔다함.
책 내용상 이런 문제가 발생하면 안되는 것 같은데 발생하는 이유를 모르겠음
프레임워크 코드 뜯어 보면서 해결해볼 예정.

반응형

'TIL' 카테고리의 다른 글

[TIL] 20221103 성장일지  (0) 2022.11.03
[TIL] 20221102 성장일지  (0) 2022.11.02
[TIL] 20221028 성장일지  (0) 2022.10.28
[TIL] 20221026 성장일지  (0) 2022.10.26
[TIL] 20221025 성장일지  (0) 2022.10.25

댓글