Android 确保释放OpenGL纹理内存

Android 确保释放OpenGL纹理内存,android,memory,opengl-es,Android,Memory,Opengl Es,我的应用程序内存不足,无法在两个活动之间切换。第一个活动运行OpenGL场景,第二个活动不运行。我想确保我正在释放OpenGL场景使用的所有纹理 现在我正在使用这个方法 getNativeHeapAllocatedSize() 跟踪纹理使用的相对内存量。如果我分配纹理,这个数字会增加大约4兆。然而,它似乎再也不会下降了 在我的第一个活动“OnPause”中,我有以下代码: SurfaceView.onPause(); mTexture = null; 在第二个活动中,我随后多次调用GetNa

我的应用程序内存不足,无法在两个活动之间切换。第一个活动运行OpenGL场景,第二个活动不运行。我想确保我正在释放OpenGL场景使用的所有纹理

现在我正在使用这个方法

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传入字节缓冲区之后,释放字节缓冲区就可以了?我要试一试。