디바이스 소실 DeviceLost
DirectX9의 디바이스 소실
우리가 게임이나 기타 윈도우창 실행 후 전체화면에서 알트텝을 누르고
다시 활성화하면 디바이스 소실이 일어나는데 그 때 몇 개의 작업을 해주어야 된다.
디바이스 소실이 일어나는 경우는
1. 전체화면에서 알트텝을 누를 경우
2. 윈도우모드에서 절전모드에 들어갈 경우(화면보호기같은 거)
이 두가지가 있다.(더 있는지는 잘 모르겠음)
DirectX9에서 랜더링 구조(2D)
디바이스 Clear() ↓ 어쩌구저쩌구(Sprite->Begin(), Draw(), End()) ↓ 디바이스 EndScene() ↓ 디바이스 Present () |
이런 식의 호출 순서가 있는데
디바이스 소실은 Present의 리턴값에서 처리를 해주게된다.
- 코드
if( 디바이스->Present(NULL, NULL, NULL, NULL) == D3DERR_DEVICELOST) DeviceLost(); HRESULT DeviceLost() { HRESULT hr = 디바이스->TestCooperativeLevel(); if( hr == D3DERR_DEVICELOST ) { return E_FAIL; } else if( hr == D3DERR_DEVICENOTRESET ) { if( 스프라이트변수 ) release( 스프라이트 변수 );
hr = 디바이스->Reset( &D3DPRESENT_PARAMETERS구조체 ); switch( hr ) { // Reset함수 결과값 에러들 } if( FAILED( D3DXCreateSprite( 디바이스, &스프라이트변수 ) ) ) // 스프라이트 다시 생성 { // 스프라이트 다시 생성 에러 } return S_OK; } return E_FAIL; } |
디바이스 소실이 될 경우 TestCooperativeLevel();함수를 호출해 리턴값을 알아낸다.
알트텝이 될 경우는 보통 D3DERR_DEVICELOST에 들어오게 되다가
다시 창을 활성화를 시키면 D3DERR_DEVICENOTRESET에 들어오게된다.
아주 중요한 거
다시 복구할 때 다이렉트와 디바이스는 그대로 두고 D3DPOOL_DEFAULT로
생성한 리소스들만 해제를 시켜주고 다시 생성해준다.
D3DPOOL_DEFAULT이나 D3DPOOL_MANAGED같은 걸 넣어서 생성해준 텍스쳐가 있다고 하면
D3DPOOL_MANAGED를 이용한 텍스쳐는 Release와 생성을 다시 할 필요가 없다.
그렇지만 D3DPOOL_DEFAULT를 사용한 텍스쳐는 해제 후 생성해줘야된다.
또 진짜 중요한 것 중 하나는
LPD3DSPRITE변수를 생성하고 쓰고 있었다면 스프라이트는 해제 후 생성해줘야된다.
스프라이트를 릴리즈 안시키고 디바이스->리셋함수를 호출했더니 계속 반환값이 D3DERR_INVALIDCALL였다.
스프라이트와 D3DPOOL_DEFAULT로 생성한 리소스를 해제 후 디바이스->Reset함수를 호출해준다.
이 때 Reset함수의 인자값에는 게임을 처음으로 실행 시 디바이스 생성하는 부분에
D3DPRESENT_PARAMETERS구조체에 정보를 넣어서 디바이스를 셋팅했을 것이다.
(윈도우모드, 백버퍼갯수 등등)
이 구조체를 멤버변수화 시켜서 기억해놓은 다음의 주소값을 넣어준다.
한꺼번에 정리하자면
1. Present에서 디바이스 소실 체크
2. 복구 가능 할 때 체크해서 복구 시작
3. LPD3DSPRITE 및 D3DPOOL_DEFAULT로 생성된 리소스 해제
4. LPDIRECT3DDIVECE9->Reset함수 호출
(인자값은 D3DPRESENT_PARAMETERS구조체)
5. 해제했던 LPD3DSPRITE 및 D3DPOOL_DEFAULT로 생성된 리소스 생성
'Programming > DirectX' 카테고리의 다른 글
[c#] directX 연동 및 툴 만들기 - 1 (3) | 2017.12.15 |
---|---|
DirectX7 Blt함수 (0) | 2016.11.09 |
게임 벡터, 벡터 덧셈, 뺄셈, 크기, 단위 벡터 (0) | 2016.11.02 |
랜더링파이프라인의 정의 (0) | 2016.10.31 |
DirectX9 SDK 설치법 및 코드적용 (0) | 2016.10.14 |