声明:本文非原创,来源于各网站、翻译贴。大神勿喷
1.GPU基本理论概念:
中文翻译为“图形处理器”。我们通常就叫它显卡。GPU同时也是2D显示卡和3D显示卡的区别依据,2D显示芯片在处理3D图像和特效时主要依赖CPU的处理,称为“软加速”;3D显示芯片是将三维图像和特效处理功能集中在显示芯片内,也即所谓的“硬件加速”功能。GPU和CPU之间通过RAM内存进行数据交换。在手机主板上,GPU芯片一般都是紧挨着CPU芯片的。
以前的智能机,基本不带GPU,所有的软件、游戏都是由CPU进行处理,呈现在屏幕上。但是CPU的图形处理能力很低很低,这也导致了传统的智能手机玩稍微大一点的游戏往往力不从心,大型3D游戏更是成为了奢望。
GPU不仅仅是负责必要的3D处理,准确地说,它将所有图形显示功能从CPU那里都接管了过来,并且还提供了视频播放、视频录制和照相时的辅助处理,使得CPU被大大解放,可以专心地处理纯指令,而不再需要去负责繁重的图形处理任务了。系统的3D性能得到极大的提升
GPU处理的东西 主要是顶点(vertex)和像素(pixel),这两东西一般有四个属性:
vertex: xyzw,就是坐标了
pixel:RGBA,就是颜色RGB加上透明度Alpha通道
2.纹理格式(16位):
纹理的像素格式是图像存储在GPU内存的方式;cocos2d中默认的像素格式是RGBA8888
16位纹理的不足之处:它由于颜色总量的减少,有一些图片显示起来可能会失真,而且可能会产生“梯度”。
1)RGBA8888:
红色通道、绿色通道、蓝色通道和alpha 通道各8位。
优点:如果想获得最好的图片质量,使用这种格式是很靠谱的。
缺点:但它会占用的内存会比16位的纹理多一倍自然的,它的运算速度也是相对较慢的。也就会降低他的FPS
常用场景:整个场景的背景图片、大量渐变色的图片。
2)RGBA4444:
红色通道、绿色通道、蓝色通道、alpha通道各4位。
优点:它对每个通道都有不错的支持,还能保证相对良好的速度和内存占用率,并且透明效率与RGBA8888格式的纹理差别不是很大
缺点:由于颜色总量减少至4096,所以,RBGA4444是16位图片格式里面颜色质量最差的。
常用场景:图片包含有半透明的区域
3)RGB5A1:
红、绿、蓝三色通道各5位,Alpha通道仅有1位
优点:它在内存占用和速度上表现不错。
缺点:图片要么只能全部是透明像素,或者全部是不透明的像素。因为一位的alpha通道的缘故,所以没有中间值。
常用场景:精灵需要透明度上的表现
4)RGB565:
红色通道5位,绿色通道6位,蓝色通道5位,没有Alpha通道
优点:对于16位的纹理来说,使用RGB565可以获得最佳颜色质量
缺点:除非图片是矩形的并且你不需要透明度的支持
常用场景:游戏中的背景图片和一些矩形的用户控件
3.压缩纹理:
3.1常用的图像文件格式有BMP,TGA,JPG,GIF,PNG等;
文件格式是图像为了存储信息而使用的对信息的特殊编码方式,它存储在磁盘中,或者内存中,但是并不能被GPU所识别,因为以向量计算见长的GPU对于这些复杂的计算无能为力。这些文件格式当被游戏读入后,还是需要经过CPU解压成R5G6B5,A4R4G4B4,A1R5G5B5,R8G8B8,A8R8G8B8等像素格式,再传送到GPU端进行使用
3.2常用的纹理格式有R5G6B5,A4R4G4B4,A1R5G5B5,R8G8B8, A8R8G8B8等。
纹理格式是能被GPU所识别的像素格式,能被快速寻址并采样。比如说DDS文件是游戏开发中常用的文件格式,它内部可以包含A4R4G4B4的纹理格式,也可以包含A8R8G8B8的纹理格式,甚至可以包含DXT1的纹理格式。在这里DDS文件有点容器的意味。
3.3常见的压缩纹理格式:
1)ETC1:
ETC1格式是OpenGL ES图形标准的一部分,并且被所有的Android设备所支持。
扩展名为: GL_OES_compressed_ETC1_RGB8_texture,不支持透明通道,所以仅能用于不透明纹理。
当加载压缩纹理时,<internal format>参数支持如下格式:
a.GL_ETC1_RGB8_OES(RGB,每个像素0.5个字节)
2)PVRTC:
支持的GPU为Imagination Technologies的PowerVR SGX系列。
OpenGL ES的扩展名为: GL_IMG_texture_compression_pvrtc。
当加载压缩纹理时,<internal format>参数支持如下几种格式:
a.GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG (RGB,每个像素0.5个字节)
b.GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG (RGB,每个像素0.25个字节)
c.GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG (RGBA,每个像素0.5个字节)
d.GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG (RGBA,每个像素0.25个字节)
3)ATITC:
支持的GPU为Qualcomm的Adreno系列。
支持的OpenGL ES扩展名为: GL_ATI_texture_compression_atitc。
当加载压缩纹理时,<internal format>参数支持如下类型的纹理:
a.GL_ATC_RGB_AMD (RGB,每个像素0.5个字节)
b.GL_ATC_RGBA_EXPLICIT_ALPHA_AMD (RGBA,每个像素1个字节)
c.GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD (RGBA,每个像素1个字节)
4)S3TC:
也被称为DXTC,在PC上广泛被使用,但是在移动设备上还是属于新鲜事物。支持的GPU为NVIDIA Tegra系列。
OpenGL ES扩展名为:GL_EXT_texture_compression_dxt1和GL_EXT_texture_compression_s3tc。
当加载压缩纹理时,<internal format>的参数有如下几种格式:
a.GL_COMPRESSED_RGB_S3TC_DXT1 (RGB,每个像素0.5个字节)
b.GL_COMPRESSED_RGBA_S3TC_DXT1 (RGBA,每个像素0.5个字节)
c.GL_COMPRESSED_RGBA_S3TC_DXT3 (RGBA,每个像素1个字节)
d.GL_COMPRESSED_RGBA_S3TC_DXT5 (RGBA,每个像素1个字节)
3.4 小结:
由此可见,Mali系列GPU只支持ETC1格式的压缩纹理,而且该纹理不支持透明通道,有一定局限性。
以上压缩纹理格式每个像素大小相对A8R8G8B8格式的比例,最高压缩比是16:1,最低压缩比是4:1。
对于减小纹理的数据容量有明显作用,相应在显存带宽上也有明显优势,从而提高游戏的运行效率