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 |
댓글