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 编译着色程序源代码的具体步骤:

  1. 使用 metal 编译所有 .metal 文件,生成 .air.air 文件保存了表示着色语言源代码的中间编译结果。
  2. 使用 metal-ar 将多个 .air 文件打包成一个单独的 .metalar 文件。 metal-ar 类似于 Unix 系统的 ar 工具。
  3. 使用 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 CaptureMetal 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 帧捕捉调试界面,使得更容易识别出各个对象。

results matching ""

    No results matching ""