解释iOS PVRTC的Alpha通道限制
解读
面试官问“PVRTC的Alpha通道限制”,并不是想听你背格式名称,而是考察三点:
- 是否真在iOS真机调过纹理压缩,知道PVRTC 4bpp与2bpp两种模式在Alpha支持上的差异;
- 能否把限制量化成内存、显存、包体、发热的连锁反应,并给出Unity里的规避方案;
- 是否理解苹果生态“必须PVRTC”的硬规则(A11之前GPU只硬解PVRTC),从而把技术决策与商业成本挂钩。
答不到“量化”和“商业成本”,就会被判定为“只看过文档,没上过线”。
知识点
- PVRTC核心规格
- 仅PowerVR GPU原生硬解,iPhone 3GS~iPhone X必须用它才能省显存。
- 以4 bpp为单位压缩,一张1024×1024只需2 MB,RGB与RGBA同体积。
- Alpha通道两种打包策略
- PVRTC 4bpp RGBA:双平面存储,RGB与Alpha各2 bpp,Alpha只有1 bit精度,渐变区域会出现肉眼可见的阶梯。
- PVRTC 2bpp RGBA:Alpha同样1 bit,且RGB精度再砍半,色带与锯齿更严重。
- Unity导入面板对应名称
- iOS Settings → Format → PVRTC RGBA 4 bit 或 2 bit;若选“Automatic”且带透明,Unity默认给你4 bit。
- 量化限制
- Alpha只能表示全透明或全不透明,半透明渐变会强制抖动成“打孔”边缘。
- 当美术用8 bit Alpha做渐隐UI、烟雾、特效时,PVRTC 4 bpp的PSNR比ASTC 6×6低~8 dB,真机肉眼可见“噪边”。
- 商业连锁反应
- 若强行改用ASTC,iPhone 6等老机型会回退成RGBA32,显存暴涨8×,发热降频,用户一小时内掉电增加15 %,渠道包审核可能被卡“异常发热”。
- 若坚持PVRTC,则需拆分Alpha通道为单独一张PVRTC RGB,Shader里采样两次,DrawCall+1,UI界面可能DC翻倍,低端机帧率掉5~8帧。
答案
PVRTC在硬件层面把4 bpp平均拆成RGB与Alpha各2 bpp,导致Alpha只有1 bit精度,无法存储中间半透明值;肉眼表现就是渐变出现硬性锯齿或镂空噪点。在Unity中若直接选PVRTC RGBA 4 bit,UI渐隐、烟雾、特效都会劣化。线上项目通常采用双图策略:主图用PVRTC RGB 4 bit,Alpha拆成另一张PVRTC RGB 4 bit,Shader内采样后合并,牺牲一次采样和DC,但能把显存控制在2 MB/1024²,同时避开1 bit Alpha限制,保证iPhone 6等老机型不掉帧、不发热、包体不膨胀。
拓展思考
- 苹果A11之后GPU支持ASTC,但渠道数据里iPhone 6/6 Plus仍占国内DAU 8 %以上,直接放弃PVRTC等于主动损失千万级用户;
- 可编程渲染管线(URP/HDRP)下,SRP Batcher对双图纹理同样生效,只要两张贴图同处一个Shader Variant,DC不会进一步膨胀;
- 若项目已用Addressables做热更,把Alpha拆图方案做成Build Script,打iOS包时自动输出两张PVRTC,Android包输出一张ASTC,可在零代码改动下实现跨平台差异化压缩,将包体差异压缩到±3 %以内;
- 未来若上线Vision Pro,PVRTC被苹果官方标记为Deprecated,但同一套拆图逻辑可无缝迁移到ASTC 6×6,保护既有资产不返工。