2011-12-30 67 views
0

我一直在追逐我的遊戲中的錯誤,我想我終於找到了問題。丟失opengl上下文後處理內存警告的最佳步驟

我有一個內存管理例程,在內存警告中調用,它基本上檢查什麼是加載和不需要,並釋放。 我的大部分內存都被用在op​​engl的紋理中,除了紋理之外,我只需要轉儲一些對象來保持系統的快樂,即使是在3G上使用它的內存有限。

現在我的問題,有幾次我失去了openGL上下文,例如在用MPMoviePlayerController播放電影時,或者調用GC系統視圖時。 GC或MPMovie的

幾次負荷將與我的內存管理程序一致被調用,這是我覺得崩潰的比賽,因爲我沒有OpenGL上下文,我得到:

malloc: *** error for object 0x471c9080: pointer being freed was not allocated 

當試圖glDeleteTextures。

現在我正在更改我的代碼,所以我不嘗試刪除無效上下文中的紋理(仍然檢查如何執行此操作),但是我仍然留下了當我得到內存警告在opengl上下文中斷。

我看只有一個選項

  1. 調用的東西,會讓我失去方面的嘗試和釋放內存

之前,我特別不喜歡這個選擇,因爲它介紹了一些操作的滯後。

  1. 有人看到更好的方法嗎?
  2. 我對問題的分析正確嗎? (當使用MPlayer和GC時,我真的會失去opengl上下文)
  3. 任何其他釋放紋理的方法?

THX

回答

2

嗯,當然聽起來像有您可以在這裏至少幾個基本的預防措施:

  1. 你應該保持對它的引用您的EAGLContext左右。這將允許你在任何必要的時候使你的上下文在當前操作(刪除)它的紋理。 (如果您不確定上下文是否爲當前時間,則您不應在任何時間隨意調用glDeleteTextures。)
  2. 您可以檢查您的上下文是否與當前時間一致:if (myContext == [EAGLContext currentContext])...。如果不是這樣,您可以選擇不進行內存刷新,或者根據其狀態採取其他操作。
+0

我確實有一個參考我的EAGLContext,設置它當前MPPlayer電影播放停止電影,並使其消失。目前的情景比較並沒有發生在我身上,但它當然有用,thx。仍然需要找到一種方法來刪除這些紋理... – led42 2011-12-30 16:43:07