生成MTLLibrary

生成Metal库有很多方法

  • 从Metal源码生成库: 将源码放进一个string中,然后使用newLibraryWithSource来构建MTLLibrary
  • 将.metal编译为.metallib,生成.metallib可以是Xcode自动生成,然后用newDefaultLibrary取出;或者手动用编译工具生成(newLibraryWithFile);还有奇技淫巧,将生成的.metal转成.h头文件,之后用newLibraryWithData来取用。

参考:
Metal file as part of an iOS framework
Metal default library not found
将.metal转成.h的示例
该答主很6

手动编译Metal源码并生成Metal库

这个方法是比较推荐的
具体步骤:

  1. 使用metal工具将每一个.metal文件编译为.air文件
    xcrun -sdk macosx metal -c mylibrary.metal -o mylibrary.air
  2. 使用metallib工具将.air或者.metalar文件生成一个.metallib文件
    xcrun -sdk macosx metallib mylibrary.air -o mylibrary.metallib

参考:
Functions and Libraries
Creating Libraries During the App Build Process

将多个.metal编译生成一个.metallib

按照官方步骤:

  1. 使用metal工具将每一个.metal文件编译为.air文件
    xcrun -sdk macosx metal -c mylibrary.metal -o mylibrary.air
  2. 使用metal-ar工具将多个.air文件归档为一个.metalar文件(具体操作类似于UNIX ar工具)
    xcrun -sdk macosx metal-ar r mylibrary.metalar mylibrary1.air mylibrary2.air mylibrary3.air
  3. 使用metallib工具将.air或者.metalar文件生成一个.metallib文件
    xcrun -sdk macosx metallib mylibrary.air -o mylibrary.metallib
    或者
    xcrun -sdk macosx metallib mylibrary.metalar -o mylibrary.metallib

小规模测试(将三个.metal生成一个.metallib)成功,但是网上说会存在问题,实际测试中没有发现问题,具体原因目前不明。

参考:
ar command in Linux with examples
Compiling multiple Core Image metal shaders into 1 Metal Library
Compiling multiple .metal files into one .metallib

将.metallib放在bundle文件夹中使用

NSError *libraryError = NULL;
NSString *libraryFile = [[NSBundle mainBundle] pathForResource:@"MyLibrary" ofType:@"metallib"];
id <MTLLibrary> myLibrary = [_device newLibraryWithFile:libraryFile error:&libraryError];
if (!myLibrary) {
    NSLog(@"Library error: %@", libraryError);
}

iOS 获取从制定bundle文件中读取图片的图片

posted @ 2020-02-29 16:14  Lo3King  阅读(1404)  评论(0编辑  收藏  举报