1

OpenGL でテクスチャ メモリをクリアすると、この問題が発生します。OpenGL を使用して Android でゲームを作成しています。すべてがうまく機能しますが、アプリの起動時にすべてのテクスチャをメモリにロードしています。私は明らかにゲームの速度を遅くしています.512x512サイズの10個のアニメーションフレームと環境テクスチャを備えた12匹のモンスターがいます.

私がやりたいのは、テクスチャ メモリをクリアし、現在のレベルの開始時に必要なテクスチャをロードする関数 onLoadLevel(int level) です。

問題は、OpenGL でテクスチャ メモリをクリアする方法です。2 つのオプションについて考えます 1 - すべてをクリア - メモリ内のすべてのテクスチャを削除し、現在のレベルに必要なものをすべてロード - ただし、このレベルのテクスチャのみ - 遅くなりますが、簡単に実行できると思いますか? テクスチャメモリをリセットするだけですか?2 - もう必要ないテクスチャだけを削除し、次のテクスチャをロードします。

今のところ、この両方を行う方法はわかりません-メモリからすべてのテクスチャを一度にクリアする方法、またはメモリから1つだけを削除する方法-または可能であれば-いくつかの解決策を見てきましたが、テクスチャ 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。1 つ以上のテクスチャの配列を取り、それらを削除します。

于 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 に答える