Loading

Metal RT压缩

iOS设备的屏幕分辨率越来越高,渲染时需要的RT的分辨率和内存的开销都更高了。苹果官方在2021年发布的A15 Bonic芯片中支持了RT的lossy压缩,可以减少50%的内存footprint。

MetalRT压缩是什么?

Apple在2018年就已经提供了RT的lossless压缩方案,可以节省带宽,从而降低功耗。在A15 Bonic芯片中,支持了lossy的压缩方案,并且可以最大限度地保证画面的质量。它的优势有:

  1. 节省50%的内存
  2. 尽可能地保证了画面质量
  3. RT可以使用

当一个RT的数据被写到系统memory之前,会由compression unit压缩。lossless的压缩无法保证压缩比,因为为了保证图像质量,它会申请足够的内存用于容纳全部未压缩的texture数据。
而lossy压缩可以省下50%的内存,因为它牺牲了部分区域的保真度。

image.png

但肉眼很难看出来lossy与lossless的图像差异。
image.png

Lossy compression可以支持部分我们常用的Pixel格式,如RGBA8,RGBA16F,RG16等,比较遗憾的是不支持移动端常用的R11G11B10Float;可以支持RT、Blit操作;需要texture的storage是private的。
image.png

如何实现?

- (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];
}

参考文档

posted @ 2024-12-26 17:42  silence394  阅读(87)  评论(0)    收藏  举报