前语

Metal Petal是一个基于Metal的图画处理框架,旨在通过易于运用的编程界面为静态图画和视频提供实时处理。

中心组件

MetalPetal 的一些中心概念与 Apple Core Image 框架中的概念十分相似。

  • MTIContext,比照CIContext

提供烘托MTIImage的评估上下文。它还存储了大量缓存和状况信息,因而尽可能重用上下文更高效。

  • MTIImage,比照CIImage

MTIImage方针是要处理或生成的图画的表明。它的确直接表明图画位图数据,相反,它具有生成图画或更准确地说是aMTLTexture所需的一切信息。它由两部分组成,一个是怎么生成纹路的配方(MTIImagePromise)和其他信息,例如上下文怎么缓存图画(cachePolicy),以及怎么采样纹路(samplerDescriptor)。

  • MTIFilter,比照CIFilter

MTIFilter表明图画处理效果和操控该效果的任何参数。它产生一个MTIImage方针作为输出。要运用过滤器,您能够创立一个过滤器方针,设置其输入图画和参数,然后访问其输出图画。一般,过滤器类具有静态内核(MTIKernel),当您访问其outputImage特点时,它会要求具有输入图画和参数的内核生成输出MTIImage

  • MTIKernel

MTIKernel表明图画处理例程。MTIKernel担任为过滤器创立相应的烘托或核算管道状况,以及为aMTIImage构建MTIImagePromise

优化

MetalPetal做了许多优化,它会主动缓存函数、内核状况、采样器状况等。

它运用可编程混合、无内存烘托方针、资源堆和金特点能着色器等金属功能来实现快速高效的烘托。在macOS上,MetalPetal还能够运用苹果芯片的TBDR架构

在烘托之前,MetalPetal能够查看您的图画烘托图,并核算出进行烘托所需的最小中心纹路数量,从而节省内存、能量和时刻。

假如能够串联多个“食谱”,以消除冗余的烘托传递,它也能够从头组织图画烘托图。(MTIContext.isRenderGraphOptimizationEnabled

并发性考虑因素

MTIImage方针是不可变的,这意味着它们能够在线程之间安全地同享。

然而,MTIFilter方针是可变的,因而无法在线程之间安全同享。

MTIContext包括许多状况和缓存。MTIContext方针有一个线程安全机制,使得在线程之间同享MTIContext方针是安全的。

比 Core Image 的优势

不同:

Core Image能够运用GPU或者CPU烘托。

MetalPetal主要专心于运用GPU进行烘托。

优势:

  • 完全可定制的极点和片段函数。
  • MRT(多个烘托方针)支撑。
  • 一般来说,功能更好。(需求详细的基准数据)

内置过滤器

  • Color Matrix – 色彩矩阵

  • Color Lookup – 色彩查找

    Uses an color lookup table to remap the colors in an image.

    运用色彩查找表从头映射图画中的色彩。

  • Opacity – 不透明度

  • Exposure – 曝光

  • Saturation – 饱满

  • Brightness – 亮度

  • Contrast – 比照

  • Color Invert – 色彩反转

  • Vibrance – 生机

    Adjusts the saturation of an image while keeping pleasing skin tones.调整图画的饱满度,一起保持令人愉悦的肤色。

  • RGB Tone Curve – RGB腔调曲线

  • Blend Modes – 混合形式

    • Normal – 标准
    • Multiply – 相乘
    • Overlay – 覆盖
    • Screen – 拍摄
    • Hard Light – 硬光
    • Soft Light – 柔软的光线
    • Darken – 变暗
    • Lighten – 减轻
    • Color Dodge – 五颜六色道奇
    • Add (Linear Dodge) – 增加(线性道奇)
    • Color Burn – 色彩焚烧
    • Linear Burn – 线性焚烧
    • Lighter Color – 较浅的色彩
    • Darker Color – 深色
    • Vivid Light – 生动的光
    • Linear Light – 线性光
    • Pin Light – 针灯
    • Hard Mix – 硬混合
    • Difference – 区别
    • Exclusion – 排斥
    • Subtract – 减去
    • Divide – 分裂
    • Hue – 顺化
    • Saturation – 饱满
    • Color – 色彩
    • Luminosity – 亮度
    • ColorLookup512x512 – 色彩查找512×512
    • Custom Blend Mode – 自界说混合形式
  • Blend with Mask – 与遮罩混合

  • Transform – 改变

  • Crop – 裁剪

  • Pixellate – 像素

  • Multilayer Composite – 多层复合材料

  • MPS Convolution – MPS卷积

  • MPS Gaussian Blur – MPS高斯含糊

  • MPS Definition – MPS界说

  • MPS Sobel – MPS Sobel

  • MPS Unsharp Mask – MPS不明显的遮罩

  • MPS Box Blur – MPS盒子含糊

  • High Pass Skin Smoothing – 高通皮肤滑润

  • CLAHE (Contrast-Limited Adaptive Histogram Equalization) – CLAHE(比照度限制自适应直方图均衡)

  • Lens Blur (Hexagonal Bokeh Blur) – 镜头含糊(六角形散景含糊)

  • Surface Blur – 外表含糊

  • Bulge Distortion – 隆起失真

  • Chroma Key Blend – 色度键混合

  • Color Halftone – 色彩半色彩

  • Dot Screen – 点屏

  • Round Corner (Circular/Continuous Curve) – 圆角(圆形/接连曲线)

  • All Core Image Filters – 一切Core Image滤镜,配合MTICoreImageUnaryFilter运用

最佳实践

  • 尽可能重复运用MTIContext

上下文是重量级方针,因而,假如您的确创立了方针,请尽早创立,并在每次需求烘托图画时重用它。

  • 明智地运用MTIImage.cachePolicy

当您不想保留图画的烘托结果时,请运用MTIImageCachePolicyTransient,例如当图画仅仅过滤器链中的中心结果时,因而烘托结果的底层纹路能够重复运用。这是内存效率最高的选项。但是,当您要求上下文烘托之前烘托的图画时,它可能会从头烘托该图画,因为它的基础纹路已被重用。

默许情况下,过滤器的输出映像具有transient战略。

当您想防止底层纹路被重复运用时,请运用MTIImageCachePolicyPersistent

默许情况下,从外部来源创立的图画具有persistent战略。

  • 了解MTIFilter.outputImage是一个核算特点。

每次您要求过滤器输入其输出图画时,即使输入与前次调用相同,过滤器也可能为您提供新的输出图画方针。因而,尽可能重复运用输出图画。

例如,

//          ╭→ filterB
// filterA ─┤
//          ╰→ filterC
// 
// filterB and filterC use filterA's output as their input.

在这种情况下,以下解决方案:

let filterOutputImage = filterA.outputImage
filterB.inputImage = filterOutputImage
filterC.inputImage = filterOutputImage

比以下更好:

filterB.inputImage = filterA.outputImage
filterC.inputImage = filterA.outputImage