DX9 锁屏后, Reset设备还原失败

robert_duan 2015-01-21 10:36:09
Reset还原失败, 返回值: D3DERR_DEVICELOST
网上百度查了一下, 大部分说的是D3DPOOL_DEFAULT没有释放或者没有释放干净.

我看了一下代码, 在D3DPOOL_DEFAULT池中创建的都释放了,但还是锁屏后 设备还原失败, 难道还有其他原因么?




求各位大虾指点!
...全文
422 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
显示部分怎么写的?backbuffer有没有release?
猿说编程 2015-06-24
  • 打赏
  • 举报
回复
楼主问题解决了吗
向立天 2015-03-07
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
robert_duan 2015-01-21
  • 打赏
  • 举报
回复
这是相关代码, 看看是否有什么问题 /// 初使化D3D HRESULT InitD3D() { // 创建D3D顶层指针 FAILED--失败 SUCCEEDED -- 成功 HRESULT hRet; if (NULL == (m_pD3D = Direct3DCreate(D3D_SDK_VERSION))) { return E_FAIL; } // 想要给结构体赋值,要得到当前显卡的显示模式 D3DDISPLAYMODE d3dpp; m_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT,//主显卡 &d3dpp ); // 创建设备需要一个结构体 // 清空结构体 ZeroMemory(&m_d3dmm,sizeof(m_d3dmm)); m_d3dmm.Windowed = TRUE; // 窗口模式(TRUE)与全屏模式(FALSE)的设置 // 交换后把后台清空 m_d3dmm.SwapEffect = D3DSWAPEFFECT_DISCARD; // 前台与后台交换后的方式 m_d3dmm.BackBufferFormat=d3dpp.Format; // 设置显卡的模式与后台一致 m_d3dmm.EnableAutoDepthStencil = TRUE; m_d3dmm.AutoDepthStencilFormat = D3DFMT_D16; hRet = m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, // 创建在主显卡中 D3DDEVTYPE_HAL , // 设备类型,硬件抽象层 D3DDEVTYPE_REF D3DDEVTYPE_HAL D3DDEVTYPE_SW m_hwnd, // 当前窗口句柄 D3DCREATE_HARDWARE_VERTEXPROCESSING,// D3DCREATE_SOFTWARE_VERTEXPROCESSING,//顶点处理方式--软件处理 D3DCREATE_HARDWARE_VERTEXPROCESSING--硬件处理 &m_d3dmm, // 结构体 &m_pDev // 设备指针 ); if (FAILED(hRet)) { Log("硬件方式失败,采用软件方式处理"); hRet = m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, // 创建在主显卡中 D3DDEVTYPE_HAL , // 设备类型,硬件抽象层 D3DDEVTYPE_REF D3DDEVTYPE_HAL D3DDEVTYPE_SW m_hwnd, // 当前窗口句柄 D3DCREATE_SOFTWARE_VERTEXPROCESSING,//D3DCREATE_SOFTWARE_VERTEXPROCESSING,//顶点处理方式--软件处理 D3DCREATE_HARDWARE_VERTEXPROCESSING--硬件处理 &m_d3dmm, // 结构体 &m_pDev // 设备指针 ); } if (FAILED(hRet)) { switch(hRet) { case D3DERR_DEVICELOST: Log("D3D初始化失败——D3DERR_DEVICELOST"); break; case D3DERR_INVALIDCALL: Log("D3D初始化失败——D3DERR_INVALIDCALL"); break; case D3DERR_NOTAVAILABLE: Log("D3D初始化失败——D3DERR_NOTAVAILABLE"); break; case D3DERR_OUTOFVIDEOMEMORY: Log("D3D初始化失败——D3DERR_OUTOFVIDEOMEMORY"); break; default: Log("D3D初始化失败——未知错误"); break; } MessageBox(NULL, TEXT("D3D加速功能被禁用,请执行dxdiag开启D3D加速功能,或重新安装DirectX。"), TEXT("提示"), MB_OK | MB_ICONINFORMATION ); return E_FAIL; } return S_OK; } // 设备丢失还原 HRESULT OnResetDevice() { // 释放D3DPOOL_DEFAULT所有相关资源 OnDeviceLost(); RECT rcClient; GetClientRect(m_hwnd, &rcClient); int h = rcClient.bottom - rcClient.top; int w = rcClient.right - rcClient.left; if (w == 0 || h == 0) { } else { m_d3dmm.BackBufferWidth = w; m_d3dmm.BackBufferHeight = h; } D3DDISPLAYMODE ddpm2; #ifdef _GAME_DX8 m_pDev->GetDisplayMode(&ddpm2); #else m_pDev->GetDisplayMode(0, &ddpm2); #endif // 想要给结构体赋值,要得到当前显卡的显示模式 D3DDISPLAYMODE ddpm; m_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, // 主显卡 &ddpm ); m_d3dmm.BackBufferFormat = ddpm.Format; m_d3dmm.hDeviceWindow = m_hwnd; ShowWindow(m_hwnd, SW_SHOW); /// 重置设备 HRESULT hr = m_pDev->Reset(&m_d3dmm); if (FAILED(hr)) { int nErr = 0; switch(hr) { case D3DERR_NOTFOUND: nErr = 1; break; case D3DERR_MOREDATA: nErr = 2; break; case D3DERR_DEVICELOST: nErr = 3; break; case D3DERR_DEVICENOTRESET: nErr = 4; break; case D3DERR_NOTAVAILABLE: nErr = 5; break; case D3DERR_OUTOFVIDEOMEMORY: nErr = 6; break; case D3DERR_INVALIDDEVICE: nErr = 7; break; case D3DERR_INVALIDCALL: nErr = 8; break; case D3DERR_DRIVERINVALIDCALL: nErr = 9; break; default: break; } log("OnDeviceLost 调用时m_pDev->Reset调用失败, Error(%d)", nErr); return hr; } /// 重新创建资源, 恢复场景 return S_OK; }
robert_duan 2015-01-21
  • 打赏
  • 举报
回复
现在出现这个D3DERR_INVALIDCALL错误了! 参数有错么?
Saleayas 2015-01-21
  • 打赏
  • 举报
回复
// The device has been lost but cannot be reset at this time. // So wait until it can be reset.

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧