看完这个 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 编程代价昂贵

  1. State validation

    • 需要验证 API 调用正确
    • 需要把 API 的状态映射到硬件的状态
  2. Shader compilation
    • 需要运行时编译生成 GPU 对应的硬件代码
    • 有时改变状态时,需要重新编译 shaders
  3. 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的更多相关文章

  1. 剖析虚幻渲染体系(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 ...

  2. Mac Technology Overview

    [Mac Technology Overview]https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual ...

  3. [原] KVM 虚拟化原理探究(1)— overview

    KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...

  4. Activity之概览屏幕(Overview Screen)

    概览屏幕 概览屏幕(也称为最新动态屏幕.最近任务列表或最近使用的应用)是一个系统级别 UI,其中列出了最近访问过的 Activity 和任务. 用户可以浏览该列表并选择要恢复的任务,也可以通过滑动清除 ...

  5. Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx

    Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx 1. 摘要算法的大概流程2 2. 旧约圣经 (39卷)2 2.1. 与古兰经的对 ...

  6. Overview of OpenCascade Library

    Overview of OpenCascade Library eryar@163.com 摘要Abstract:对OpenCascade库的功能及其实现做简要介绍. 关键字Key Words:Ope ...

  7. Apache Sqoop - Overview——Sqoop 概述

    Apache Sqoop - Overview Apache Sqoop 概述 使用Hadoop来分析和处理数据需要将数据加载到集群中并且将它和企业生产数据库中的其他数据进行结合处理.从生产系统加载大 ...

  8. BOOST.Asio——Overview

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  啥说的,鄙视那些无视版权随 ...

  9. Spring overview

    引子 接触Java很多年了,各种framework,却从未系统的去了解过.最近突然想清楚一件事,就是当下的目标——Focus on Java-based RESTful WS & JS.而之于 ...

随机推荐

  1. Matlab中插值函数汇总(下)

    Matlab中插值函数汇总分上下两个部分,主要整合自matlabsky论坛dynamic发表于2009-2-21 21:53:26 的主题帖,以及豆丁网rickoon上传的教材第8章<插值,拟合 ...

  2. 微信小程序通讯录首字母索引效果,车辆品牌选择列表

    效果图: wxml代码: <block wx:for="{{list}}"> <view class='letter' id="letter{{inde ...

  3. 18-(unicode error) 'unicodeescape' codec can't decode bytes in position 16-17: truncated \uXXXX escape

    读取文件时碰到问题: 1.(unicode error) 'unicodeescape' codec can't decode bytes in position 16-17: truncated \ ...

  4. ie11的仿真模式

    1>在ie11的仿真模式中,所有版本的按钮都失效,解决方法:再ie的配置中,选项-高级-重置,然后重启ie11 程序员的基础教程:菜鸟程序员

  5. MVC DbContext

    指定数据连接,指定表名,移除表名复数化(表名后面不加s),设置字段约束,主外键关系. using MvcApplication1.Models; using System; using System. ...

  6. 博客搬家到blog.wu8685.com

    博客园算是我最开始来的地方了吧,当时还在学校,为了找工作会看一些理论方面的东西,所以写的都是偏理论的心得. 后来参加了工作,开始忙起来,也就没有时间来更新了.其实忙都是借口,这点还是需要反思的. 大概 ...

  7. ruby变量

    Ruby 支持五种类型的变量. 一般小写字母.下划线开头:变量(Variable).局部变量的作用域从 class.module.def 或 do 到相对应的结尾或者从左大括号到右大括号 {}. 当调 ...

  8. CodeForces 687B Remainders Game(数学,最小公倍数)

    题意:给定 n 个数,一个数 k,然后你知道一个数 x 取模这个 n 个的是几,最后问你取模 k,是几. 析:首先题意就看了好久,其实并不难,我们只要能从 n 个数的最小公倍数是 k的倍数即可,想想为 ...

  9. python使用git进行版本控制2

    对上一次的readme文件进行修改 现在,运行git status命令看看结果 $ git statusOn branch masterChanges not staged for commit:  ...

  10. Bootstrap导航栏

    导航栏: <div id="menu-nav" class="navbar navbar-default navbar-inverse navbar-fixed-t ...