2011-09-09 31 views
0

私はちょうどOpenGLを使用し始めましたアニメーションのためにビットマップの割り当てをロードする必要があります。いくつかのフレームでうまく動作するようになりますが、すべてのフレームをロードしようとするとメモリが不足します。一度に数フレーム?これは私がテクスチャ複数のテクスチャを読み込むopenGL

public void loadGLTexture(GL10 gl, Context context) { 


    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.r1); 
    Bitmap bitmap01 = Bitmap.createScaledBitmap(bitmap, 512, 512, false); 

    Bitmap bitmap2 = BitmapFactory.decodeResource(context.getResources(),R.drawable.r2); 
    Bitmap bitmap02 = Bitmap.createScaledBitmap(bitmap2, 512, 512, false); 

    Bitmap bitmap3 = BitmapFactory.decodeResource(context.getResources(),R.drawable.r3); 
    Bitmap bitmap03 = Bitmap.createScaledBitmap(bitmap3, 512, 512, false); 


    try { 

    bitmap = bitmap01; 
     bitmap2 = bitmap02; 
     bitmap3 = bitmap03; 
    } finally { 
    } 

    //Generate there texture pointer 
    gl.glGenTextures(3, textures, 0); 

    //Create Texture and bind it to texture 0 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 

    //Create Texture and bind it to texture 1 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[1]); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap2, 0); 

    //Create Texture and bind it to texture 2 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[2]); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap3, 0); 


    //Clean up 
    bitmap.recycle(); 
    bitmap2.recycle(); 
    bitmap3.recycle();  
} 

}

答えて

2

まあ、それはあなたのアプリケーションのプロセスで使用できる(非常に限られた)メモリに多くのビットマップにロードの古典的な問題だをロードするために使用しているコードです。私はこれに入るつもりはない、ハニーコムからヒープをロードして、ヒープ上にロードされているものの、これらのビットマップはハニカムになっていますが、問題はまだ残っています:128x256ピクセルのビットマップは4 * 128 *メモリの256バイト。また、通常、デバイスとAndroidのバージョンに応じて、アプリには16〜48メガバイトのメモリがあります。

ここでは、ビットマップを読み込んでそれを使ってOpenGLテクスチャを作成すると、そのBitmapオブジェクトは必要なくなり、リサイクルしてnullにすることができます。だから、最初のビットマップを読み込んで(あなたのコードから見ると、スケーリングして)、最初のテクスチャオブジェクトを作成してから、その最初のビットマップをリサイクルして取り除くことができます。続いて、2番目のテクスチャオブジェクトの2番目のビットマップを使って同じことを行います。

0

最初に、イメージを拡大縮小するとすぐにビットマップをリサイクルできます。次に、にプリスケールしてください。つまり、get goから512x512として保存します。

しかし、最も重要なのは、このためにテクスチャアトラスを作成する必要があります。基本的に、複数のテクスチャを使用する代わりに、単一の大きなテクスチャを使用して、そこにすべてのフラグメントを格納することができます。考え方は、たとえば、2048x2048のテクスチャを作成し、512x512ピクセル(それぞれ4行4列)の16 "セル"を保存し、画面上に四角形を描画するときにテクスチャ座標を変更して特定のセルを表示することです。

オフラインで生成するには、多数のユーティリティが役立ちます。 TexturePackerは1つであり、その他多くのものがあります。コードでそれを行うには、一度、あなたのテクスチャを生成することができます。

最後の行は、あなたのビットマップごとに次にサイズ(2048×2048)

の空の画像を割り当て、あなたが使用することができます

gl.glGenTextures(1, textures, 0); 

//Create Texture and bind it to texture 0 
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); 
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, 2048, 2048, 0, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, null); 

を:

int xoffset = (imageIndex % 4) * 512; 
int yoffset = (imageIndex/4) * 512; 
GLUtils.texSubImage2D(GL10.GL_TEXTURE_2D, 0, xoffset, yoffset, bitmap); 

これは、ビットマップをテクスチャの一部に読み込みます。 @Josephが示唆しているように、GLテクスチャ上のRAM使用の制約はかなり緩和されています。

関連する問題