在 Direct3D 9 中,Direct3D 允许驱动程序返回错误代码,例如E_OUTOFMEMORY、D3DERR_OUTOFVIDEOMEMORY和D3DERR_UNSUPPORTEDCOLORARG,以便应用程序能够响应它们。 但是,有时生成这些返回类型的 API 调用将加载到命令缓冲区中,并批量发送到 GPU(请参阅 控制运行时和驱动程序优化)。 在这种情况下,当需要执行作时,无法将错误中继到应用程序,因此运行时会使用错误代码,并在发生此情况的设备对象上发出注释。 稍后,当应用程序调用 IDirect3DDevice9::P resent时,IDirect3DDevice9::P resent 将返回D3DERR_DRIVERINTERNALERROR。 这就是为什么从 IDirect3DDevice9::P resent 接收D3DERR_DRIVERINTERNALERROR时,应用程序要采取的最佳方法是销毁和重新创建设备。
如果想要进一步调试,下面是一些建议,用于尝试确定哪个 API 调用正在生成错误:
由于可能的返回值列表未完成,因此可以通过围绕每个 API 调用来查找失败的调用,如下所示:
TRACE ( "Calling DrawPrimitive" ); d3ddev->DrawPrim(...); TRACE ( "done\n" );
然后,输出调试流应显示导致问题的调用。
此外,出于调试目的,请尝试在每个 IDirect3DDevice9::D rawPrimitive 之前立即调用 IDirect3DDevice9::ValidateDevice,以查看设备驱动程序是否存在其他问题(不支持的作、纹理格式不可用的组合等)。
注意
IDirect3DDevice9::ValidateDevice 应谨慎谨慎使用,因为驱动程序需要执行的验证工作量才能返回答案。
相关主题