2016-07-18 3 views
0

Я создаю живые обои в Android с помощью OpenGL ES 2.0, и это действительно просто куча текстурированных прямоугольников, плавающих в пространстве. Моя проблема в том, что по какой-то причине загрузка этих текстур поглощает больше памяти, чем дистанционно разумно. Самое крупное изображение - 2078 кб, я загружаю только изображения размером 6-7 мб, а в соответствии с настройками -> Параметры разработчика -> Службы служб, в моем приложении используется 1,3 ГБ памяти.Текстуры Android OpenGL съедают огромные объемы памяти

Когда я удаляю загрузку текстуры, моя проблема, кажется, уходит (33 мб памяти), и, похоже, я не рисую текстуры или нет. Я не совсем уверен, что если

фрагмент кода моей текстуры кода загрузки:

 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 compa ct «только» занимает 154 Мб памяти. Это все еще много, но значительно меньше, чем 1,3 ГБ, которые использует S7.

+0

Каковы размеры изображения в пикселях? –

+0

У меня есть несколько изображений с различными размерами изображений. У меня есть 1920 x 942,1191 x 892, 682 x 920 и т. Д. –

ответ

0

Принимая один из ваших размеров текстур, например, 1191x892 часто округляется до следующей мощности двух измерений с точки зрения занимаемого пространства, поэтому это эквивалентно 2048x1024. Похоже, что вы, вероятно, загружаетесь как 888/8888, которые принимают 32 бита на пиксель, так что это 2048 * 1024 * 4 = 8388608, тогда у вас, вероятно, есть и mipmaps, что дополнительно 33%, 8388608 * 1.33 = 11156848, который близок к 11 МБ только для одной текстуры.

Вы не предоставили достаточно подробностей для разработки, если это может объяснить 1,3 ГБ, которые вы видели, но это, вероятно, объясняет, по крайней мере, 154 МБ.

Я бы рассмотрел формат сжатия ETC1 или 565/4444 и попробовал выбрать более интеллектуальные размеры текстуры.

Смежные вопросы