我正在通过Xcode构建macOS应用程序。每次构建时,我都会得到以下日志输出:
启用了Metal API验证
据我所知,我的应用程序没有使用任何Metal功能。我没有使用硬件加速的3D图形、着色器、视频游戏功能或类似的东西。
为什么Xcode会打印Metal API日志输出?
我的应用程序是否在使用Metal?我可以或者应该禁用它吗?
如何禁用这个"启用了Metal API验证"的日志信息?
通过 Xcode Scheme 切换 Metal API 验证:
Scheme > Edit Scheme... > Run > Diagnostics > Metal API Validation。
这是一个复选框,可能的选项为 Enabled
或 Disabled
。
禁用会在您的 .xcscheme
文件中设置键 enableGPUValidationMode = 1
。
禁用后,Xcode 不再记录“Metal API Validation Enabled”日志消息。
注意:在 Xcode 11 及以下版本中,该选项出现在方案编辑器的“选项”选项卡中(而不是“诊断”选项卡)。
在窗口顶部选择你的方案。在下拉菜单中点击编辑方案
,进入诊断
并取消选中Metal API 验证
复选框。
是的,即使您的代码没有直接与 GPU 交互,许多高级框架也会这样做,特别是 Core Image
、SpriteKit
和 SceneKit
。例如,我将我应用程序中讨厌的 "Metal API 验证已启用" 消息缩小到了这一行:
layer.backgroundColor = NSColor(patternImage: image).cgColor
启用验证会对每个Metal API调用进行检查,这会对CPU性能造成"小但可测量的影响。" 验证的目的是
检查调用Metal API时是否有代码错误,包括资源创建、编码Metal命令和其他常见任务中存在的错误。
苹果框架(如核心图像Core Image)很少会不正确地使用Metal API,因此如果您的应用程序仅使用那些高级别苹果框架,则可以放心禁用API验证。摆脱那烦人的输出消息值得冒险。
NSColor
等API触发了日志记录。 - pkamb我收到了完全相同的信息。
在scrollview闭包的末尾,我使用了.onDelete(perform: deleteLocations)
。
我将scrollview更改为列表,消息就消失了。
我最近开始为我的macOS应用程序更新工作。
它一直很好地运行着,没有出现错误,但是当我从一个旧的Xcode项目中添加了一个storyboard文件后,当我触发.loadWindow()时,在我的日志中看到了以下内容:
- "Metal API Validation Enabled"
- "fopen failed for data file: errno = 2 (No such file or directory)"
然后我查看了界面构建器,发现我的一个标签处于奇怪的位置。 所以我将该标签居中,并再次运行应用程序,"fopen failed for data file: errno = 2 (No such file or directory)"警告消失了。 每当我从.storyboard文件加载该窗口时,它仍然会显示"Metal API Validation Enabled",但这并不影响我。
因此,我认为这可能与操作系统如何绘制窗口和视图有关,或者可能与界面构建器版本差异有关。