デバイス消失の処理が上手くいかず困っております。
D3DPOOL_DEFAULT を指定して作った
テクスチャ、サーフェイスの
リソースの開放は行いました。
D3DPRESENT_PARAMETERS 構造体の中身も
一通りは目を通しました。
作成した時のままの筈なので、関係はないと思いましたが。
これ以外で、IDirect3DDevice9::Resetが
D3DERR_INVALIDCALLを返す
要因はあるのでしょうか?
どなたか、ご存知でしたらお願いしますm(_ _)m
DirectX9 デバイス消失の処理について
Re: DirectX9 デバイス消失の処理について
ソースコードがないのでまったくの想像ですが、スレッドコンテキストが一致していないとか。
例えば、メッセージループを回しているところと、ウィンドウプロシージャの中はコンテキストが異なるので、デバイスの作成がメッセージループを回しているところにあって、ウィンドウプロシージャの中でResetを呼び出しているような場合、機能しません。
入門者向けの解説とかで、ウィンドウプロシージャの中でいろいろやってるものがありますけど、ある程度大きなプログラムになると確実にハマるので注意が必要です。
例えば、メッセージループを回しているところと、ウィンドウプロシージャの中はコンテキストが異なるので、デバイスの作成がメッセージループを回しているところにあって、ウィンドウプロシージャの中でResetを呼び出しているような場合、機能しません。
入門者向けの解説とかで、ウィンドウプロシージャの中でいろいろやってるものがありますけど、ある程度大きなプログラムになると確実にハマるので注意が必要です。
Re: DirectX9 デバイス消失の処理について
コメントありがとうございます。
ソースコードがなくてすみませんm(_ _)m
ただ、そうでもなさそうです。
クラスのコンストラクタの中ですべて行っております。
(これ自体には問題があるとは思えないのですが……)
何故か、症状が変わり、一部のテクスチャだけ復帰できているようなのですが
今度は途中でフリーズしたようになっており
未だに、解決には及んでおりません。
(このあたり、自分でもう一度見直したほうが良いところもあると思っております)
過去に確かにウィンドウプロシージャの問題で、似たような症状に陥ったこともあったので
配慮したつもりではありました。
ウィンドウプロシージャは作っているだけで一切使っておりません。
●WinMainがこのような感じです。(動的に確保して、開放するだけ)
●クラスCApplication内に以下のようなforメッセージループがあります
●レンダリング処理
●そして、デバイスの消失処理です
ソースコードがなくてすみません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;
}
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;
}
Re: DirectX9 デバイス消失の処理について
(説明的で蛇足かも知れませんが)
Render_Routineのメンバ関数ポインタを
RenderとDeviceLostで切り替えてます。
Render_Routineのメンバ関数ポインタを
RenderとDeviceLostで切り替えてます。