排查 (Direct3D 9)
本主题列出了编写 Direct3D 应用程序时可能遇到的常见问题类别,以及如何防止这些问题。
设备创建
如果应用程序在设备创建过程中失败,检查以下常见错误。
- 请确保检查设备功能,尤其是呈现深度。
- 检查错误代码。 始终可以D3DERR_OUTOFVIDEOMEMORY。
- 使用调试 DirectX 动态链接库 (DLL) ,并在调试器下查看输出消息。
使用点亮顶点
使用点亮顶点的应用程序应通过将D3DRS_LIGHTING呈现状态设置为 FALSE 来禁用 Direct3D 照明引擎。 默认情况下,启用照明时,系统会将不包含法向量的任何顶点的颜色设置为 0 (黑色) ,即使输入顶点包含非零颜色值也是如此。 由于照明顶点本质上不包含顶点法线,因此,如果启用照明引擎,则呈现期间传递给 Direct3D 的任何颜色信息都将丢失。
显然,顶点颜色对于执行自身照明的任何应用程序都很重要。 若要防止系统施加默认值,请确保将 D3DRS_LIGHTING 设置为 FALSE。
如果应用程序运行但看不到任何内容,检查以下常见错误。
- 确保三角形不会退化。
- 确保未剔除三角形。
- 确保转换在内部保持一致。
- 检查视区设置,确保它们允许看到你的三角形。
调试
调试 Direct3D 应用程序可能具有挑战性。 除了检查所有返回值外,还尝试以下技术 - Direct3D 编程中一条特别重要的建议,它依赖于非常不同的硬件实现。
- 切换到调试 DLL。
- 强制使用仅限软件的设备,即使硬件加速可用,也将其关闭。
- 强制表面进入系统内存。
- 创建在窗口中运行的选项,以便可以使用集成调试器。
此列表中的第二个和第三个选项可帮助你避免 Win16 锁,否则可能导致调试器挂起。
此外,请尝试将以下条目添加到 Win.ini。
[Direct3D]
debug=3
[DirectDraw]
debug=3
Borland Floating-Point 初始化
来自 Borland 的编译器以与 Direct3D 不兼容的方式报告浮点异常。 若要解决此问题,请包括_matherr异常处理程序,如下所示:
// Borland floating point initialization
#include <math.h>
#include <float.h>
void initfp(void)
{
// Disable floating point exceptions
_control87(MCW_EM,MCW_EM);
}
int _matherr(struct _exception *e)
{
e; // Dummy reference to catch the warning
return 1; // Error has been handled
}
参数验证
出于性能原因,与零售版本相比,Direct3D 即时模式的调试版本执行的参数验证更多,后者有时根本不执行任何验证。 这使应用程序能够在使用更快的零售版本进行性能优化和最终发布之前,使用较慢的调试运行时组件执行可靠的调试。
尽管一些 Direct3D 即时模式方法对其可以接受的值施加限制,但这些限制通常仅由 Direct3D 即时模式运行时的调试版本检查并强制实施。 应用程序必须符合这些限制,否则在零售版 Direct3D 上运行时,可能会出现不可预知且不需要的结果。 例如, IDirect3DDevice9::D rawPrimitive 方法接受一个参数 (PrimitiveCount) ,该参数指示方法将呈现的基元数。 方法只能接受介于 0 和 D3DMAXNUMPRIMITIVES 之间的值。 在 Direct3D 的调试版本中,如果传递的基元超过 D3DMAXNUMPRIMITIVES 基元,该方法会正常失败,将错误消息打印到错误日志,并将错误值返回到应用程序。 相反,如果应用程序在使用运行时的零售版本运行时出现相同的错误,则行为未定义。 出于性能原因,方法不验证参数,导致参数无效时出现不可预测的完全情景行为。 在某些情况下,调用可能正常工作,在其他情况下,它可能会导致 Direct3D 中的内存故障。 如果无效的调用始终适用于特定硬件配置和 DirectX 版本,则不能保证它将继续在其他硬件或 DirectX 的更高版本上运行。
如果应用程序在使用零售 Direct3D 运行时文件时遇到无法解释的故障,请根据调试版本进行测试,并仔细查看应用程序传递无效参数的情况。 使用 DirectX 控制面板小程序,根据需要切换到调试运行时,并检查“中断 D3DError”选项。 此选项将强制运行时使用 Windows DebugBreak 方法,以便在检测到应用程序 bug 时强制应用程序停止。
相关主题