iOS设备的屏幕分辨率越来越高,渲染时需要的RT的分辨率和内存的开销都更高了。苹果官方在2021年发布的A15 Bonic芯片中支持了RT的lossy压缩,可以减少50%的内存footprint。
MetalRT压缩是什么?
Apple在2018年就已经提供了RT的lossless压缩方案,可以节省带宽,从而降低功耗。在A15 Bonic芯片中,支持了lossy的压缩方案,并且可以最大限度地保证画面的质量。它的优势有:
- 节省50%的内存
- 尽可能地保证了画面质量
- RT可以使用
当一个RT的数据被写到系统memory之前,会由compression unit压缩。lossless的压缩无法保证压缩比,因为为了保证图像质量,它会申请足够的内存用于容纳全部未压缩的texture数据。
而lossy压缩可以省下50%的内存,因为它牺牲了部分区域的保真度。
但肉眼很难看出来lossy与lossless的图像差异。
Lossy compression可以支持部分我们常用的Pixel格式,如RGBA8,RGBA16F,RG16等,比较遗憾的是不支持移动端常用的R11G11B10Float;可以支持RT、Blit操作;需要texture的storage是private的。
如何实现?
- (id<MTLTexture>)createLossyTextureWithDevice:(id<MTLDevice>)device size:(CGSize)size {MTLTextureDescriptor *texDesc = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatRGBA8Unorm width:size.width height:size.height];texDesc.compressionType = MTLTextureCompressionTypeLossy;texDesc.storageMode = MTLStorageModePrivate;return [device newTextureWithDescriptor:texDesc];
}
参考文档
- https://developer.apple.com/videos/play/tech-talks/10876/
- https://www.cnblogs.com/minggoddess/p/14279531.html