您可以通过在构建步骤中将 .metal 文件预编译到 Metal 库中并从应用程序目标中删除 .metal 源代码来解决此问题。
从目标中删除 .metal 文件
在项目导航器中选择您的 .metal 文件,然后取消选中发出警告的目标。
金属库编译脚本
在您的项目中创建一个名为 CompileMetalLib.sh 的 bash 脚本,以及您的 .metal 文件,其内容如下:
xcrun -sdk iphoneos metal -c MyShader.metal -o MyShader.air
xcrun -sdk iphoneos metallib MyShader.air -o MyShader.metallib
rm MyShader.air
确保通过运行授予它可执行权限chmod +x CompileMetalLib.sh
。
MyShader.air
是中间编译步骤,MyShader.metallib
是完全编译的金属库。在此处阅读有关编译 Metal 文件的所有信息
如果您正在为 OS X 编译,请更改iphoneos
为macosx
.
在构建期间运行编译脚本
现在您需要在构建阶段触发此脚本。
向您的目标添加一个新的运行脚本阶段。内容应如下所示:
cd ${SRCROOT}/path/to/folder/containing/yourshader
./CompileMetalLib.sh
拖动此步骤很重要,以便它发生在Copy Bundle Resources步骤之前。
更改代码以使用已编译的 Metal 库
您现在将从您的应用程序包中加载已编译的 Metal 库。
这是一些伪 Swift:
let metalLibPath = Bundle.main.path(forResource: "MyShader", ofType: "metallib")
let myLibrary = try metalDevice.makeLibrary(filepath: metalLibPath)
结果
您正在使用外部脚本手动编译 .metal 文件,并将编译后的库复制到捆绑资源中。您的代码会加载此库。现在您的目标中没有任何 .metal 文件,模拟器将不再抛出无法为 x86_64 编译的警告。