2016-07-18 4 views
0

私はOpenGL ES 2.0を使用してAndroidでライブ壁紙を作成していますが、実際にはスペースに浮かぶテクスチャ付きの四角形です。私の問題は、何らかの理由でこれらのテクスチャをロードすると、リモートで妥当なものより多くのメモリを消費していることです。私の最大の画像は2078 kbで、私は約6〜7 MBの画像しか読み込みません。設定 - >開発者オプション - >実行中のサービスデータによれば、私のアプリは1.3 GBのメモリを使用しています。Android OpenGLの読み込みテクスチャは膨大な量のメモリを奪います

テクスチャの読み込みを取り除くと、問題は消えてしまいます(33MBのメモリ)、実際にテクスチャを描画するかどうかは問題にはならないようです。

 Bitmap bmp = sceneSetter.getTexture(DataCodes.ROOM, DataCodes.FOUR_EIGHTY_P, DataCodes.BLUR_NONE); 
    // Bind texture to texturename 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texturenames[0]); 
    // Set filtering 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); 
    //clamp texture to edge of shape 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); 
    // Load the bitmap into the bound texture. 
    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bmp, 0); 

    //texture 1 
    bmp = sceneSetter.getTexture(DataCodes.GIRL, DataCodes.FOUR_EIGHTY_P, DataCodes.BLUR_NONE); 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE1); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texturenames[1]); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); 
    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bmp, 0); 

最後に、これを続く:

bmp.recycle(); 

sceneSetterは、このようなリソースからビットマップを取得し、私は私のテクスチャローディングコードの

コードスニペットがあれば全くわからないんだけど

bmp = BitmapFactory.decodeResource(context.getResources(), R.drawable.testimage); 

編集:私はこれをSamsung S7でテストしていますが、Xperia Z3コンパイラで実行したときそれだけでは154 MBのメモリが必要です。これはまだ多いですが、S7が使用している1.3GBよりも大幅に少なくなっています。

+0

ピクセル単位の画像のサイズは? –

+0

私は様々な画像サイズの複数の画像を持っています。私は1920 x 942,1191 x 892、682 x 920などを持っています。 –

答えて

0

例として、テクスチャサイズのいずれかを取ると、1191x892は2次元の次数に切り上げられることが多く、2048x1024に相当します。おそらく888/8888としてロードしているので、1ピクセルあたり32ビットを取るように見えるので、2048 * 1024 * 4 = 8388608だから、おそらくミップマップもあります。これは余分な33%、8388608 * 1.33 = 11156848、これは1つのテクスチャで11MBに近くなります。

これまで説明した1.3GBについて説明できれば十分な詳細を提供していませんが、少なくとも154MBは説明されているはずです。

私はETC1圧縮形式または565/4444形式を調べてよりスマートなテクスチャサイズを選択しようとします。

関連する問題