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.metalliblibrary 文件。
图 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 帧捕捉调试界面,使得更容易识别出各个对象。