Обеспечение памяти текстур OpenGL - PullRequest
1 голос
/ 14 марта 2011

Моему приложению не хватает памяти, которая переключается между двумя действиями. Первое действие - это сцена OpenGL, второе - нет. Я хочу убедиться, что я освобождаю все текстуры, используемые сценой OpenGL.

Сейчас я использую этот метод

getNativeHeapAllocatedSize()

для отслеживания относительного объема памяти, используемого текстурами. Это число увеличивается примерно на 4 мегабайта, если я выделяю текстуры. Однако, похоже, он никогда не отступит снова.

В моих первых действиях «OnPause» у меня был следующий код:

SurfaceView.onPause();
mTexture = null;

Во втором упражнении я затем вызываю getNativeHeapAllocatedSize () несколько раз. Даже после того, как ГХ запустился, и память все еще не упала.

Edit:

После дополнительных исследований выясняется, что это что-то с кодом, который загружает данные. Я удалил 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 не освобождает память

1 Ответ

3 голосов
/ 14 марта 2011

Я предполагаю, что вы имеете в виду текстуры, загруженные в GPU через gl.glTexImage * или любой другой вспомогательный метод.В этом случае GC вам не поможет, он не очищает внутреннюю память, используемую текстурами

Вы пытались вручную удалить ваши текстуры с помощью gl.glDeleteTextures?

Редактировать в соответствии с новым кодом:

Несколько утечек в вашем коде:

  • закрыть входной поток
  • перезаписать ваше растровое изображение после копирования данных в ByteBuffer
  • Я предполагаю, что вы используете byteBuffer с данными изображения для загрузки текстуры в графический процессор, убедитесь, что вы не сохраняете ссылки на эти буферы после загрузки данных.

Я не вижу никаких других проблем в этом коде, если после этого исправления это все равно не сработает, тогда присмотритесь к любому использованию растровых изображений в вашем приложении.

...