2013-08-20 42 views
0

我有一個iOS opengl es 2.0應用程序,需要使用大型紋理的TON。理想的是4096x4096。我有一個結構數組,其中包含有關紋理的所有信息,並且因爲我需要使用每個紋理我glGenTextures一個新的紋理id並加載圖像,釋放uiimage等。這一切都很好。in opengl es 2如何釋放紋理(ios硬件崩潰)

我的應用程序使用一堆紋理的用戶界面,圖像處理等。大約4-5 15我用於所有這些是4k x 4k。休息比較小。然後這些按需加載的紋理也是4k。

在加載約4到5人的應用程序崩潰硬盤。沒有控制檯或調試。試圖加載下一個紋理時,退出跳板。

我沒有內存泄漏 - 我運行了儀器。我正在使用ARC。我可以從組織者發佈崩潰報告,但沒有太多信息。只是我的應用程序的版本是170504.

我可以發佈圖像加載代碼,但它與我在所有應用程序上使用多年的代碼相同。新的東西是推動系統,努力加載許多大型紋理。

Q1:任何人都有使用大量紋理的經驗?

所以我解決了這個事實,我將不得不在預覽res的東西在1024x1024,然後在4096最終資源的東西。1k圖像現在加載的需要,並保持加載。 4k圖像將全部一次加載到要使用的相同紋理中,然後轉到下一個。

我在我的圖像加載器中寫入了一個預覽參數,並且在設置時它會在加載過程中縮小圖像以適合1024。現在,我可以在第四或第五次崩潰時全天添加紋理。我的GUESS是我可以做到以前的16倍。但我一次只需要20-30。 (只!)到目前爲止,我已經嘗試過20次,沒有內存警告或崩潰。

但是,如果應用程序繼續運行,因爲我的紋理加載到獨特的紋理ID,在某些時候,我會碰到那個地方,我需要卸載不再需要加載下一個紋理的地方。這可能很簡單,但是......

問題2:當我不再需要紋理時,如何釋放紋理ID?

問題3:內存警告是否告訴我需要釋放開放的gl紋理?

問題4:PVR芯片上沒有加載紋理嗎?他們是甚麼還是他們如何佔用手機的記憶?

謝謝!

回答

2

刪除紋理: 您必須從主線程使用此GL調用。

glDeleteTextures(1,& _texture);

內存警告是對應用程序的廣泛調用。它不會給你具體的信息。如果不再需要,從內存中移除不需要的紋理總是更好。例如:當用戶移動到遊戲內屏幕時,我們通常會刪除菜單中使用的紋理,當用戶返回時會再次重新加載它們。與等待系統調用內存警告相比,管理內存要容易得多。

當加載PNG圖像時,數據被解壓縮並存儲的原始作爲每個像素的顏色陣列。儘管圖像中有內容/顏色,但1K紋理將使用4 mb。 PVR是一種硬件解壓縮芯片,當GPU使用該圖像時,該解碼芯片將實時解壓,並且您看到的圖像文件大小就是它使用的內存大小。

+0

謝謝。這就是我一直在尋找的。我知道這會很簡單。當你自學opengl時,很容易錯過小東西。 – badweasel

+0

我可以問,雖然..你說當你加載一個PNG的數據是「解壓縮和原始存儲」..但然後你談論PVR是一個硬件解壓縮芯片,它實時解壓縮圖像..所以它存儲它在芯片中壓縮還是解壓縮?沒有使用pvr格式,有沒有辦法將它壓縮存儲在芯片上給你更多的空間?或者是唯一的方法?蘋果宣稱,pvr格式可能並不總是被支持,所以我避免了它。你用它嗎? – badweasel

+0

我們通常不使用PVR,但正在計劃從PNG轉移到PVR。 PVR文件被加載並存儲在內存中並直接發送到GPU,GPU在使用時解壓縮該文件。所以使用的內存只是文件大小。解壓發生在GPU本身。我知道PNG和PVR是兩種很好的格式。據我所知,蘋果的設備使用PVR壓縮文件,但沒有支持其他壓縮格式。 – codetiger