PVRTC 支持的GPU为Imagination Technologies的PowerVR SGX系列。 OpenGL ES的扩展名为: GL_IMG_texture_compression_pvrtc。 当加载压缩纹理时,参数支持如下几种格式: GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG (RGB,每个像素0.5个字节) GL_COMPRESSED_RGB_PVRTC_2BPPV1 _IMG (RGB,每个像素0.25个字节) GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG (RGBA,每个像素0.5个字节) GL_COMPRESSED_RGBA_PVRTC = string::npos); 6)判断是否支持PVRTC格式的压缩纹理 return (extensions.find("GL_IMG_texture_compression_pvrtc")!
在Texture2D的设置选项中,你可以针对不同的平台,设置不同的压缩格式,如IOS设置成PVRTC4,安卓平台设置成RGBA16等 ? 纹理压缩可以通过减少内存来显著地提高OpenGL的性能,使内存使用的效率更高 问题:无法兼容多个平台的问题,在Android平台,使用ETC1纹理+Alpha通道图的方式;IOS平台,使用PVRTC4 低清晰高压缩 - ETC1+Alpha/PVRTC4 很多初学者都会疑惑,为什么游戏开发中经常看到一些图片,需要设置成2的次方? 因为像ETC1、PVRTC4等这类在内存中无需解压、直接被GPU支持的格式,占用内存极低,而且性能效率也是最好的。 但是,相对RGBA32,还是能肉眼看出质量有所下降的。 image Paste_Image.png PVRTC4 PVRTC4在Unity中是直接支持的,不过要注意的细节是,它必须是二次方正方形;也就是说,长宽在二次方的同时,还必须要相等。
ETC2只有OPENGL3.0支持,PVRTC是Imagination PowerVR提供的,ATC是Qualcomm Snapdragon提供的。一般来说,IOS只支持PVRTC的压缩格式。 关于压缩后的在储存上的大小,假设高清(ARGB32)大小为1,那么大概数据如下: RGB PVRTC 4BITS:0.25 ARGB PVRTC 4BITS:0.25 RGB PVRTC 2BITS:0.13 ARGB PVRTC 2BITS:0.13 RGBA ETC2 4BITS:0.25 RGBA ETC2 8BITS:0.25 RGB + 1-bit ALPHA ETC2 8BITS:0.2 DXT1 内存中的大小,假设高清(ARGB32)大小为1,那么大概数据如下: RGB PVRTC 2BITS:0.0625 ARGB PVRTC 2BITS:0.0625 RGB PVRTC 4BITS:0.125 正方贴图: IOS下: a.普通不透明:RGB PVRTC 4BITS b.普通透明:RGBA PVRTC 4BITS Android下: a.普通不透明:RGB ETC 4BITS b.普通透明: 因为没有通用最兼容的格式
低清晰高压缩 > ETC1+Alpha/PVRTC4 ETC1不带透明通道, 需要外挂一个携带Alpha图片 使用Shader支持 在Shader 中吧RGB 和 A 合并 RGBA PVRTC4 必须是 2次幂 [Android] ETC1, 不支持dxt [Iphone/Ipand] PVRTC4 压缩默认 RGBA16 清晰度高但是渐变不合适 RGBA32 高保真 16it/尺寸减半 压缩 UI Icon
(32KB, 256x256)RGB Compressed PVRTC 2bits压缩的RGB纹理,支持Imagination PowerVR GPU2位/像素 (16KB, 256x256)RGBA Compressed PVRTC 2bits压缩的RGBA纹理,支持Imagination PowerVR GPU2位/像素 (16KB, 256x256)RGB Compressed PVRTC 4bits PVRTC 2bit")] static void ChangeTextureFormat_RGBA_PVRTC_2bit() { SelectedChangeTextureFormatSettings /RGB PVRTC 4bit")] static void ChangeTextureFormat_RGB_PVRTC_4bit() { SelectedChangeTextureFormatSettings PVRTC 4bit")] static void ChangeTextureFormat_RGBA_PVRTC_4bit() { SelectedChangeTextureFormatSettings
(TextureImporterFormat.PVRTC_RGB2); } [MenuItem ("Custom/Texture/Change Texture Format/RGBA PVRTC 2bit")] static void ChangeTextureFormat_RGBA_PVRTC_2bit() { SelectedChangeTextureFormatSettings /RGB PVRTC 4bit")] static void ChangeTextureFormat_RGB_PVRTC_4bit() { SelectedChangeTextureFormatSettings PVRTC 4bit")] static void ChangeTextureFormat_RGBA_PVRTC_4bit() { SelectedChangeTextureFormatSettings (TextureImporterFormat.PVRTC_RGBA4); } // ------------------------------------------------
no HDR files yes no JPG files (progressive) yes no JPG files yes yes KTX (ETC1) files yes* yes* KTX (PVRTC files yes yes PNG files yes yes PNM (PPM/PGM) files yes no PSD files yes no PUG files yes yes PVR2 (PVRTC ) files yes* no PVR3 (ETC1) files yes* no PVR3 (PVRTC) files yes* yes* SVG files (rasterized) yes no
具体的使用方法可能要参考工具的文档,下面是一个简单的例子: PVRTexToolCLI -i $(infile) -o $(outfile) -square + -pot + -q pvrtcbest -f PVRTC1 _4,UBN,lRGB 其中$(infile)和$(outfile)分别是原图片名和压缩后的图片名,如果图片没有透明,PVRTC1_4换成PVRTC1_4_RGB。
ETC1支持几乎所有市面上的Android机,所有iPhone ETC2支持大部分高端Android机,iPhone 5S及以上 3.3 PVRTC PowerVR Texture Compression ,PVRTC格式与基于块的压缩格式,比如S3TC、ETC的不同之处是,它使用2张双线性放大的低分辨率图,根据精度和每个像素的权重,融合到一起来呈现纹理,并且2-bpp和4-bpp都支持ARGB数据。 PVRTC格式压缩比较高,也是有损压缩。 Alpha 压缩率 适用 PVRTC 2BPP Y 16:1 OpenGLES 2.0 PVRTC 4BPP Y 8:1 OpenGLES2.0 这个系列,是iPhone支持最广的格式 只支持长宽相等且为
增加ETC2\ASTC\PVRTC纹理压缩格式 由于ETC2的纹理压缩格式没有在各平台普及,所以在LayaAir 2.12之前的版本只支持了安卓平台的ETC1纹理压缩格式。 ASTCSRGB_6x6 ASTC_8x8 ASTCSRGB_8x8 ASTC_10x10 ASTCSRGB_10x10 ASTC_12x12 ASTCSRGB_12x12 即使是引擎旧版已支持的纹理压缩格式PVRTC ,在2.12版开始也新增了一种模式选项PVRTC1_4,这是一种4bpp(4 bits per pixel)的压缩模式,提供4:1的压缩系数和图像质量。 而原有提供的iOS默认纹理压缩模式是PVRTC1_2(2bpp压缩模式),提供的是8:1的压缩系数和图像质量。
Basis Universal可有效针对最常见的GPU格式进行优化 Google和Binomial将会合作并继续支持、维护和添加新功能,Basis Universal的初始版本会将源文件转码为以下GPU格式:PVRTC1 未来几个月将会增加更多的功能,包括BC7 transparent、ASTC opaque和alpha、PVRTC1 transparent和更高质量的BC7 / ASTC等。 ?
渲染与优化差异:Android支持ETC2、ASTC等纹理压缩格式,iOS则支持PVRTC、ASTC;GPU渲染管线的优化逻辑也不同,相同的渲染代码在两大系统上的性能表现可能天差地别。3. 例如,在纹理压缩上,通过工具自动生成不同格式的纹理(ETC2 for Android、PVRTC for iOS),实现一次导入,多端适配。3. 例如,Android设备加载ETC2纹理,iOS设备加载PVRTC纹理,减少内存占用和加载时间。 机制兜底入门机卡顿、闪退资源过大、渲染压力过高,内存溢出降低入门机渲染参数,加载简化资源,优化内存管理,避免OOMiOS端资源加载失败资源格式不兼容,未适配iOS资源加载机制将资源转换为iOS支持的格式(PVRTC
压缩格式:Android :推荐使用ETC,如果是带透明通道的,可选择ETC2;Ios:推荐使用PVRTC 4Bit格式 同一个界面出现的 UI 资源尽量放到一个图集,重复利用的公用资源放common。
GPU原生支持一系列压缩格式,如PVRTC,其他格式必须存储为未压缩的图像数据。 纹理图文件可以是PVRTC、PNG或任何Texture2D所支持的文件类型。CCTextureAtlas(纹理图集)可以对纹理图集的矩形进行实时的更新、添加、删除或重排序。
在移动端,Android平台的主流纹理格式是ETC(Ericsson Texture Compression),iOS平台的主流纹理格式是PVRTC(PowerVR Texture Compression 需要特别说明的是,ETC1是不支持透明通道的,PVRTC是支持透明通道的,尽管在ETC2的时候,补全了ETC1不支持的透明通道,但是ETC2需要在OpenGL ES 3.0(对应webGL 2.0 )的环境下 图1 左侧是一张宽高为512*313的PNG图像,右侧是通过LayaAir引擎提供的纹理压缩工具导出的PVRTC格式图像。 ? (图1) 很明显,在运行后,纹理压缩后的图像被拉伸了。 iOS iOS选项是针对iOS平台的纹理压缩,无论是JPG还是PNG,都会被转换为.pvr后缀的PVRTC纹理。 有一些开发者不太理解iOS质量的用处和效果。这里一共5档,数值分别是1-5。
display 尽管苹果的开发文档说到: OpenGL ES 3.0 also supports the ETC2 and EAC compressed texture formats; however, PVRTC 然而我对PVRTC实在是爱不起来,又必须是2的幂,又必须是正方形,最终效果还那么差(4bit一个像素)。所以当A7支持ETC2之后,其实是可以考虑换用ETC2的,这样可以和安卓很好的统一起来。 Configuration::getInstance()->supportsETC2()) { CCLOG("cocos2d: WARNING: PVRTC/ETC/ETC2 images are
优化纹理和几何体:减少纹理尺寸,使用压缩纹理格式,如ETC、PVRTC等。同时,合并小的几何体,减少顶点数据。状态管理优化最小化状态变化:状态变化,如改变纹理、着色器和缓冲区,会减慢渲染管线的速度。
处理器的高端安卓机上,PNG纹理转ETC2后,纹理加载阶段的CPU占用率从25%左右降至12%;在搭载Mali-G710 GPU的中端设备上,显存占用平均降低38%;即便是在iOS设备上,虽然原生支持PVRTC 格式,但ETC2通过Metal架构的兼容适配,其加载速度与渲染效率也能达到PVRTC的90%以上,这种跨平台的性能稳定性,正是ETC2格式的核心竞争力所在。 iPhone 5s及以下机型)上可能存在兼容性问题,此时可通过Unity的动态压缩功能,在运行时根据设备GPU类型自动选择压缩格式:对于支持ETC2的设备使用ETC2格式,对于不支持的设备则自动降级为ETC1或PVRTC
纹理压缩算法,例如 Etc1, Etc2, PVRTC 等,可以优化图片在内存中的体积。 Etc1 绝大部分的安卓设备支持,PVRTC 所有的 iOS 设备支持。 如果图片不需要支持 alpha 通道,安卓选择 Etc1 RGB、iOS 选择 PVRTC 4bits RGB 即可。 如果需要支持 alpha 通道,安卓选择 Etc1 RGB Separate A,iOS 选择 PVRTC 4bits RGBA Separate A。
优化纹理和几何体:减少纹理尺寸,使用压缩纹理格式(如ETC、PVRTC等)。同时,合并小的几何体,减少顶点数据。状态变化最小化:状态变化(如改变纹理、着色器和缓冲区)会减慢渲染管线的速度。