关于npot 和 pot 占用内存(就是图片是否是2的n次幂)

wiki链接
NPOT Texture
Rectangle Texture
之前一直使用的texpacker打包的pot纹理,官方推荐使用Npot的纹理,但是studio打包的也是Pot纹理啊。
测试出来确实是Npot占用的内存比Pot的要小。
Npot纹理大小是1024x1025RGBA8888是不是就使用1024x1025x4个字节呢?
不使用mipmaps的时候就是mipmaps的num是1的时候 cocos是否会转成1024x2048大小的纹理呢?
Rectangle Texture说他们是不同纹理类型

Rectangle textures are very special texture types.
 They are two-dimensional, but they are not textures of the type GL_TEXTURE_2D.
 They have their own separate texture type: GL_TEXTURE_RECTANGLE.

然后初始化要用
glTexImage2D(GL_TEXTURE_RECTANGLE, 0, internalformat​, width​, height​, 0, format​, type​, data​);
但是cocos加载的时候我发现并没有判断是否应该使用GL_TEXTURE_RECTANGLE而是直接用的GL_TEXTURE_2D

创建sprite的时候会初始化纹理走到Texture2D::initWithDataTexture2D::initWithMipmaps
我看到初始化的方式是

 if (mipmapsNum == 1)
    {
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, _antialiasEnabled ? GL_LINEAR : GL_NEAREST);
    }else
    {
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, _antialiasEnabled ? GL_LINEAR_MIPMAP_NEAREST : GL_NEAREST_MIPMAP_NEAREST);
    }

用NPOT的图片确实占用少了,但是为什么呢?测试平台是IOS
还要shader里面都是texture2d的类型啊,那使用shader的话是不是npot的纹理会转化成pot啊?

然后之前子龙的文章说IOS在使用POT的时候opengl会自动生成mipmap导致会增加33%的内存占用。

The mipmap chain will take 33% extra space, 
as the mipmap chain approximates 1/3 extra - 
see the below series where t is the size of the original
 texture: = t + t/4 + t/16 + t/64 etc... 

那么Android设备不会这样吧?

那么官方问什么推荐使用NPOT呢?Tips-amp-Tricks

@minggo
@zilong
@panda
@jare

OpenGL ES 2.0开始支持了NPOT,这样比较省内存,就如你说的。只有要使用mipmaps时才要求是POT。

是不是使用mipmaps也可以使用npot的?
Mip-mapping with such textures can have slightly unintended consequences, compared to the power-of-two case.
我看wiki上说会有轻微影响
又看了下opengl texuture的wiki
When using texture sizes that are not powers of two, the half-size of lower mipmaps is rounded down. So a 63x63 texture has as its next lowest mipmap level 31x31. And so on.
感觉没啥影响哈