我的应用程序内存不足,在两个活动之间切换。第一个活动是运行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:
我最后添加了你的所有想法。然而,这似乎是我的问题......
答案 0 :(得分:3)
我假设您的意思是通过gl.glTexImage *或任何其他辅助方法将纹理加载到GPU。在那种情况下,GC不会帮助你,它不会清理纹理使用的内部存储器
您是否尝试通过gl.glDeleteTextures手动删除纹理?
根据新代码进行修改:
您的代码中有几处泄漏:
我在这段代码中没有看到任何其他问题,如果在此修复之后它仍然无法工作,那么请关闭应用中的任何位图用法。