1

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

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

问题是如何在 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];
}

所以如果你能告诉我或者至少给我一个解决方案如何清除纹理内存或删除之前加载到内存中的一些纹理,我将非常感激。

4

2 回答 2

3

因此,您正在寻找一种删除纹理的方法。您可能要考虑glDeleteTextures功能。它需要一个或多个纹理的数组并删除它们。

于 2013-05-30T19:11:06.683 回答
1

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

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

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

于 2014-03-06T00:01:57.523 回答