OpenGL 2.0(Android) - 如何清除/重置纹理内存或从内存中删除选定的纹理?

时间:2013-05-30 19:07:09

标签: android opengl-es opengl-es-2.0 textures

我在OpenGL中清除纹理内存时遇到了这个问题。我正在使用OpenGL在Android上制作游戏。一切正常,但我所做的是在app启动时将所有纹理加载到内存中。我明显放慢了游戏的速度 - 我有12个怪物,每个都有10个动画帧,512x512大小加上环境纹理 - 所以我想一次把它全部加载到内存中并不是一个完美的主意。

我想做的是一个onLoadLevel(int level)函数,它将清除纹理内存并在当前级别的开始加载necessery纹理。

问题是如何清除OpenGL中的纹理内存? 我想2个选项 1 - 清除它 - 就像删除内存中的所有纹理并加载当前级别所需的所有内容 - 但只有这个级别的纹理 - 它会慢一点,但我想更容易做到?只是重置纹理内存? 2 - 删除我不再需要的纹理并加载下一个纹理。

我现在不知道如何做到这两点 - 如何一次清除内存中的所有纹理或如何从内存中删除一个 - 或者即使可能 - 我已经看到了一些解决方案,但它是关于指向纹理ID似乎是一个问题,因为我不知道什么是纹理ID?

我将在下面向您展示如何进行纹理加载过程:

public int mTextureDataHandleSample1;
//then I use loadTexture function from my TextureHelper class
mTextureDataHandleSample1 = TextureHelper.loadTexture(mActivityContext, R.drawable.sample1);
GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);

和loadTexture函数如下所示:

public static int loadTexture(final Context context, final int resourceId)
{
    final int[] textureHandle = new int[1];

    GLES20.glGenTextures(1, textureHandle, 0);

    if (textureHandle[0] != 0)
    {
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inScaled = false;   // No pre-scaling

        // Read in the resource
        final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId, options);

        // Bind to the texture in OpenGL
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]);

        // Set filtering
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR_MIPMAP_LINEAR);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);

        // Load the bitmap into the bound texture.
        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);

        // Recycle the bitmap, since its data has been loaded into OpenGL.
        bitmap.recycle();                       
    }

    if (textureHandle[0] == 0)
    {
        throw new RuntimeException("Error loading texture.");
    }

    return textureHandle[0];
}

所以,如果你能告诉我或至少指出我如何清除纹理内存或删除以前加载到内存中的一些纹理,我将非常感激。

2 个答案:

答案 0 :(得分:2)

所以你正在寻找一种删除纹理的方法。您可能需要考虑the glDeleteTextures function。它需要一个或多个纹理的数组并删除它们。

答案 1 :(得分:0)

完全同意Nicol?Bolas?一旦使用 glGenTextures()生成纹理,就可以使用 glDeleteTextures()释放内存,例如在你的情况下,你应该有一个释放方法,如下所示:

public void free(GL10 gl){ gl.glDeleteTextures(1, textureHandle, 0); }

然后当你需要替换纹理或重新实例化时,应该调用 free()方法。