ページ 11

DirectX9のデバイス消失で、Reset関数が失敗する

Posted: 2015年7月01日(水) 22:21
by skn
デバイスロストの対応をしているのですが、pDevice->Resetで何故かD3D_OK以外が帰ってきてしまいます。

コード:

//メインループ
void Roop(void (*GameFunc)() )
{
	//初期化
    ZeroMemory(&msg, sizeof(msg) );

    while( msg.message!=WM_QUIT )
	{
		if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
	    {
			TranslateMessage( &msg );
			DispatchMessage( &msg );
	    }
	    else
		{
			//画面クリーン
			pDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(55,255,255), 1.0f, 0 );
			//メイン処理
			GameFunc();

			//デバイスロストしてたら対応
			if( pDevice->Present( NULL, NULL, NULL, NULL ) == D3DERR_DEVICELOST)
			{
				DeviceLost();
			}
		}
	}
}

//デバイスロスト対応
void DeviceLost()
{
	//ダメならまたループ
	if(pDevice->TestCooperativeLevel() == D3DERR_DEVICELOST)
	{
		return;
	}
	//復帰できる場合

	//1.リソースの解放
	ResourceAllRelease();

	//2.デバイスリセット(戻り値が D3D_OK 以外の場合、復元出来ないので終了)
	if(pDevice->Reset(&d3dpp) != D3D_OK)
	{
		DebugBox("デバイスのリセットに失敗しました");
		PostQuitMessage(0);
		return;
	}

	//3.リソースの再生成
	ResourceAllReload();
}
DeviceLost関数内の「2.デバイスリセット」の部分です。

d3dppはグローバル変数として既に設定されています。というか、怪しかったので新しく作ってそれをReset()に渡すということもしてみましたが、それでもダメでした。
リソースの解放に漏れはありませんでした。まだ作り始めたばかりでリソースはスプライトとテクスチャしかなく、何度確認してもその二つとも解放しています。

どなたかわかる方よろしくお願いします。

Re: DirectX9のデバイス消失で、Reset関数が失敗する

Posted: 2015年7月02日(木) 00:44
by milla
ただ単にデバイスロストをなくしたいなら、
Direct3D9Ex使ったらフォーカスが失われることによるデバイスロストがなくなりますよ。

Re: DirectX9のデバイス消失で、Reset関数が失敗する

Posted: 2015年7月02日(木) 19:37
by skn
再度確認してみたところ、リソースの解放の方にミスがあったようです。
そちらを修正したら問題なく動きました。

お騒がせして、大変申し訳ありませんでした。