2009-12-09 43 views
2

在iPhone 3G使用OpenGLES 1.1(設備,而不是仿真器),我做正常拉絲樂趣。但在應用程序運行過程中,我得到了巨大的內存尖峯,經過大量的儀器挖掘後,我發現它是glDrawElements,它抓住了內存。glDrawElements分配內存,而不是釋放它

被分配的緩衝區是4微克,這對我來說意味着其裝載紋理到RAM中,我猜可能是有效的,但是它從來沒有釋放該緩衝區,並分配他們的多。

我如何確保該GL是創造這些緩衝區被摧毀的,而不是僅僅掛?看到

回答

0

我在IRC上的一些人的幫助下計算出了這一點。這個問題最終成爲我在應用程序中進行線程化的方式。通過將GL和遊戲更新循環移至同一個線程,問題消失了,我不知道爲什麼其他方式導致內存分配,但問題已解決。

+0

可能是因爲你沒有在後臺線程上釋放NSAutoreleasePool。 – 2011-11-18 04:21:48

0

檢查,如果這是在模擬器或iPhone設備本身。儀器/泄漏可以並且會報告模擬器上的誤報,您在設備上不會遇到誤報。

+0

絕對在設備上測試,編輯問題以匹配 – 2009-12-09 07:53:03

2

這聽起來不像泄漏,更像是在GPU同時保持在一個內存塊(vertexbuffer,質地等等)的情況下,再次需要一個驅動程序優化。如果你運行一段時間的應用程序,它會不斷分配越來越多的內存,直到設備最終耗盡內存爲止?

這是一個不幸的事實,第一代iPhone 3G沒有對頂點緩衝區對象(VBO)提供適當的支持,它們被API公開,但它們的工作方式與普通軟件頂點緩衝區完全相同。這意味着無論您何時調用glDrawElements,您設置的任何頂點緩衝區都將從系統內存複製到GPU。

只有這樣,你可以在「泄漏」內存,OpenGL是通過反覆分配不同的緩衝對象(紋理對象,頂點緩衝對象,幀緩衝對象等),不釋放他們,像這樣做的每一幀:

GLuint id; 
glGenTextures(1, &id); 
glBindTexture(GL_TEXTURE_2D, id);   
glTexImage2D(...); 

你最終會耗盡內存。我在iPhone 3G上自己使用glDrawElements,我沒有看到這個問題,你能給出一個小的repro代碼示例嗎?

+0

+1。作爲一個側面說明,如果編程正確,則銷燬GL上下文應返回內存。 – Bahbar 2009-12-09 10:09:01

+0

是的,這導致我的內存不足,並且正在多次發生。每當我收到內存警告時,我都可以嘗試搗毀並重建我的環境,但似乎不應該需要它。 – 2009-12-09 15:38:18

+0

@Joshou檢查我編輯的答案 – 2009-12-09 16:13:16