OpenGL:随机OpenGL函数调用崩溃

时间:2010-08-12 17:21:26

标签: c++ windows visual-studio-2008 opengl

我遇到了奇怪的问题,崩溃发生在随机时间,例如我设法使用3d应用程序一段时间没有崩溃,然后大多数时候它总是在我突然同时渲染很多对象时崩溃。

我最近注意到,当使用巨大的纹理尺寸和大量纹理并在一帧中从一个切换到另一个时,更改此ATI卡上的巨大纹理表面会使整个计算机崩溃。所以我有可能打破了ATI卡或者只是一辆车。但它是不可改变的,因为我最近添加了一些代码,现在我第一次注意到这次崩溃。我没有使用任何特殊的opengl调用,只是好旧的glbegin()glend()glcolor()等......

如果我注释掉之前崩溃的行,例如glBegin(GL_QUADS)... glEnd()那么下次我在我的代码的不同位置上的不同openGL函数调用时崩溃,例如glColor4f()和然后我评论出来,下一次崩溃我得到glClear()完全不同的渲染代码部分!

可能导致这些的原因是什么?我正在使用ATI卡,我知道一些opengl调用可能会使程序崩溃,如果他们使用不正确的值,如glLineWidth(4)会在随机的openGL代码行中崩溃某些ATI卡,因为最大行宽为3!

编辑:

当我使用ApplicationVerifier在调试模式下运行程序时,它会抛出这一行:

if(!(PixelFormat = ChoosePixelFormat(hDC, &pfd))){

我不明白,它可能有什么问题?

PFD:

static PIXELFORMATDESCRIPTOR pfd = {
   // *correct amount of elements*
};

2 个答案:

答案 0 :(得分:0)

这种随机行为通常是堆栈/堆损坏的症状。您应该检查您是否没有破坏堆和/或堆栈。 Buggy驱动程序也是一个选项,因为崩溃无效值是一个错误,不应该崩溃而是产生GL错误。

答案 1 :(得分:0)

IMO,OpenGL中的崩溃只是一个症状,而真正的问题在于其他地方。一般来说,您的描述听起来或多或少是资源滥用的典型(例如,内存泄漏,使用悬空指针,垃圾堆等)。

像驱动程序错误肯定是可能的 - 事实上,图形驱动程序非常庞大且复杂,以至于某些错误可能几乎是不可避免的。对此的明显测试是运行使用OpenGL的其他代码并查看它是否可靠地工作。你总是有可能使用包含bug的执行路径,但它是如此模糊,几乎没有其他任何东西使用它,所以不会触发错误 - 但鉴于崩溃不是在固定的位置发生,似乎不太可能(仍然可能,只是不太可能)。如果一个图形驱动程序有一个错误(特别是一个严重到导致崩溃的错误,而不仅仅是错误渲染),它通常会很快被人知道。