本章列出了可用于帮助您自定义和改进开发工作流的工具。
在应用程序构建过程中创建库
.metallib在应用程序构建过程中编译着色器语言源文件和构建库(文件)可以在运行时编译着色源源代码实现更好的应用程序性能。您可以在Xcode中构建库或使用命令行实用程序。
使用Xcode构建库
这是项目中的任何着色器的源文件会被自动用于生成默认的库,你可以从Metal框架代码与访问newDefaultLibrary的方法MTLDevice。
使用命令行实用程序来构建库
图8-1显示了构成Metal着色器源代码的编译器工具链的命令行实用程序。当您.metal在项目中包含文件时,Xcode会调用这些工具来构建一个库文件,您可以在运行时在应用程序中访问它。
将着色器源编译成不使用Xcode的库:
1:使用该metal工具将每个.metal文件编译成单个.air文件,该文件存储着色器语言代码的中间表示(IR)。
2:或者,使用该metal-ar工具将多个.air文件归档到一个.metalar文件中。(metal-ar类似于Unix ar。)
3:使用该metallib工具.metallib从IR .air文件或存档.metalar文件构建Metal 库文件。
清单8-1显示了将.metal文件编译和构建到文件中所需的最少命令数.metallib。
清单8-1 使用命令行实用程序构建库文件
xcrun -sdk macosx metal MyLibrary.metal -o MyLibrary.air
xcrun -sdk macosx metallib MyLibrary.air -o MyLibrary.metallib
要以框架代码访问结果库,请调用该newLibraryWithFile:error:方法,如清单8-2所示。
清单8-2 访问您的应用程序中的库文件
NSError *libraryError = NULL;
NSString *libraryFile = [[NSBundle mainBundle] pathForResource:@"MyLibrary" ofType:@"metallib"];
id <MTLLibrary> myLibrary = [_device newLibraryWithFile:libraryFile error:&libraryError];
if (!myLibrary) {
NSLog(@"Library error: %@", libraryError);
}
Xcode主题设置和性能
当一个Metal应用程序从Xcode运行时,默认的方案设置可以降低性能。Xcode检测是否在源代码中使用Metal API,并自动启用GPU Frame Capture和Metal API验证设置,如图8-2所示。启用GPU帧捕获时,调试层被激活。当启用Metal API验证时,每个调用都被验证,这进一步影响性能。对于这两种设置,CPU性能比GPU性能更受影响。除非您禁用这些设置,否则当应用程序在Xcode之外运行时,应用程序的性能可能会显着提高。
调试
在调试和分析您的Metal应用程序时,请使用以下部分中的提示获取更多有用的诊断信息。
注意: 仅当您的Xcode项目的部署目标设置为最新的SDK时,调试才会启用。 |
---|
Metal着色语言源文件的文件扩展名
对于Metal着色语言源代码文件名,您必须使用.metal文件扩展名来确保开发工具(Xcode和GPU框架调试器)在调试或分析时识别源文件。
使用Xcode执行帧捕获
要在Xcode中执行帧捕获,请启用调试并调用insertDebugCaptureBoundary方法MTLCommandQueue来通知Xcode。该presentDrawable:和presentDrawable:atTime:的方法MTLCommandBuffer类似通知的Xcode约帧捕获,故称insertDebugCaptureBoundary只有当这些方法不存在。有关更多信息,请参阅调试Metal和OpenGL ES。
标签属性
许多Metal框架对象(如命令缓冲区,流水线状态和资源)支持一个label属性。您可以使用此属性为在应用程序设计的上下文中有意义的每个对象分配一个名称。这些标签显示在Xcode Frame Capture调试界面中,使您可以更轻松地识别对象。
类似地,insertDebugSignpost:,pushDebugGroup:,和popDebugGroup方法允许插入调试字符串到命令缓冲器和推动或用于识别编码的命令的组弹出字符串标签。
Metal系统跟踪
要在仪器中配置应用程序,请运行“Metal系统跟踪”工具。有关详细信息,请参阅Metal系统跟踪分析模板。