我正在尝试创建一个与METAL Api(iOS)一起使用的框架。我对这个平台还很陌生,我想知道如何构建可与.metal文件一起使用的框架(我正在构建静态库,而不是动态库)。它们应该是.a文件的一部分,还是作为框架 bundle 包中的资源文件?还是有其他方法可以做到这一点?谢谢。

更新:
对于那些解决此问题的人-我最终遵循了warrenm的1的建议选项-将.metal文件转换为字符串并调用newLibraryWithSource:options:error:
尽管这不是最佳性能,但它只允许我发送一个框架文件,而无需导入其他资源。这对创建使用着色器文件使用Metal,ARKit等的框架的人可能很有用。

最佳答案

有很多方法可以为Metal着色器提供静态库,但都需要权衡取舍。我将在这里尝试枚举它们。

1)将.metal文件转换为静态字符串,然后将其烘焙到静态库中。

这可能是最糟糕的选择。这个想法是您将Metal着色器代码预处理为字符串,这些字符串作为字符串文字包含在静态库中。然后,您将使用newLibraryWithSource:options:error: API(或其异步同级)将源代码转换为MTLLibrary并检索函数。这需要您设计一个完成.metal -to-string转换的过程,而您会失去着色器预编译的好处,从而使生成的应用程序变慢。

2)将.metal文件与您的静态库一起发送,并要求库用户将其添加到他们的应用程序目标中

考虑所有因素,这是一个不错的选择,尽管它给您的用户带来了更多负担,并暴露了您的Metal shader源(如果这是一个问题)。静态库中的代码可以使用“默认库”(newDefaultLibrary),因为该代码将由Xcode自动编译到应用程序的default.metallib中,该.metallib作为资源嵌入在应用程序包中。

3)将.metallib文件与您的静态库一起发送

这是易用性,性能和安全性之间的一个很好的中间立场(因为它不公开您的着色器源,仅公开其IR)。基本上,您可以在项目中创建一个“Metal 库”目标,将着色器代码放入其中。这将生成一个.metallib文件,您可以将该文件与静态库一起提供,并将用户作为资源嵌入其应用程序目标中。您的静态库可以在运行时使用newLibraryWithData:error:newLibraryWithURL:error: API加载ojit_code。由于您的着色器将被预编译,因此创建库将更快,并且您将保留编译时诊断的优势。

关于ios - Metal 文件作为iOS框架的一部分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46742403/

10-12 14:33
查看更多