2007年09月02日

DirectX 9: デバイスがロストした時の復旧方法

DirectX 9にで、フルスクリーンからウィンドウへ戻ったときや、非アクティブ状態から復帰した場合に、デバイスの再構築が必要となる。

DirectX 8にて解説を行っているサイトでは、単純にReset()を呼べば良いと書かれているが、どうも上手くいかないので色々調べてみたところ、どうやら「ロストしたデバイスをリセットできない状態」というタイミングが存在するらしく、適切な関数でリセットできる状態かどうかを調べる必要があるらしい。以下にその手順を示す

if(DeviceLost){
  if(FAILED(hr = pDevice->TestCooperativeLevel())){
    if(hr == D3DERR_DEVICENOTRESET){
      //デバイスのリセットを行う処理を書く。具体的には
      //pDevice->Reset(&d3dpp)
      //を呼び出してリセットを行うが、当然d3dppはDirect3Dを
      //初期化するときに記述した形でもう一度記述を行う。
    }
  }else{
    DeviceLost  = false;
  }
}else{
  if(FAILED(pDevice->Present( NULL, NULL, NULL, NULL ))){
    DeviceLost  = true;
  }
}

まず、ロストするとPresent()が失敗するので、それをチェックする。次にTestCooperativeLevel()でデバイスをリセットできるかどうか確認を行う。もしTestCooperativeLevel()の戻り値がD3DERR_DEVICENOTRESETであれば、ロストしたデバイスの復旧が可能となり、Reset()が可能となる。


×

この広告は180日以上新しい記事の投稿がないブログに表示されております。