今天看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