苹果的 Metal 工程
Basic Buffers
当向顶点着色器传递数据过多(大于 4096 字节)时, setVertexBytes:length:atIndex:
方法不允许使用,应该使用 setVertexBytes:length:atIndex:
方法提高性能。
这时,参数应该是 MTLBuffer
类型,可以被 GPU 访问的内存。
_vertexBuffer.contents
方法返回可以被 CPU 访问的内存接口,即这块儿内存被 CPU 和 GPU 共享。
Basic Texturing
MTLPixelFormatBGRA8Unorm
的像素格式。

2D 纹理的坐标

Reading a texel is also known as sampling
Hello Compute
data-parallel computations using the GPU.
在 GPU 发展历史中,并行处理的架构一直没有变化,而处理核心的可编程特性越来越强。这使得 GPU 从 fixed-function pipeline 转向 programmable pipeline,也使得通用 GPU 编程 (GPGPU) 变得可行。
一个 MTLComputePipelineState
对象可以直接由一个 kernel function
生成。
// Create a compute kernel function
id <MTLFunction> kernelFunction = [defaultLibrary newFunctionWithName:@"grayscaleKernel"];
// Create a compute kernel
_computePipelineState = [_device newComputePipelineStateWithFunction:kernelFunction
把图像分块并行处理
// Set the compute kernel's thread group size of 16x16
_threadgroupSize = MTLSizeMake(16, 16, 1);
// Calculate the number of rows and columsn of thread groups given the width of our input image.
// Ensure we cover the entire image (or more) so we process every pixel.
_threadgroupCount.width = (_inputTexture.width + _threadgroupSize.width - 1) / _threadgroupSize.width;
_threadgroupCount.height = (_inputTexture.height + _threadgroupSize.height - 1) / _threadgroupSize.height;
// Since we're only dealing with a 2D data set, set depth to 1
_threadgroupCount.depth = 1;
[computeEncoder dispatchThreadgroups:_threadgroupCount
threadsPerThreadgroup:_threadgroupSize];
CPU and GPU Synchronization
CPU 和 GPU 是两个异步的处理器,但是它们共享缓存,因此需要在并行的同时避免同时读写数据。

在上图中,每一帧中,CPU 和 GPU 不会同时工作,虽然避免了同时读写数据,但是降低了性能。

在上图中,CPU 和 GPU 会同时读写相同的数据,引起竞争。

可以用多个缓冲区来达到提高性能和避免数据同时读写的问题。CPU 和 GPU 不同时读写相同的缓冲区。
当 GPU 执行完 command buffer 后,会调用这个 handler
。
[commandBuffer addCompletedHandler:^(id<MTLCommandBuffer> buffer)
{
dispatch_semaphore_signal(block_sema);
}];
LOD with Function Specialization
level of detail (LOD)
细节越逼真,消耗的资源越多。因此要在性能和细节的丰富度之间做权衡。
if(highLOD)
{
// Render high-quality model
}
else if(mediumLOD)
{
// Render medium-quality model
}
else if(lowLOD)
{
// Render low-quality model
}
但是使用 GPU 写出上面的代码的话,性能不高。GPU 可以并行的指令数依赖于为函数分配的寄存器数目。GPU 编译器需要为函数分配可能用到的最大数目寄存器,即使有些分支永远不可能执行。因此,分支语句显著增加了需要的寄存器数目,并显著降低了 GPU 的并行数目。
苹果的 Metal 工程的更多相关文章
- iOS开发——Metal教程
Metal Swift教程 学习使用苹果GPU加速3D绘图的新API:Metal! 在iOS 8里,苹果发布了一个新的接口叫做Metal,它是一个支持GPU加速3D绘图的API. Meta ...
- iOS开发——动画OC篇&知识点总结
图层与动画知识点总结 1.Core Animation 非娱乐类的软件都会用到的动画,操作简单. 2.Quartz 2D绘图 是一个2D绘图引擎. (1) 绘图Context是一个绘图的目标对象,定义 ...
- WebGPU 计算管线、计算着色器(通用计算)入门案例:2D 物理模拟
目录 1. WebGL 2. WebGPU 2.1. 适配器(Adapter)和设备(Device) 2.2. 着色器(Shaders) 2.3. 管线(Pipeline) 2.4. 并行(Paral ...
- iOS 8 Metal Swift教程(一) :开始学习
在本篇教程中,你将应用到3D图形中的一系列矩阵变换,并会学习到如下内容: 如何使用模型(model),视图(view)以及投影变换(projection transformations). 如何使用矩 ...
- 2017年"程序媛和工程狮"绝对不能忽视的编程语言、框架和工具
2017年"程序媛和工程狮"绝对不能忽视的编程语言.框架和工具 在过去的一年里,软件开发行业继续大踏步地向前迈进.回顾 2016 年,我们看到了更多新兴的流行语言.框架和工具, ...
- 【转】[教程]在 win7 / win8 下安装苹果系统 (懒人版)
前言 这篇安装教程的素材在国庆就准备好了,但那时学习任务比较重,没有时间发帖,一直拖到现在.趁这个周末有空,赶紧写完它,希望能帮助一些景友. 论坛已经有不少安装教程,如果对这篇安装教程有疑问可以去 ...
- DS-5建工程
DS-5教程-使用ARM DS-5 和DSTREAM仿真器调试裸机程序 http://bbs.elecfans.com/jishu_453909_1_1.html i2c( 楼主 )2014-10-1 ...
- 程序员面试大揭秘——应聘微软、亚马逊、谷歌、苹果等IT公司你都要做什么准备?
对于多数求职者而言,面试好似一个迷局.你去了,见了几个面试官,答了一堆问题,然后,或两手空空离开,或幸运地拿到录用通知. 你有没有想过: 面试结果是怎么得出的? 面试官会不会互相交流? 公司最看重哪些 ...
- 苹果Xcode 证书生成、设置、应用完整图文教程
Xcode 证书生成.设置.应用,与大家分享. 为了能够在iPhone或iPod Touch上运行iPhone应用程序,必须使用有效的数字证书签名.这个证书用于将您的开发者身份与在注册期间所提供的已确 ...
随机推荐
- Python_08-常用模块
1 常用模块介绍 1.1 os模块 1.2 sys模块 1.3 built-in内置模块 1.4 time模块 1.5 re模块 2 ...
- jQuery的基本事件
1.用法 <!--jquery通过bind()这个方法来为元素绑定事件,可以传三个参数,type.data.fn--> <!--type表示一个或者多个事件的名称--> < ...
- curl模拟多线程抓取网页(优化)
通过上篇文章清楚了通过curl_multi_*函数可以一次请求多个url,但是也留下了问题,就是结果要等所有数据请求结束一起返回,才能逐个处理数据.优化代码,使先成功请求的url先返回处理结果,而不是 ...
- mybatis框架中的输入映射
mybatis.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心. 输入类型: 1.传递简单类型 可以参考我之前的对于数据库增删改查的博文. ...
- Mybatis 实用篇(四)返回值类型
Mybatis 实用篇(四)返回值类型 一.返回 List.Map List<User> getUsers(); <select id="getUsers" re ...
- cpuinfo
在Linux系统中,如何详细了解CPU的信息呢? 当然是通过cat /proc/cpuinfo来检查了,但是比如几个物理CPU/几核/几线程,这些问题怎么确定呢? 经过查看,我的开发机器是1个物理CP ...
- 利用Word发布文章到博客
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...
- Vivado&ISE&Quartus II调用Modelsim级联仿真
博主一直致力寻找高效的工作方式,所以一直喜欢折腾软件,从刚开始只用软件IDE自带的编辑器,到Notepad++,再到后来的Vim,从用ISE14.7自带的Isim仿真,到发现更好的Modelsim,再 ...
- Oracle Key Flexfields Qualifiers
Oracle Key Flexfields Qualifiers 1. Application Developer è Flexfield è Key è Register Title: Ac ...
- Reverting back to the R12.1.1 and R12.1.3 Homepage Layout
Reverting back to the 12.1.1 Homepage Layout Set the following profiles: FND: Applications Navigator ...