Metal学习

356 阅读9分钟
  1. 主题背景

目的:一次尝试,希望自己能够有一个比较初始的认识,并且提起进一步学习的兴趣

为什么可以关注到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概貌,需要了解什么呢,又有哪些模块呢?

见下文。

  1. 学习过程

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 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,了解视图渲染可编程流程

Metal Performance Shaders****

基础概念Fundamentals

The MPSKernel Class

Tuning Hints

设备支持API Device Support

func MPSSupportsMTLDevice(MTLDevice?) -> Bool

  • 滤镜组 Image Filters 高性能滤镜应用,以及从图片内容采集统计数据和直方图数据
  • 神经网络 Neural Networks
  • 顶点和片原着色 Matrices and Vectors
  • 光学追踪Ray Tracing
  • 内核级别类Kernel Base Classes
  • 钥匙链存储Keyed Archivers
  • 相关类和协议熟悉Classes&Protocols
  1. 总结思考

Metal框架初探,因为了解的深度不够,而且还不够全面,有很多知识盲区,所以,还要大家多评价指正。

WWDC2022 关注点:Metal3升级

  • MetalFX 升级

借助高性能放大和抗锯齿功能,每帧渲染复杂场景的时间更短。选择时间或空间算法的组合以帮助提高性能。

  • 快速资源加载

使用异步 I/O 将资产数据直接从存储优化流式传输到 Metal 纹理和缓冲区。

  • 离线着色器编译

编译器可以在项目构建时生成 GPU 二进制文件,以消除应用内着色器编译,帮助游戏提高性能并减少加载时间。

Mas着色器

这个新的几何管道用两个新的着色器阶段(对象和网格)替换了顶点着色器,从而实现更灵活的剔除和 LOD 选择,以及更有效的几何着色和生成。

  • PyTorch 的Metal后端

PyTorch 1.12 版中的新 Metal 后端支持使用 MPS Graph 和 Metal Performance Shaders 原语进行高性能、GPU 加速的训练。

LearnMetal代码值得注意的有:

特效效果-多buffer特效实现的可能性🤔

Triple Buffering

就是要尽可能的减少空闲时间,使得 CPU 和 GPU 最大程度的被利用起来,从而更快的完成任务、实现更流畅的效果。

绿幕视频合成: Mask & 抠图换背景

长腿增高效果

Metal与OpenGL传递纹理

风格化滤镜:

模糊的原理和 Zoom Blur 的具体实现,以及系统提供的景深信息

借助相关训练好的模型,通过 Core ML 来实现这个风格切换的效果。

参考

Metal着色器语言文档

Metal着色器语言中文学习专栏

Metal示例代码:Metal Sample Code Library | Apple Developer Documentation

LearnMetal(Metal代码Demo)

Metal新特性(更新WWDC上发布的Metal新特性)

Metal学习专栏(内容比较全面的中文学习实践)

Metal入门经验与思考(不错的资料推荐、更新时间比较新)