确保发布OpenGL纹理内存

时间:2011-03-14 18:33:21

标签: android memory opengl-es

我的应用程序内存不足,在两个活动之间切换。第一个活动是运行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

1 个答案:

答案 0 :(得分:3)

我假设您的意思是通过gl.glTexImage *或任何其他辅助方法将纹理加载到GPU。在那种情况下,GC不会帮助你,它不会清理纹理使用的内部存储器

您是否尝试通过gl.glDeleteTextures手动删除纹理?

根据新代码进行修改:

您的代码中有几处泄漏:

  • 关闭输入流
  • 将数据复制到ByteBuffer后回收您的位图
  • 我猜您使用带有图像数据的byteBuffer将纹理上传到GPU,确保在上传数据后不存储对这些缓冲区的引用。

我在这段代码中没有看到任何其他问题,如果在此修复之后它仍然无法工作,那么请关闭应用中的任何位图用法。

相关问题