Metal 技巧和相关技术
本章描述 Metal 的技巧和相关技术,用于提高 App 的性能和开发者的效率。
在 App Build 阶段创建 Libraries
在 App Build 阶段编译着色语言源文件并生成一个 library (.metallib
文件) ,相比在运行时编译着色语言源代码,前者有更好的性能。生成着色程序 library 可以使用 Xcode 集成环境或是命令行工具。
使用 Xcode 生成着色程序 library
任何包含在 Xcode 工程中的着色语言源代码文件都自动被编译打包成默认的 library,这个 library 是可以在 Metal 框架代码中用 MTLDevice
对象的 newDefaultLibrary
方法访问到的。
使用命令行生成着色程序 library
图 8-1 展示了命令行工具集为着色语言源代码准备了一个编译工具链。当工程包含 .metal
文件,Xcode 唤起这些工具来创建一个在 App 运行时能访问的 library 文件。
如下展示了使用 Xcode 编译着色程序源代码的具体步骤:
- 使用
metal
编译所有.metal
文件,生成.air
,.air
文件保存了表示着色语言源代码的中间编译结果。 - 使用
metal-ar
将多个.air
文件打包成一个单独的.metalar
文件。metal-ar
类似于 Unix 系统的ar
工具。 - 使用
metallib
将.metalar
文件生成一个 Metal.metallib
library 文件。
图 8-1 使用命令行工具集生成 Library 文件
调用 MTLDevice
对象的 newLibraryWithFile:error:
方法,来访问 Metal 框架代码中的最终 library( .metallib
文件)。
Xcode Scheme 设置和性能
当 Xcode 中运行一个 Metal App,默认的 scheme 设置不利于提高性能。Xcode 检查源代码中是否调用了 Metal API,如果是将自动启用 GPU Frame Capture
和 Metal API Validation
设置。如图 8-2 所示。 当 GPU Frame Capture
被启用,debug 层被激活。当 Metal API Validation
被启用,每次 Metal 调用都被校验,这将更影响性能。这两个设置,对 CPU 的性能影响多过 GPU。禁用这两个选项,App 在Xcode 之外运行时,App 的性能将显著提升。
Figure 8-2 Xcode Scheme Editor Settings for a Metal App
调试
当调试分析 Metal App 的时候,使用如下的技巧来获取更多的诊断信息。
Metal 着色语言源代码的文件后缀
Metal 着色语言源代码文件的文件名使用 .metal
作为后缀,如此调试分析时可以让开发工具 (Xcode 和 GPU frame debugger) 识别出。
在 Xcode 中实现帧捕捉
如果希望在 Xcode 中实现帧捕捉,启用 debug 并且调用 MTLCommandQueue
对象的 insertDebugCaptureBoundary
方法来通知 Xcode。MTLCommandBuffer
对象的 presentDrawable:
和 presentDrawable:atTime:
方法也通知 Xcode 进行帧捕捉。所以,只有在这些 present 方法失效的时候,才调用 insertDebugCaptureBoundary
方法。
Label 属性
大多数 Metal framework 对象,比如 command buffers, pipeline states,和 resources,都提供 label
属性。你可以使用这个属性为每个对象指定有意义的名称。这些 label
出现在 Xcode 帧捕捉调试界面,使得更容易识别出各个对象。