2017-10-14 55 views
4

我想创建一个适用于METAL Api(iOS)的框架。我对这个平台很新,我想知道如何构建框架来处理.metal文件(我正在构建一个静态库,而不是动态的)。它们应该是.a文件的一部分,还是作为框架捆绑中的资源文件?或者还有其他方法可以做到这一点吗?谢谢。作为iOS框架的一部分的金属文件

更新: 对于那些谁解决这个 - 我结束了以下warrenm的1所建议的选项 - 转换的。金属文件转换成一个字符串,并调用newLibraryWithSource:options:error:。 虽然它不是最好的性能,但它允许我只发布一个框架文件,无需额外的资源导入。对于创建使用Metal,ARKit等与着色器文件的框架的人来说,这可能很有用。

+0

很高兴你找到了适合你的方法。对于后人,我在下面进行了评论,并共享了一个概念验证项目,该项目允许您保持着色器预编译的好处,同时仍然只发送一个文件。如果我在生产中这样做,那几乎肯定是我会采取的方法。 – warrenm

回答

7

有很多方法可以为静态库提供金属着色器,所有这些都有不同的折衷。我会尽力在这里列举他们。

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

这可能是最糟糕的选择。这个想法是,你将你的Metal着色器代码预处理成字符串文字包含在你的静态库中。然后,您将使用newLibraryWithSource:options:error: API(或其异步兄弟)将源变成MTLLibrary并检索函数。这要求您设计一个执行.metal到字符串转换的过程,并且您将失去着色器预编译的优势,从而导致生成的应用程序变慢。

2)船舶。金属文件旁边的静态库,并要求图书馆用户将其添加到自己的应用目标

所有的事情考虑,这是一个不错的选择,尽管它把更多的负担压在你的用户和暴露你的金属着色器源(如果这是一个问题)。静态库中的代码可以使用“默认库”(newDefaultLibrary),因为代码将由Xcode自动编译到应用程序的default.metallib中,该应用程序作为资源嵌入到应用程序包中。

3)船舶.metallib文件旁边的静态库

这是易用性的使用,性能之间的安全性良好的中间地带,和(因为它不会暴露你的着色器源,仅其IR )。基本上,你可以在你的项目中创建一个“金属库”目标,把你的着色器代码放入其中。这将生成一个.metallib文件,您可以随同您的静态库一起发货,并将您的用户作为资源嵌入到其应用目标中。您的静态库可以在运行时使用newLibraryWithData:error:newLibraryWithURL:error: API加载.metallib。由于着色器将被预编译,所以创建库会更快,并且您将保持编译时诊断的优势。

+0

感谢您的详细解答。只是为了说清楚 - 如果我不想向用户发送另一个文件 - 第一个解决方案只有一个适合? – DocForNoc

+0

我想你可以嵌入预编译的库,方法是从一个metallib文件中获取字节,并将它们写入静态库源文件中的字节数组中。这将满足单个文件的要求,同时也提供了预编译的好处。 – warrenm

+0

我刚刚测试了最后一种方法,它确实有效。这是一个概念验证项目,完成所有工作:构建一个''。metallib',将其烧成一个头文件,并在运行时创建一个'MTLLibrary',从中可以生成管道:https://www.dropbox.com/s/8w30r1gyutj9twc/EmbeddedKernelSample.zip?dl=0。这绝不是生产就绪,但它应该足以说明方法。 – warrenm

相关问题