解释iOS PVRTC的Alpha通道限制

解读

面试官问“PVRTC的Alpha通道限制”,并不是想听你背格式名称,而是考察三点:

  1. 是否真在iOS真机调过纹理压缩,知道PVRTC 4bpp与2bpp两种模式在Alpha支持上的差异;
  2. 能否把限制量化成内存、显存、包体、发热的连锁反应,并给出Unity里的规避方案;
  3. 是否理解苹果生态“必须PVRTC”的硬规则(A11之前GPU只硬解PVRTC),从而把技术决策与商业成本挂钩。
    答不到“量化”和“商业成本”,就会被判定为“只看过文档,没上过线”。

知识点

  1. PVRTC核心规格
    • 仅PowerVR GPU原生硬解,iPhone 3GS~iPhone X必须用它才能省显存。
    • 4 bpp为单位压缩,一张1024×1024只需2 MB,RGB与RGBA同体积。
  2. Alpha通道两种打包策略
    • PVRTC 4bpp RGBA:双平面存储,RGB与Alpha各2 bpp,Alpha只有1 bit精度,渐变区域会出现肉眼可见的阶梯。
    • PVRTC 2bpp RGBA:Alpha同样1 bit,且RGB精度再砍半,色带与锯齿更严重
  3. Unity导入面板对应名称
    • iOS Settings → Format → PVRTC RGBA 4 bit2 bit;若选“Automatic”且带透明,Unity默认给你4 bit。
  4. 量化限制
    • Alpha只能表示全透明或全不透明,半透明渐变会强制抖动成“打孔”边缘。
    • 当美术用8 bit Alpha做渐隐UI、烟雾、特效时,PVRTC 4 bpp的PSNR比ASTC 6×6低~8 dB,真机肉眼可见“噪边”。
  5. 商业连锁反应
    • 若强行改用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等老机型不掉帧、不发热、包体不膨胀。

拓展思考

  1. 苹果A11之后GPU支持ASTC,但渠道数据里iPhone 6/6 Plus仍占国内DAU 8 %以上,直接放弃PVRTC等于主动损失千万级用户;
  2. 可编程渲染管线(URP/HDRP)下,SRP Batcher对双图纹理同样生效,只要两张贴图同处一个Shader Variant,DC不会进一步膨胀;
  3. 若项目已用Addressables做热更,把Alpha拆图方案做成Build Script,打iOS包时自动输出两张PVRTC,Android包输出一张ASTC,可在零代码改动下实现跨平台差异化压缩,将包体差异压缩到±3 %以内;
  4. 未来若上线Vision Pro,PVRTC被苹果官方标记为Deprecated,但同一套拆图逻辑可无缝迁移到ASTC 6×6,保护既有资产不返工