更新:
对于那些解决这个问题的人 – 我最终关注了warrenm的1的建议选项 – 将.Metal文件转换为字符串并调用newLibraryWithSource:options:error:.
虽然它不是性能最好的,但它允许我只发送一个框架文件,而无需导入额外的资源.对于使用着色器文件创建使用Metal,ARKit等的框架的人来说,这可能很有用.
解决方法
1)将.Metal文件转换为静态字符串,这些字符串将被烘焙到静态库中.
这可能是最糟糕的选择.我们的想法是将您的Metal着色器代码预处理为字符串,这些字符串作为字符串文字包含在静态库中.然后,您将使用newLibraryWithSource:options:error:API(或其异步兄弟)将源转换为MTLLibrary并检索函数.这需要您设计一个进行.Metal-to-string转换的过程,并且您将失去着色器预编译的好处,从而使得生成的应用程序变慢.
2)将.Metal文件与静态库一起发送,并要求库用户将它们添加到其应用目标
考虑到所有这些,这是一个不错的选择,虽然它会给你的用户带来更多的负担并暴露你的Metal着色器源(如果这是一个问题).静态库中的代码可以使用“默认库”(newDefaultLibrary),因为代码将由Xcode自动编译到应用程序的default.Metallib中,该应用程序包作为资源嵌入到应用程序包中.
这是易用性,性能和安全性之间的良好中间点(因为它不会暴露您的着色器源,只会暴露其IR).基本上,您可以在项目中创建一个“金属库”目标,并将着色器代码放入其中.这将生成一个.Metallib文件,您可以将其与静态库一起发布,并将您的用户作为资源嵌入其应用程序目标中.您的静态库可以在运行时使用newLibraryWithData:error:或newLibraryWithURL:error:API加载.Metallib.由于您的着色器将被预编译,因此创建库将更快,并且您将保持编译时诊断的好处.