Android 确保释放OpenGL纹理内存
我的应用程序内存不足,无法在两个活动之间切换。第一个活动运行OpenGL场景,第二个活动不运行。我想确保我正在释放OpenGL场景使用的所有纹理 现在我正在使用这个方法Android 确保释放OpenGL纹理内存,android,memory,opengl-es,Android,Memory,Opengl Es,我的应用程序内存不足,无法在两个活动之间切换。第一个活动运行OpenGL场景,第二个活动不运行。我想确保我正在释放OpenGL场景使用的所有纹理 现在我正在使用这个方法 getNativeHeapAllocatedSize() 跟踪纹理使用的相对内存量。如果我分配纹理,这个数字会增加大约4兆。然而,它似乎再也不会下降了 在我的第一个活动“OnPause”中,我有以下代码: SurfaceView.onPause(); mTexture = null; 在第二个活动中,我随后多次调用GetNa
getNativeHeapAllocatedSize()
跟踪纹理使用的相对内存量。如果我分配纹理,这个数字会增加大约4兆。然而,它似乎再也不会下降了
在我的第一个活动“OnPause”中,我有以下代码:
SurfaceView.onPause();
mTexture = null;
在第二个活动中,我随后多次调用GetNativeHeapLocatedSize()。即使在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;
}
编辑2:
我确实把你所有的想法都加进去了。然而这似乎是我的问题
我假设您指的是通过gl.glTexImage*或任何其他辅助方法加载到GPU的纹理。在这种情况下,GC不会帮助您,它不会清理纹理使用的内部内存 您是否尝试过通过gl.glDeleteTextures手动删除纹理 根据新代码编辑: 代码中有几个漏洞:
- 关闭输入流
- 将数据复制到ByteBuffer后回收位图
- 我猜你使用byteBuffer和图像数据来上传纹理到GPU,确保上传数据后不存储对这些缓冲区的引用
我看不到这段代码中有任何其他问题,如果修复后仍然无法工作,请仔细查看应用程序中的位图用法。我只是指传递给OpenGL的数据。因为我之前发布过,我已经从公式中删除了OpenGL,所以它一定与我的ByteBuffer或位图处理有关。另一方面,当使用曲面视图时,您会将其称为glDeleteTextures吗?调用onPause时有一个覆盖函数,现在我说的是每个纹理中的GL10对象,但它似乎有点粗糙。关于glDeleteTextures-一般来说,你不应该删除它们,android会为你做的。我只是不确定是应用程序关闭还是活动暂停。但无论如何,GPU中使用的内存不应影响您的第二个屏幕关闭输入流-检查-将数据复制到ByteBuffer后回收位图-检查-我猜您使用ByteBuffer和图像数据将纹理上载到GPU,确保在上载数据后不存储对这些缓冲区的引用。-所以,在我通过glTexImage2D传入字节缓冲区之后,释放字节缓冲区就可以了?我要试一试。