|
|
发表于 2009-3-11 09:19:00
|
显示全部楼层
Re:关于程序失去焦点之后IDiretcInput8无法恢复的问题
是不是白板了?
那不是DINPUT的问题吧
DX9全屏模式一切换就会设备丢失,
你得把那些POOL_DEFAULT保存的全部release掉
然后全部再create
这个是我以前对这个问题写的记录
Render();
hr=g_pD3DDevice->TestCooperativeLevel();
while(hr==D3DERR_DEVICELOST)
{
beforeResetVertex();
if(hr!=D3DERR_DEVICENOTRESET)
{
Sleep(1000);
hr=g_pD3DDevice->TestCooperativeLevel();
}
if(FAILED(g_pD3DDevice->Reset(&d3dpp)))
{
hr=D3DERR_DEVICELOST;
}
else
{
resetVertex();
g_pD3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
}
}
对于是模型资源创建类型是SYSTEMMEM等类型的,不需要去理会他,因为系统会自动在重置的时候自动将这些资源恢复,因此beforeResetVertex()和resetVertex()函数在程序全部使用SYSTEMMEM创建的时候可以为空。
然而对于那些不会自动恢复的资源这两个函数则不能为空,从SDK上面可以知道,必须把这些资源释放,在重置成功之后再RE CREATE,也就是重新建立,因此在对于这些资源,beforeResetVertex()就是直接释放,调用其Release方法,在resetVertex()函数之后则是跟初始化基本一致,把其中的数据重新创建一遍。由于设备丢失,光线等信息也会随之丢失,因此,在重置之后依旧需要对之进行重新设置。
对于default_pool(不会自动处理的类型)我那两个函数放的内容是这样的:
HRESULT beforeResetVertex()
{
if(g_pVertexBuffer != NULL) g_pVertexBuffer->Release();
return S_OK;
}
HRESULT resetVertex()
{
VOID* pVertices;
CUSTOMVERTEX cvVertices[]=
{
//顶面
{-5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(0,0,255),},
{-5.0f,5.0f,5.0f,D3DCOLOR_XRGB(255,0,0),},
{5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0),},
{5.0f,5.0f,5.0f,D3DCOLOR_XRGB(0,255,0),},
//侧面1
{-5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0),},
{-5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(0,0,255),},
{5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(0,255,0),},
{5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0),},
//侧面2
{5.0f,-5.0f,5.0f,D3DCOLOR_XRGB(0,0,255),},
{5.0f,5.0f,5.0f,D3DCOLOR_XRGB(0,255,0),},
//侧面3
{-5.0f,-5.0f,5.0f,D3DCOLOR_XRGB(0,255,0),},
{-5.0f,5.0f,5.0f,D3DCOLOR_XRGB(255,0,0),},
//侧面4
{-5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0),},
{-5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(0,0,255),},
//底面
{5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(0,255,0),},
{5.0f,-5.0f,5.0f,D3DCOLOR_XRGB(0,0,255),},
{-5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0),},
{-5.0f,-5.0f,5.0f,D3DCOLOR_XRGB(0,255,0),},
};
//创建顶点缓冲
if(FAILED(g_pD3DDevice->CreateVertexBuffer(
18*sizeof(CUSTOMVERTEX),
0,
D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT,
&g_pVertexBuffer,
NULL
)))
{
return E_FAIL;
}
//得到顶点缓冲的指针,并锁住顶点缓冲
if(FAILED(g_pVertexBuffer->Lock(
0,
sizeof(cvVertices),
&pVertices,
0
)))
{
return E_FAIL;
}
//拷贝顶点值到顶点缓冲
memcpy(pVertices,cvVertices,sizeof(cvVertices));
//解锁顶点缓冲
g_pVertexBuffer->Unlock();
return S_OK;
}
先声明,这代码没有去考虑任何效率问题只考虑能够实现其结果,就是切换之后屏幕的东西依旧能够被渲染
|
|