本章介绍了一些工具可以用于帮助你自定义和改进开发工作流
在 app 编译阶段编译 shader language source file 以及 build a library(.metallib),这样比在运行时编译 shader source code 性能更好。可以通过 Xcode 编译 library 或者使用 command line
项目中的所有 shader source files 将自动生成 default library,可以通过 metal framework code : MTLDevice 的 newDefaultLibrary 方法来访问
下图展示了 command line 组成针对 metal shader source code 的 compiler 工具链。针对项目中的 .metal 文件,xcode 提供这些工具用于生成在app运行时可以访问的 library
将 shader source 在 xcode 中编译成 library 需要如下步骤
下列代码展示了将 .metal 文件编译成 .metallib 文件所需要的最少的命令
xcrun -sdk macosx metal MyLibrary.metal -o MyLibrary.air xcrun -sdk macosx metallib MyLibrary.air -o MyLibrary.metallib
下列代码展示了,在framework code中通过 newLibraryWithFile:error: 方法,访问生成的library
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 launch metal app 的时候,默认的 scheme setting 会降低性能。 xcode 会自动检测使用了哪些 metal api,然后启动 GPU Frame Capture 会 Metal API Validation setting,如下图所示。当开启 GPU Frame Capture 的时候,debug layer被开启。当开启 Metal API Validation 的时候,每个函数调用都会被validated,这些都会影响性能。这两个设置对 CPU 性能的影响比对 GPU 的影响大。除非关闭这些setting,否则 app run outside Xcode 的性能会明显更好
使用下列 tips 在 debug 和 profiler metal app 的时候来获取更多信息
注意:只有 Xcode project 的 Deployment Target 被设置为最新的 SDK 的时候才开启 debug
针对 metal shading language source code file name,必须使用.metal文件后缀,来确保 development tool(xcode 以及 GPU frame debugger)在 debug 或者 profiler 的时候能识别源文件
为了执行 xcode 的 frame capture 功能,需要开启 debug,并调用 MTLComandQueue 的 insertDebugCaptureBoundary 方法(Deprecated,Use MTLCaptureManager and MTLCaptureScope instead)。 MTLCommandBuffer 的 presentDrawable: and presentDrawable:atTime: 方法 也会出发 xcode frame capture,所以在这些方法没有 present 的时候,调用 insertDebugCaptureBoundary 方法。参考 Debugging Metal and OpenGL ES
许多 metal framework object-比如 command buffer、pipeline state、resource等-都支持 label 属性。可以使用这个属性来为每个object定义一个名字。这个label会出现在 xcode frame capture debugging interface上,使得你可以更简单的识别物件
类似的 insertDebugSignpost:, pushDebugGroup:, and popDebugGroup 方法使得你可以将 debug string 插入 command buffer,通过push 和 pop string label 的方法来识别 groups of encoded command
用 instrument 来 profile app,需要使用 metal system trace 工具。参考 Metal System Trace Profiling Template
本节教程就到此结束,希望大家继续阅读我之后的教程。
谢谢大家,再见!
原创技术文章,撰写不易,转载请注明出处:电子设备中的画家|王烁 于 2022 年 4 月 27 日发表,原文链接(http://geekfaner.com/shineengine/blog53_MetalProgrammingGuide_8.html)