-
主题背景
目的:一次尝试,希望自己能够有一个比较初始的认识,并且提起进一步学习的兴趣
为什么可以关注到Metal呢?
Metal更新日志:(更新WWDC上发布的Metal新特性)
- WWDC 2014,发布了 Metal,仅支持 iOS 8 以及 A7 以上的设备。
- WWDC 2015,Metal 支持在 OS X 上运行,2012 之后生产的,系统版本在 El Capitan(10.11)之上的 Mac 设备。
- WWDC 2016,Metal 性能优化,一些新技术,比如Tessellation(曲面细分)可用于实现细节层次,高效调整以适应不同材质等。最重要的应该是引入了 Metal Performance Shaders,内置了一系列常用的图像处理 kernel,方便进行图像效果处理。
- WWDC 2017,发布了 Metal 2。名字上是图形 API 更新,实际上更多是内部实现的优化,以及加入一系列调试工具,API 层面并没有多大改变。硬件方面要求一致,系统版本支持 iOS 11,macOS High Sierra,tvOS 11。
- WWDC 2018,iOS 12 之后弃用 OpenGL ES,系统的一些框架全面改成默认 Metal 支持。
- WWDC2019,Metal2.2性能提升, 现在可以进行 100 倍于 OpenGL 的绘图调用
- WWDC2020,从英特尔片上系统 (SoC) 迁移到新品牌的 Apple Silicon,Metal性能提升
- WWDC2021,Metal Shading Language (MSL)2.4
- WWDC 2022,Metal3升级 MetalFX 升级、快速资源加载、离线着色器编译、网格着色器、PyTorch 支持
年年 WWDC,Metal 都有新内容输出,这样的维护力度,可见 Apple 对其的重视。
Metal是什么呢
Metal 名字来源是因为 Metal 是 iOS 平台中最底层的图形框架 (意指 "最接近硬件")。
Metal 是一个和 OpenGL ES 类似的面向底层的图形编程接口,通过使用相关的 api 可以直接操作 GPU 。
其核心目的是尽可能的减少CPU开销,而将运行时产生的大部分负载交由GPU承担。
为什么是GPU呢,因为CPU擅长逻辑控制,串行运算。GPU擅长大规模并发计算和浮点计算优化。
- ALU 计算单元
- Cache 高速数据交换存储器
- DRAM 动态随机存取存储器,常见的系统内存
Metal主要可以做什么?
Metal框架支持GPU硬件加速、高级3D图形渲染以及大数据并行运算。且提供了先进而精简的API来确保框架的细粒度(fine-grain),并且在组织架构、程序处理、图形呈现、运算指令以及指令相关数据资源的管理上都支持底层控制。
- 高性能图形渲染
- 并行计算,机器学习训练模型(结合TensorFlow、PyTorch、CoreML等进行模型训练)
有什么优势?
相较于OpenGL,性能更占优势
相对于CoreImage 使用更加灵活、更强大
对当前开发有什么作用?
- 整理出一个明确的学习路径
- 预研,OpenGL到Metal的迁移 难度和注意点
- 性能调优新思路:GPU使用和性能优化 和监测 (GPU性能分析工具Instrument)
- 了解一些新的名词,能够有个模糊的概念,激发学习和探索的热情
- 可能成为机器学习流行框架的敲门砖。
Metal概貌,需要了解什么呢,又有哪些模块呢?
见下文。
-
学习过程
Metal的“Hello world”
Metal的“Hello World”教程,
渲染方向的是 Using Metal to Draw a View’s Contents (使用MetalKit 快速实现填充背景色)
Using a Render Pipeline to Render Primitives (画三角形,使用渲染通道配绘制过程)
计算方向的是 Performing Calculations on a GPU (这个教程讲的是两个数组求和)
Metal学习模块
通过配置运动、像素色值和深度信息,选择性的降低输入分辨率,从而节省GPU使用时间。
使用MetalKit封装好的API,可快速实现自定义绘制流程。
- Metal Performance Shaders framework
提供了内核级别的调度Metal GPU的计算单元,很多优化后的计算和渲染Shaders,来优化图形计算和渲染表现,充分利用GPU的硬件特性。并且不用手动维护自己的shader资源,会一直存储直到app删除。
- 将高性能图像滤镜效果,并从图像中提取统计数据和直方图数据。
- 实施和运行用于机器学习训练和推理的神经网络。
- 求解方程组、分解矩阵以及乘以矩阵和向量。
- 通过高性能光线几何相交测试加速光线追踪。
- Metal Shading Language Specification
Metal着色器语言,编写更高阶的性能和绘制需求。
MSL语言编写metal的shader代码,基于C++,便于使用。运行在GPU上的图形和数据层计算。和Metal 框架配合使用,metal使用LLVM和clang编译,充分利用其可调试的特点,使用更便捷。
内容:Data Types(buffer、sampler、texture)Operators、Address Spaces、Function and Variable Declarations、Metal Standard Library、Numerical Compliance(数型转换规则)
Metal基础框架
Metal使用过程中,主要是以下三类对象:
Resource:可以用来调配GPU可访问的容器,来存储和管理相关数据,MTLBuffer和MTLTexture
Function:编写自定义的函数,让GPU计算处理数据。MTLFunction、MTLLibrary等
Commands: 组织、提交和执行应用程序的GPU命令。包括MTLCommandQueue、MTLCommandBuffer、MTLCommandEncoder等。
示例:图片中人眼放大
拆分为以下几步:
- 创建一个视图,用来展示结果图
- 提供原图,以供进行效果处理
- 提供原图中,眼睛区域,以便指定区域进行处理
- 提供眼睛放大的处理算法
- 提交给 GPU 处理
- 视图显示处理完的结果图
结合眼睛放大实例,Resourcs 对应原图,眼睛区域这类的数据。 Function 对应眼睛放大算法。Commands 则体现在提交给 GPU 处理。
相关概念:
- GPU Devices
获取当前GPU信息——GPU可用指令集、支持的软件版本信息
- Command Encoders
- 渲染通道
- 计算通道
- 位块信息传输通道(GPU缓冲区、纹理和其他资源之间,CPU和GPU之间可用内存间复制内容,管理和内存布局)
- Indirect Command Encoding,间接编码,支持缓存Metal命令到缓存区供重复调用
- Ray Tracing 光学追踪,更准确地模拟光的行为,可增强现实的真实性(现在仅仅支持在silicon GPU上运行)
- Resources
Resource——存储数据到缓冲区和纹理中,可以管理底层GPU、CPU内存
Buffers 非结构化的数据缓存
Textures 结构化的数据缓存,可作为着色器的输入、输出的像素或视图附件
Memory Heaps可以管理Buffers和Textures数据
Resource loading 资源加载过程
Resource Synchronization 资源数据同步
可创建Metal Dynamic Library,共享已有Shader
- Presentation
HDR(High-Dynamic Range)高动态光照渲染,我们在光暗对比明显的环境下拍摄,摄像头因受到动态范围的限制,测光点设置在取景框亮的地方,整个画面就会为了优先表现明亮的地方而让周围变暗,如果测光点在暗的地方,就会优先表现暗部细节而让画面过度提亮,这样出来的照片不是过曝就是欠曝,不能同时纪录极端亮或者暗的细节。
而经过HDR处理过的照片,即使在明暗对比强烈的情况下拍摄,无论高光、暗部都能表现出来,画面不会过亮或者暗部细节一团黑。能让照片更有层次感。
- Development Tools
- Apple Silicon
MetalKit****
快速绘制屏幕View和使用Metal。
主要的实用功能组:View Management、Texture Loading、Model Handling。
示例代码:Using Metal to Draw a View’s Contents
介绍了MTKView和MTKViewDelegate,了解视图渲染可编程流程
基础概念Fundamentals
设备支持API Device Support
func MPSSupportsMTLDevice(MTLDevice?) -> Bool
- 滤镜组 Image Filters 高性能滤镜应用,以及从图片内容采集统计数据和直方图数据
- 神经网络 Neural Networks
- 顶点和片原着色 Matrices and Vectors
- 光学追踪Ray Tracing
- 内核级别类Kernel Base Classes
- 钥匙链存储Keyed Archivers
- 相关类和协议熟悉Classes&Protocols
-
总结思考
Metal框架初探,因为了解的深度不够,而且还不够全面,有很多知识盲区,所以,还要大家多评价指正。
WWDC2022 关注点:Metal3升级
- MetalFX 升级
借助高性能放大和抗锯齿功能,每帧渲染复杂场景的时间更短。选择时间或空间算法的组合以帮助提高性能。
- 快速资源加载
使用异步 I/O 将资产数据直接从存储优化流式传输到 Metal 纹理和缓冲区。
- 离线着色器编译
编译器可以在项目构建时生成 GPU 二进制文件,以消除应用内着色器编译,帮助游戏提高性能并减少加载时间。
Mas着色器
这个新的几何管道用两个新的着色器阶段(对象和网格)替换了顶点着色器,从而实现更灵活的剔除和 LOD 选择,以及更有效的几何着色和生成。
- PyTorch 的Metal后端
PyTorch 1.12 版中的新 Metal 后端支持使用 MPS Graph 和 Metal Performance Shaders 原语进行高性能、GPU 加速的训练。
LearnMetal代码值得注意的有:
特效效果-多buffer特效实现的可能性🤔
就是要尽可能的减少空闲时间,使得 CPU 和 GPU 最大程度的被利用起来,从而更快的完成任务、实现更流畅的效果。
绿幕视频合成: Mask & 抠图换背景
长腿增高效果
Metal与OpenGL传递纹理
风格化滤镜:
模糊的原理和 Zoom Blur 的具体实现,以及系统提供的景深信息等
借助相关训练好的模型,通过 Core ML 来实现这个风格切换的效果。
参考
Metal示例代码:Metal Sample Code Library | Apple Developer Documentation