首页 > 代码库 > cocos2d渲染时候有的显卡要图片是2次幂的 ccNextPOT

cocos2d渲染时候有的显卡要图片是2次幂的 ccNextPOT

今天看cocos2d渲染的机制看到一个神一样的东西ccNextPOT

前言:
cocos2d是基于opengl的,opengl在npot上有的显卡是支持的有的是不支持的,npot意思是是否是2次幂  是否是2的倍数 因为在渲染的时候,好像跟底层要用到傅里叶变换要2次幂【这个没有去探究考证】


源码:cocos2d-x 3.1.1
CRenderTexture类
if (Configuration ::getInstance()->supportsNPOT())
        {
            powW = w;
            powH = h;
        }
        else
        {
            powW = ccNextPOT( w);
            powH = ccNextPOT( h);
        }


int ccNextPOT(int x )
{
    x = x - 1;
    x = x | ( x >> 1);
    x = x | ( x >> 2);
    x = x | ( x >> 4);
    x = x | ( x >> 8);
    x = x | ( x >>16);
    return x + 1;
}


找最小的比x大的2次幂数,也就是要可以等于  把最高位后面的位变成1  之后+1
例如:1011 0011  先变成1111 1111   只会+1等于1 0000 0000

解析源码:[对于32位整数]   图片也没有那么大的
    x = x - 1;//32答案是32所以这里要减1  是大于等于的2次幂
    x = x | ( x >> 1);   把第2高位变成1
    x = x | ( x >> 2);   把第3,4高位变成1
    x = x | ( x >> 4);   把第5,6,7,8高位变成1
    x = x | ( x >> 8);   把第9,10,11,12,13,14,15,16高位变成1
    x = x | ( x >>16);   把第17,18,19........32高位变成1



cocos2d渲染时候有的显卡要图片是2次幂的 ccNextPOT