本系列文章是对 metalkit.org 上面MetalKit内容的全面翻译和学习.html
几周前,在WWDC2016
,Apple
工程师发布了一份新的文档,Metal Best Practices Guide Metal最佳实践指南,它包含了很是有用的信息,关于如何在你的Metal
应用中组织代码来得到更好的性能.由于文档是很是全面普遍的,咱们在本文中将只列出主要的概念.一个高效的Metal
应用须要:性能优化
CPU
占用.GPU
性能.最佳实践:尽早建立持久对象并重用它们.并发
Metal
框架提供了几个协议来管理那些贯穿你的应用整个生命周期的持久对象.这些对象建立花费很大但一般初始化一次并常常重用.不要在每一个渲染循环或计算循环开始时建立这些对象.app
最佳实践:为你的资源设置合理的储存模式和纹理使用设置.框架
Metal
资源必须被合理配置来充份利用调整内存访问和驱动器性能优化.资源储存模式容许你为MTLBuffer
和MTLTexture
对象自定义储存位置和访问权限.纹理使用设置容许明确声明你想要如何使用你的MTLTexture
对象.异步
iOS
和tvOS
)OS X
)要了解更多信息,查阅文档的资源设置章节Resource Optionside
最佳实践:实现三重缓冲器来更新动态缓冲器数据. 动态缓冲器数据指缓冲器内储存的常常更新的数据.强烈推荐实现一个三重缓冲器模型,来避免每帧建立新的缓冲器及最小化帧间处理器闲置时间.函数
要了解更多信息,查阅文档的三重缓冲器章节 Triple Buffering布局
最佳实践:用合理的方法来绑定你的缓冲器数据到图形或计算函数. Metal
提供了若干API
设置来绑定缓冲器数据到图形或计算函数.setVertexBytes:length:atIndex: 方法是最佳选项来绑定大量小于 4KB 的动态缓冲器数据(瞬时缓冲器)到顶点函数.若是数据大于4KB,你应该一次性建立一个MTLBuffer并在须要时更新它的内容.
要了解更多信息,查阅文档的缓冲器绑定章节 Buffer Bindings
最佳实践:尽量短暂的持有可绘制对象. 命令缓冲器在本身被调度执行以前,能够经过presentDrawable方法来调度drawable的显示,可是,实际上drawable本身是在命令缓冲器被执行完才显示的.
要了解更多信息,查阅文档的可绘制对象章节Drawables section of the documentation.
最佳实践:以目标显示屏的精确像素尺寸来渲染. 你的drawable的像素尺寸应该老是匹配目标显示屏的精确像素尺寸.这样能够避免离屏像素渲染,或引起额外的采样处理.
要了解更多信息,查阅文档的原生屏幕比例章节 Native Screen Scal
最佳实践:对于那些不能维持60 FPS帧率的应用,以一个稳定的帧率显示你的drawable. iOS
设务的屏幕刷新率是60 Hz
.不能稳定在这段时间内完成帧渲染的应用,应该设置更低的帧率来避免卡顿.tvOS
的屏幕刷新率通常是60 Hz
,但并不固定.
要了解更多信息,查阅文档的帧率章节Frame Rate
最佳实践:为你的渲染目标设置合理的加载与储存动做. 在你的Metal
渲染对象上执行的动做必须被合理配置,来避免在渲染过程的开始()或xf昂贵或没必要要的渲染工做.
要了解更多信息,查阅文档的加载与储存动做章节Load and Store Actions
最佳实践:尽量的合并渲染命令编码器. 消除没必要要的渲染命令编码器,减小内存带宽占用并提升性能.
要了解更多信息,查阅文档的渲染命令编码器章节Render Command Encoders
最佳实践:每帧提交尽量少的命令缓冲器,充份利用GPU
. 命令缓冲器在Metal
中是提交工做的基本单位;它们由CPU
建立并被GPU
执行.这种关系容许你经过调整每帧提交的命令缓冲器数量来平衡CPU
和GPU
的工做.
要了解更多信息,查阅文档的命令缓冲器章节Command Buffers
最佳实践:若是你的绘制或调度调用参数是由GPU
动态生成的,应使用间接缓冲器. 间接缓冲器是MTLBuffer
对象,它带有一个特殊的数据布局来表明绘制或调度命令参数.
要了解更多信息,查阅文档的命令缓冲器章节Indirect Buffers
最佳实践:在build生成时编译你的函数,并生成你的库. 编译Metal Shading Language
源代码是Metal
应用中耗时的阶段之一.Metal
经过容许你在build时编译图形和计算函数并在运行时做为库加载它们,来缩短期花费.
要了解更多信息,查阅文档的函数和库章节 Functions and Libraries
最佳实践:异步build生成你的渲染和计算管线. 拥有多个渲染或计算管线容许你为特定任务使用不一样的状态配置.异步生成这些管线能够提升性能和并发数.推荐你提早生成全部已知的管线,避免懒加载.
要了解更多信息,查阅文档的管线章节Pipelines
这份指南,还有Metal编程指南 Metal Programming Guide及Metal着色语言指南Metal Shading Language Guide都已经更新到iOS 10
, tvOS 10
和OS X 10.12
,它们三部文档包含了建立高性能Metal
应用所需的一切.