我的應用程序內存不足以在兩個活動之間切換。第一個活動是運行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
我只是指被傳遞給OpenGL的數據。由於我之前發佈過,我已經從公式中刪除了OpenGL,所以它必須是我的ByteBuffer或者Bitmap處理的東西。在旁註中,當使用Surface視圖時,你會調用glDeleteTextures嗎?當onPause被調用時,有函數可以重寫,現在我說的是每個紋理中的GL10對象,但它看起來有點冒險。 – TurqMage 2011-03-14 20:03:00
關於glDeleteTextures - 一般你不應該刪除它們,android會爲你做。我只是不確定它是否會在應用程序關閉或活動暫停。但無論如何,在GPU中使用的內存不應該影響你的第二個屏幕 – Yuriy 2011-03-14 20:54:45
- 關閉輸入流 - 檢查 - 將數據複製到ByteBuffer後回收你的位圖 - 檢查 - 我猜你使用byteBuffer與圖像數據上傳紋理到GPU ,請確保數據上傳後不會存儲對這些緩衝區的引用。 - 所以,當我在通過glTexImage2D通過字節的緩衝區,這是很好釋放的ByteBuffer?我會給你一個鏡頭。 – TurqMage 2011-03-14 22:28:23