Working with Metal—Overview
看完这个 WWDC 之后的总结。
Metal 可以在单位时间内提供 10 倍的 draw call 调用。
Background
About Draw Call
每一次 draw call 调用都必须有自己的状态向量,比如着色器、纹理等。而改变状态向量对 CPU 来说是比较耗时的,因此单位时间内 draw call 的次数有限。

CPU 负责把状态向量的改变翻译为硬件命令 (hardware command),然后告诉 GPU。
Metal 的优化点
在 Metal 之前,如果使用了 GPU 的 API,每一帧耗在 CPU 的时间,可以分为应用中 API 时间和把 GPU 的 API 调用翻译为 GPU 指令的时间。而 Metal减少的就是这部分时间。

下面就是使用了 Metal 后的时间对比。

为何 GPU 编程代价昂贵
- State validation
- 需要验证 API 调用正确
- 需要把 API 的状态映射到硬件的状态
- Shader compilation
- 需要运行时编译生成 GPU 对应的硬件代码
- 有时改变状态时,需要重新编译 shaders
- Sending work to GPU
- 需要把数据组织成 GPU 易于理解的格式
- 经常需要批量调用,以提高单位时间的 draw call 次数,降低了灵活性
Metal 把部分工作放在了编译和加载时

这里的频率是从用户的角度看到的,即用户不会经历 build 的过程。
API concepts
写代码时用到的所有类型之间的关系。

在编译之后,模型如下所示,不需要进一步的验证之类的事情。

Command encoders generate commands immediately,没有 state validation 的过程,可以理解为直接调用硬件驱动。
Resource Update Model
A7处理器之后,
- CPU and GPU share same storage
- 没有隐含的数据拷贝
- CPU 和 GPU 之间的数据是自动同步的,不需要显式的缓存管理、flush。
Metal 提供了两种资源类型:
- Textures (formatted images)
- Data buffers (unformatted memory)
资源的结构(size、level、format)不可变,这样子就避免了昂贵的 resource validation 操作。
Command Encoder Types
Render command encoder
关于 Graphics rendering,为一次 rendering “pass” 产生硬件指令。
不会在 draw 时候进行编译,避免了昂贵的编译和 state validation。
有些状态的改变会导致重写编译,因此这些状态被设置为不可变的。

A7 是一个 Tile-based deferred-mode renderer,具体啥意思我也不知道。
在每一个 render pass 的起始和结束,都会有一次 load 和 store 操作。
使用 Metal,可以指定 load 和 store 操作的类型。
load 时的可选类型是 Don’t care, load, clear。
Store 时的可选类型是 Don’t care, store, multisample resolve。

假设一次 frame 有两次 render pass,处理了 color 和 depth 的数据,那么 color 和 depth 的 framebuffer,都需要两次读和写操作。

使用 Metal 指定了相应的 load 和 store 操作时候,只需要 color framebuffer 的一次读操作和两次写操作。
Shading Language
Unified shading language for graphics and compute processing
既用于图像处理,又用于并行数据处理。
Developer tools
Metal Shader Compiler Process

大致分两步。
- 在 build 时,编译为 metal Library,并打包进应用安装包中。
- 在创建管线对象时,先看缓存中有没有,如果找不到,就编译一下,加入缓存。然后把编译好的代码(和具体设备有关)告诉 GPU。
Working with Metal—Overview的更多相关文章
- 剖析虚幻渲染体系(13)- RHI补充篇:现代图形API之奥义与指南
目录 13.1 本篇概述 13.1.1 本篇内容 13.1.2 概念总览 13.1.3 现代图形API特点 13.2 设备上下文 13.2.1 启动流程 13.2.2 Device 13.2.3 Sw ...
- Mac Technology Overview
[Mac Technology Overview]https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual ...
- [原] KVM 虚拟化原理探究(1)— overview
KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...
- Activity之概览屏幕(Overview Screen)
概览屏幕 概览屏幕(也称为最新动态屏幕.最近任务列表或最近使用的应用)是一个系统级别 UI,其中列出了最近访问过的 Activity 和任务. 用户可以浏览该列表并选择要恢复的任务,也可以通过滑动清除 ...
- Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx
Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx 1. 摘要算法的大概流程2 2. 旧约圣经 (39卷)2 2.1. 与古兰经的对 ...
- Overview of OpenCascade Library
Overview of OpenCascade Library eryar@163.com 摘要Abstract:对OpenCascade库的功能及其实现做简要介绍. 关键字Key Words:Ope ...
- Apache Sqoop - Overview——Sqoop 概述
Apache Sqoop - Overview Apache Sqoop 概述 使用Hadoop来分析和处理数据需要将数据加载到集群中并且将它和企业生产数据库中的其他数据进行结合处理.从生产系统加载大 ...
- BOOST.Asio——Overview
=================================版权声明================================= 版权声明:原创文章 谢绝转载 啥说的,鄙视那些无视版权随 ...
- Spring overview
引子 接触Java很多年了,各种framework,却从未系统的去了解过.最近突然想清楚一件事,就是当下的目标——Focus on Java-based RESTful WS & JS.而之于 ...
随机推荐
- DropDownList控件的使用方法
1. 使用代码添加数据 <asp:DropDownList ID="DropDownList1" runat="server"> </asp: ...
- php模拟http请求
在http简析中,我们提到了浏览器请求资源的一个流程,那么这个流程能不能用php来模拟呢?答案是肯定的. php模拟http请求需要实现以下步骤: 1.连接apache服务器 使用fsockopen: ...
- 如何用Python实现常见机器学习算法-1
最近在GitHub上学习了有关python实现常见机器学习算法 目录 一.线性回归 1.代价函数 2.梯度下降算法 3.均值归一化 4.最终运行结果 5.使用scikit-learn库中的线性模型实现 ...
- 【转】Defunct进程 僵尸进程
在测试基于 DirectFB+Gstreamer 的视频联播系统的一个 Demo 的时候,其中大量使用 system 调用的语句,例如在 menu 代码中的 system("./play&q ...
- UVa 1615 Highway (贪心,区间选点问题)
题意:给定一个数 n 个点,和一个d,要求在x轴上选出尽量少的点,使得对于给定的每个点,都有一个选出的点离它的欧几里德距离不超过d. 析:首先这是一个贪心的题目,并且是区间选点问题,什么是区间选点呢, ...
- 如何使用Word2016或Office365中的word撰写博客并发布
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...
- Android通过xml生成创建View的过程解析
Android的布局方式有两种,一种是通过xml布局,一种是通过java代码布局,两种布局方式各有各的好处,当然也可以相互混合使用.很多人都习惯用xml布局,那xml布局是如何转换成view的呢?本文 ...
- Android-有序广播是可以中断的
在之前的博客,Android-广播概念,中介绍了(广播和广播接收者)可以组件与组件之间进行通讯,有两种类型的广播(无序广播 和 有序广播),这篇博客就来讲解有序广播的代码实现: 有序广播:接收者 可以 ...
- Postgres 主从配置(四)
Postgres 主从切换 数据库主从结构中由从库升级为主库较为容易些,但是主库恢复后重新加入到主从结构中就不那么容易了.以往的做法是当成一个全新的从库加入进来,数据需要重新从现有的主库中使用pg_b ...
- 创建TFS团队项目时自动建立代码库的文件夹结构
很多客户都跟我提过一个这样的需求,即需要在创建团队TFS项目时,自动创建起源代码库的文档结构,例如类似下列结构的文件夹: <teamProject> |- DEVELOPMENT ...