pp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 그냥 되는데로 화면을 갱신한다
pp.BackBufferFormat = D3DFMT_UNKNOWN; // 창 모드. 기존 윈도우 데스크탑 화면형식을 따른다
3. 기타 초기화 & 게임프로그래밍 루프
① API프로그래밍과 달리 게임프로그래밍은 윈도우 핸들러에서
while( WM_QUIT != msg.message )로 종료직전까진 루프가 계속 돌아가게 해야한다.
② WinMain()의 처리 순서도D3d::InitD3D // Direct3D 초기화, 해상도 등 지정Setup() // 사용자 객체의 초기화 D3D::EnterMsgLoop() // 메시지 루프는 강제 종료까지 무한히 반복Cleanup() // 사용자 객체의 종료Devicerelease // Direct3D 객체 해제
③ 그래픽 처리 3단계
Device→Clear // 먼저 화면을 지운다
(Drawing) // 그림을 그린다
Device→Present // 화면을 표시한다(Swap 방식에 의해서)
4. Lost Device
① 원리
-> Full Screen Mode에서 ALT+TAB을 눌러 Task를 전환하면,
윈도우는 자동적으로 응용 프로그램에 대한 전환 처리를 시행.
이때 다시 ALT+TAB을 눌러 원래의 3D 어플리케이션 복구하려면 오류가 발생된다.
이 원인은 3D 카드의 설정이 최초 ALT+TAB시 비 Direct3D 응용 프로그램을 위해 설정 변화가 일어났기 때문
② 대책
-> 어플리케이션에서 현재 그래픽 카드의 상태를 확인하고 있다가, 복구시점에서 Device를 Reset하면 된다
③ 복구검사
IDirect3DDevice::TestCooperativeLevel()을 호출하여, 디바이스를 복구 할 수 있는지 검사
-> 반환값(HRESULT)이 D3DERR_DEVICELOST인 경우 디바이스가 소실되었고 아직 복구할 수 없는 상태.
복구할 수 있을 때 까지 대기한다.
-> D3DERR_DEVICENOTRESET인 경우 디바이스가 소실되지만 지금 복구할 수 있는 상태이다. 디바이스를 복구한다.
④ 복구절차
-> D3DPOOL_DEFAULT로 잡은 리소스들을 전부 릴리즈한다.
(안그러면 다음에 호출될 IDirect3DDevice::Reset()이 실패할것이다)
-> IDirect3DDevice::Reset()을 호출한다.
(Reset()을 그냥 IDirect3DDevice의 복구 명령어라 생각하면 이해가 편함)