DirectX9 デバイス消失の処理について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
T-ARCs
記事: 4
登録日時: 5年前

DirectX9 デバイス消失の処理について

#1

投稿記事 by T-ARCs » 5年前

デバイス消失の処理が上手くいかず困っております。

D3DPOOL_DEFAULT を指定して作った
テクスチャ、サーフェイスの
リソースの開放は行いました。

D3DPRESENT_PARAMETERS 構造体の中身も
一通りは目を通しました。
作成した時のままの筈なので、関係はないと思いましたが。

これ以外で、IDirect3DDevice9::Resetが
D3DERR_INVALIDCALLを返す
要因はあるのでしょうか?

どなたか、ご存知でしたらお願いしますm(_ _)m

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: DirectX9 デバイス消失の処理について

#2

投稿記事 by ISLe » 5年前

ソースコードがないのでまったくの想像ですが、スレッドコンテキストが一致していないとか。

例えば、メッセージループを回しているところと、ウィンドウプロシージャの中はコンテキストが異なるので、デバイスの作成がメッセージループを回しているところにあって、ウィンドウプロシージャの中でResetを呼び出しているような場合、機能しません。

入門者向けの解説とかで、ウィンドウプロシージャの中でいろいろやってるものがありますけど、ある程度大きなプログラムになると確実にハマるので注意が必要です。

アバター
T-ARCs
記事: 4
登録日時: 5年前

Re: DirectX9 デバイス消失の処理について

#3

投稿記事 by T-ARCs » 5年前

コメントありがとうございます。

ソースコードがなくてすみませんm(_ _)m

ただ、そうでもなさそうです。
クラスのコンストラクタの中ですべて行っております。
(これ自体には問題があるとは思えないのですが……)

何故か、症状が変わり、一部のテクスチャだけ復帰できているようなのですが
今度は途中でフリーズしたようになっており
未だに、解決には及んでおりません。
(このあたり、自分でもう一度見直したほうが良いところもあると思っております)

過去に確かにウィンドウプロシージャの問題で、似たような症状に陥ったこともあったので
配慮したつもりではありました。

ウィンドウプロシージャは作っているだけで一切使っておりません。

●WinMainがこのような感じです。(動的に確保して、開放するだけ)

コード:

int WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
  		   LPTSTR CmdLine ,int nCmdShow){
	class CApplication * pApp = new CApplication(APPLICATION_TITLE,hInstance,nCmdShow,0,0,WINDOW__WIDTH,WINDOW__HEIGHT);
	delete pApp;
	return 0;
}
●クラスCApplication内に以下のようなforメッセージループがあります

コード:

  	for(;;)
  	{
		m_fps.FPSRegular();
		if(m_fps.GetDrawFlag())
		{
			(this->*Render_Routine)();
		}
		if(this->ProcessMessage()==-1)
		{
			break;
		}
	}
●レンダリング処理

コード:

VOID CApplication::Render()
{
  		if(IsKeyDown(VK_ESCAPE)){exit(0);}
  		if(IsKeyDown_Ctrl_C())
  		{
			m_dxg.GetBackBuffer(0);
			if(!m_dxg.SaveSurfaceW(0 , L"img\\キャプチャ.png"))
			{m_process.InfoMsgW(L"文字付きで保存");}
			DX_RELEASE(m_dxg.m_pSurface[0]);
  		}
	if (SUCCEEDED(m_dxg.m_pd3dDevice->BeginScene()))       // シーンの描画開始
	{
		m_pSceneManager->Control();
		m_dxg.m_pd3dDevice->EndScene();                   // シーンの描画終了
	}
	
    // シーンの表示=フリップ
	m_hr = m_dxg.m_pd3dDevice->Present(NULL, NULL, NULL, NULL);
	
	if(m_hr == D3DERR_DEVICELOST)
	{
		Render_Routine = DeviceLost;
	}
	
	return;
}
●そして、デバイスの消失処理です

コード:

VOID CApplication::DeviceLost()
{
		m_dxg.m_pSprite->OnLostDevice();
		for(int i=0;i<MAX_FONT_NUM;i++)m_dxg.m_pFont[i]->OnLostDevice();
		for(int i=0;i<MAX_SURFACE_NUM;i++)DX_RELEASE(m_dxg.m_pSurface[i]);
		for(int i=0;i<MAX_TEXTURE_NUM;i++)DX_RELEASE(m_dxg.m_pTexture[i]);

		if(m_dxg.m_pd3dDevice->TestCooperativeLevel()==D3DERR_DEVICENOTRESET)
		{
			switch(m_dxg.m_pd3dDevice->Reset(&m_dxg.m_d3dpp))
			{
			case D3D_OK:
				m_dxg.m_pSprite->OnResetDevice();
				for(int i=0;i<MAX_FONT_NUM;i++)m_dxg.m_pFont[i]->OnResetDevice();

/////////////////////////////////////////////////////////////////////////////////////////
//このLoadSettingsで設定用テキストファイルを読み込みに行き、テクスチャとサーフェイスを構築
				LoadSettings();
////////////////////////////////////////////////////////////////////////////////////////
				Render_Routine = Render;
			break;
			case D3DERR_DEVICELOST:
				m_process.InfoMsgW(L"デバイス消失状態(復帰できない)");
			break;
			case D3DERR_DRIVERINTERNALERROR:// 内部ドライバーエラー(アプリケーションはシャットダウンしなければならない)
				MessageBoxW(NULL,L"内部ドライバエラー",L"DEBUG",MB_OK);
			break;
			case D3DERR_OUTOFVIDEOMEMORY:
				m_process.InfoMsgW(L"DirectXメモリ不足");
			break;
			case E_OUTOFMEMORY:
				m_process.InfoMsgW(L"DirectXメモリ不足");
			break;
			case D3DERR_INVALIDCALL:
			break;
			case D3DERR_DEVICEREMOVED:
				MessageBoxW(NULL,L"ハードウェアアダプターが無効",L"DEBUG",MB_OK);
			break;
			default:
				MessageBoxW(NULL,L"その他のエラー",L"DEBUG",MB_OK);
			break;
			}
		}
		return;
}

アバター
T-ARCs
記事: 4
登録日時: 5年前

Re: DirectX9 デバイス消失の処理について

#4

投稿記事 by T-ARCs » 5年前

(説明的で蛇足かも知れませんが)

Render_Routineのメンバ関数ポインタを
RenderとDeviceLostで切り替えてます。

返信

“C言語何でも質問掲示板” へ戻る