请教大家一个cocos2dx占用内存的问题

自己用cocos2dx的工程创建,测试了一下opengl的纹理占用情况,发现不是简单的长bpp,

比如10241024的RGBA8888的图片,理论上是占用4M的内存,我实际发现是6M多, 20482048的占用了25M多,

发现是正常情况的1.5倍

我测试方法是断点到glTexImage2D(GL_TEXTURE_2D, i, info.internalFormat, (GLsizei)width, (GLsizei)height, 0, info.format, info.type, data);函数

然后查看内存,执行完这句之后再查看内存

大家有比较了解opengl的吗,不知道这个是什么原因,测试就是正常的cocos2dx生成的工程,自己在3.0beta和2.2版本都测试过,都是一样的结论,

hi
openGL纹理有mipmap,打个比方:一个10241024的贴图,但是GL会给你生成512512,256256…11的贴图,所以占用不是原始的4M 。
你可以找找mipmap相关的资料。

1赞

谢谢版主的回复,

我自己测试的时候看了这个mipmap值是1呀

for (int i = 0; i < mipmapsNum; ++i)
{
unsigned char data = mipmaps.address;
GLsizei datalen = mipmaps.len;

    if (info.compressed) 
    { 
        glCompressedTexImage2D(GL_TEXTURE_2D, i, info.internalFormat, (GLsizei)width, (GLsizei)height, 0, datalen, data); 
    } 
    else 
    { 
        glTexImage2D(GL_TEXTURE_2D, i, info.internalFormat, (GLsizei)width, (GLsizei)height, 0, info.format, info.type, data); 
    } 

    if (i > 0 && (width != height || ccNextPOT(width) != width )) 
    { 
        CCLOG("cocos2d: Texture2D. WARNING. Mipmap level %u is not squared. Texture won't render correctly. width=%ld != height=%ld", i, width, height); 
    } 

    GLenum err = glGetError(); 
    if (err != GL_NO_ERROR) 
    { 
        CCLOG("cocos2d: Texture2D: Error uploading compressed texture level: %u . glError: 0x%04X", i, err); 
        return false; 
    } 

    width = MAX(width >> 1, 1); 
    height = MAX(height >> 1, 1); 
} 

能确认这个循环就执行了一次, 您的意思是glTexImage2D这个函数内部执行又会生成mipmap吗?
我理解您的意思应该是上述代码总循环占用的内存,我自己实测是1024
1024的图, 仅有一个mipmap,也就是说不用mipmap的情况下, 一执行glTexImage2D就增长了6M, 另外自己试过用一个964*680的图RGBA8888的png,这个图加载就增长了4M。 谢谢您的解答

又看了一遍代码,应该是没有使用mipmap贴图方式,增长的内存是一次加载图片的开销,测试环境win7下 2.2和3.0alpha beta都测试过

建议兄弟去了解一下mipmap的原理和openGL的实现,mipmap是可以自动生成的。

谢谢版主了