在设备丢失之后,使用D3D的 TestCooperativeLevel 函数检测到 LOST / RESET 2个事件
需要重置的资源包括
1. 所有使用 D3DPOOL_DEFAULT 的资源( 纹理、顶点数据……)
2. 所有 STATE BLOCKS
3. 所有 RTT 以及 DEPTH STENCIL 平面
以及不被文档经常提及的 ID3DXEFFECT、ID3DXFONT、ID3DXLINE 等资源
一般开启 D3D 调试之后会显示错误的 D3D ALLOC ID,在调试窗口下调试就可以解决,但有时不会
显示具体的 ALLOC ID ,只显示一段
"All user created stateblocks must be freed before Reset can succeed"
这种让人无法调试,其实问题就在于 ID3DXFONT 和 ID3DXLINE 之类的资源在 RESET 的时候没有被重置,
所有包含 OnLostDevice 和 OnResetDevice 方法的接口和类都必须在设备丢失重置的时候处理否则就会重置失败
* 还有一种情况就是使用 QueryInterface 之类的方法获取诸如背缓冲和深度缓冲指针之后在 RESET 之前没有 RELEASE 的时候,也会导致失败,原因在于增加了平面的引用D3D在RESET之前不能正确释放掉,所以需要手动RELEASE掉。