2011-03-14 166 views
1

我的應用程序內存不足以在兩個活動之間切換。第一個活動是運行OpenGL場景,第二個活動不是。我想確保我釋放OpenGL場景使用的所有紋理。確保OpenGL紋理內存已被釋放

現在我用這個方法

getNativeHeapAllocatedSize() 

來跟蹤紋理使用的內存相對量。如果我分配紋理,這個數字會增加約4兆。然而它似乎再也沒有回落。

在我的第一個活動「的onPause」我有以下代碼:

SurfaceView.onPause(); 
mTexture = null; 

在第二個活動,然後我打電話getNativeHeapAllocatedSize()幾次。即使在GC運行之後,內存仍然沒有下降。

編輯:

更多的研究後,它似乎是一些與加​​載數據的代碼。我已經從等式中刪除了OpenGL,內存仍然沒有被釋放。

try { 
     InputStream is = null; 
     { 
      AssetManager am = MyActivity.getAssetMgr(); 
      is = am.open(fileName); 
     } 

     Bitmap b = BitmapFactory.decodeStream(is); 
     if(b != null) { 
      mResX = b.getWidth(); 
      mResY = b.getHeight(); 
      Bitmap.Config bc = b.getConfig(); 
      if(bc == Bitmap.Config.ARGB_8888) 
       mBPP = 4; 
      else 
       mBPP = 2; 

      mImageData = ByteBuffer.allocateDirect(mResX * mResY * mBPP); 
      mImageData.order(ByteOrder.nativeOrder()); 
      b.copyPixelsToBuffer(mImageData); 
      mImageData.position(0); 


      return true; 
     } 
    } catch (IOException e) {  
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    }  
    return false; 
} 

EDIT2:

我最終將在所有你的想法。然而,這似乎是在我的情況的問題...

ByteBuffer not releasing memory

回答

3

我假設你的意思是通過加載* gl.glTexImage或其他任何輔助方法,到GPU的紋理。在這種情況下,GC不會幫你,它不會清除紋理使用的內部存儲器

你試過通過gl.glDeleteTextures手動刪除你的紋理嗎?

幾個泄漏代碼:

  • 關閉輸入流
  • 回收你的位圖已複製數據的ByteBuffer
  • 我想以後

    根據新的代碼編輯您使用帶圖像數據的byteBuffer將紋理上傳到GPU,確保在數據上傳後不會存儲對這些緩衝區的引用。

我在這段代碼中看不到任何其他問題,如果在此修復後仍然不行,那麼請仔細查看應用中的任何位圖用法。

+0

我只是指被傳遞給OpenGL的數據。由於我之前發佈過,我已經從公式中刪除了OpenGL,所以它必須是我的ByteBuffer或者Bitmap處理的東西。在旁註中,當使用Surface視圖時,你會調用glDeleteTextures嗎?當onPause被調用時,有函數可以重寫,現在我說的是每個紋理中的GL10對象,但它看起來有點冒險。 – TurqMage 2011-03-14 20:03:00

+0

關於glDeleteTextures - 一般你不應該刪除它們,android會爲你做。我只是不確定它是否會在應用程序關閉或活動暫停。但無論如何,在GPU中使用的內存不應該影響你的第二個屏幕 – Yuriy 2011-03-14 20:54:45

+0

- 關閉輸入流 - 檢查 - 將數據複製到ByteBuffer後回收你的位圖 - 檢查 - 我猜你使用byteBuffer與圖像數據上傳紋理到GPU ,請確保數據上傳後不會存儲對這些緩衝區的引用。 - 所以,當我在通過glTexImage2D通過字節的緩衝區,這是很好釋放的ByteBuffer?我會給你一個鏡頭。 – TurqMage 2011-03-14 22:28:23