开发者

Android: OpenGL textures too large, can't figure out why

开发者 https://www.devze.com 2023-04-10 15:17 出处:网络
Why do my textures seemingly take up so much space? My app, which uses opengl heavily, produces the following heap stats*during operation:

Why do my textures seemingly take up so much space?

My app, which uses opengl heavily, produces the following heap stats* during operation:

Used heap dump 1.8 MB 
Number of objects 49,447 
Number of classes 2,257 
Number of class loaders 4 
Number of GC roots 8,551 
Format hprof 
JVM version  
Time 1:08:15 AM GMT+02:00 
Date Oct 2, 2011 
Identifier size 32-bit 

But, when I use the task manager on my phone to look at the ram use of my application it says my app uses 44.42MB. Is there any relationship between heap size use and ram use? I think much of that 42MB must be my open GL textures, but I can't figure out why they take up so much space, because on disk all the files together take only take up 24MB (and they are not all loaded at the same time). And I'm even making many of them smaller by resizing the bitmap prior to texture loading. I also dynamically create some textures, but also destroy those textures after use.

I am using OpenGL 1.0 and Android 2.2, typical code that I use to load a texture looks like this:

static int set_gl_texture(Bitmap bitmap){

        bitmap = Bitmap.createScaledBitmap(bitmap, 256, 256, true);
        // generate one texture pointer
        mGL.glGenTextures(1, mTextures, 0);
        mGL.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[0]); // A bound texture is
                                                            // an active texture


        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0,GL10.GL_RGBA, bitmap, 0);

        // create nearest filtered texture
        mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
                GL10.GL_LINEAR); // This is where the scaling algorithms are
        mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
                GL10.GL_LINEAR); // This is where the scaling algorithms are
        mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
                GL10.GL_CLAMP_TO_EDGE);
        mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
                GL10.GL_CLAMP_TO_EDGE);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

        bitmap.recycle();
        Log.v("GLSurfaceView", "Loading Texture Finished, Error Codes:"+mGL.glGetError());
        return mTextures[0];
    }

Code which I use to load bitmaps looks like the following:

public int load_texture(int res_id){

            if(mBitmapOpts==null){
                mBitma开发者_如何转开发pOpts = new BitmapFactory.Options();
                mBitmapOpts.inScaled = false;
            }

            mBtoLoad = BitmapFactory.decodeResource(MyApplicationObject.getContext().getResources(),res_id, mBitmapOpts);

            assert mBtoLoad != null;

            return GraphicsOperations.set_gl_texture(mBtoLoad);

        }

*hprof file analyzed using mat, same data is generated by eclipse ddms


PNGs are compressed images. In order for OpenGL to use them, the pngs must be decompressed. This decompression will increase the memory size.

You may want to decrease the size of some of the textures somehow. Maybe instead of using 512x512 images, use 256x256 or 128x128. Some textures that you use may not need to be so large since they are going onto a mobile device with a limited screen size.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号