前语
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