2012-12-04 231 views
1

我正在寫一個使用OpenGL的小遊戲(通過JOGL進行Java編程,但我幾乎沒有想到這一點),而且我最近得到了一些關於OpenGL錯誤「1285」的錯誤報告,這些錯誤似乎表明「out的記憶「。我在創建新紋理後檢查glGetError時發現了這一點,這讓我感覺我的紋理內存不足了。OpenGL:紋理內存不足?

但是,這讓我感到驚訝。 OpenGL是否應該爲我管理紋理內存,根據需要在GPU和進程內存之間交換紋理?當然,glTexImage2D的規格並不包含任何「內存不足」錯誤,因爲任何可能的錯誤條件。

這是OpenGL驅動程序普遍接受的做法,儘管規格?儘管有規範,只有一些司機會這樣做嗎?如果我在glTexImage2D之後發現此錯誤,是否需要注意刪除尚未使用過的紋理?或者,我可能在這裏看到了OpenGL的錯誤報告並不完整地向我傳達的信息?

編輯:有關更多信息,不幸的是,我不能自己調試問題,因爲我沒有得到它。從人們寄給我的報告中讀出,絕大多數受此影響的人似乎都在使用英特爾卡,但我也發現了一些nVidia卡(甚至是680)。

回答

1

這只是一個猜測,但是你的程序可能遭受地址空間碎片化。如果是這樣的話,它確實很重要,因爲你在Java運行時運行。

OpenGL,即實現,必須保留所有數據對象的副本,以便它可以根據需要交換它們。但是這些副本,他們需要你的進程的地址空間。如果您的流程環境執行了大量的分配/釋放操作,這就是Java的本質(幾乎爲所有事情創建對象),可能會發生地址空間碎片化的問題,無法再分配更大的磁盤空間。

需要檢查的幾點:您的程序是在32位還是64位JRE上運行。如果它是32位可執行文件,請嘗試使用64位JRE時發生的情況。如果這些問題在64位環境中消失,而在32位環境中的同一臺計算機上,問題肯定存在地址空間碎片問題。

+0

我希望自己能夠嘗試一些事情,但不幸的是,它不是我得到任何錯誤,所以我只能看看我得到的報告正文。不幸的是,幾乎沒有一個來自64位JRE,所以我不能做很多比較。 – Dolda2000

+0

但是,我懷疑這是地址空間碎片的情況。 JRE在一個連續映射中分配它的堆(在這種情況下爲512 MB),所以它內部的頻繁分配不應該影響OpenGL的內存分配,而且我從未見過JRE過程變得如此之大以至於擔心簡單地用完了地址空間。整個過程只需要大約1GB的駐留內存,所以如果除去嚴重的碎片,我想應該留下很多虛擬空間。 – Dolda2000

+0

@ Dolda2000:在剩餘的地址空間中,是否有足夠的*連續*空間來保存大型紋理圖像? – datenwolf