디바이스 소실 DeviceLost

Programming/DirectX|2016. 9. 25. 11:02
반응형


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로 생성된 리소스 생성

반응형

댓글()