2010-08-12 40 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