2010-08-12 52 views
0

我正在奇怪的问题,坠机发生在随机时间,比如我设法使用3D应用了一会儿没有崩溃,那么大多数时候它总是崩溃时,我突然同时渲染很多对象。OpenGL的:在随机的OpenGL函数调用崩溃

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

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

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

编辑:

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

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

我不明白,怎么可能是错的呢?

PFD:

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

最好的办法是用另一个GPU在计算机上试试你的程序,看它是否也崩溃 – Tomaka17 2010-08-12 17:30:48

回答

0

IMO,机会是相当不错的,在OpenGL的崩溃只是一个症状,而真正的问题不在于此。在一般情况下,你的描述听起来资源滥用(例如,内存泄漏,使用悬挂指针,捣毁堆等)

就像一个驾驶员的错误肯定是可能或多或少典型的 - 其实是一个图形驱动程序非常庞大而且复杂,因此某些错误可能几乎是不可避免的。明显的测试是运行其他使用OpenGL的代码,看它是否可靠工作。总是有可能你使用的是一个包含bug的执行路径,但是它很隐蔽,几乎没有其他的东西使用它,所以这个bug不会被触发 - 但是假设这个崩溃不是在一个固定的位置发生的,似乎相当不可能(仍然可能,不太可能)。如果一个图形驱动程序有一个错误(特别是一个足以导致崩溃,而不仅仅是错误渲染的错误),它通常会很快知道。

+0

似乎你是对的......我滑过调试文件夹中的大纹理> _>不再崩溃!但仍然没有帮助应用程序验证工具错误行,我不知道那是什么:7 – Newbie 2010-08-12 18:31:05

0

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

+0

如何检查堆腐败... – Newbie 2010-08-12 17:39:23

+0

使用Valgrind,请参阅http://en.wikipedia.org/wiki/Valgrind – 2010-08-12 18:19:21

+0

该desnt支持windows> _> – Newbie 2010-08-12 22:12:21