Metal 之旅之MTLLibrary

什么是MSL?

MSL是Metal Shading Language 的简称,为了更好的在GPU执行程序,苹果公司定义了一套类C++的语言(Metal Shading Language ),在GPU运行的程序都是用这个语言来编写的。

什么是MTLLibrary?

.metal后缀的文件编译后会生成metallib文件,MTLLibrary通过metallib文件来创建实例,提供了swift,oc调用metal文件中的函数能力,更多的可以看到做cpu与gpu通信的一个桥梁。

MTLLibrary加载的方式有哪些

MTLLibrary 加载的方式有很多种,这里给大家分享经常使用的两种方式

1,字符串方式加载

代码如下:

复制代码
func createLibrary(_ device:MTLDevice) -> MTLLibrary?{
        let shader = """
        #include <metal_stdlib>
        using namespace metal;

        struct VertexIn {
          float4 position [[ attribute(0) ]];
          float4 color [[ attribute(1) ]];
        };

        struct VertexOut {
            float4 position [[position]];
            float4 color; // 确保输出与片段着色器的输入匹配
        };
        vertex VertexOut vertex_main(const VertexIn in [[stage_in]]) {
            VertexOut out;
            out.position = in.position;
            out.color = in.color; // 将颜色从输入复制到输出
            return out;
        }


        fragment float4 fragment_main([[stage_in]] VertexOut in) {
            // 直接使用顶点着色器传递过来的颜色值
            return in.color;
        }
        """

        // metal使用shader
        do {
            let library = try device.makeLibrary(source: shader, options: nil)
            return library
        } catch let error {
            #if DEBUG
            fatalError()
            #endif
            return nil
        }

    }

特点:使用简单,无需额外创建metal文件,无需担心结构体,方法名重复,适合简单逻辑的处理,缺点是MSL语法错误没有高亮提示,不适合处理复杂逻辑,是运行时编译

2,metal文件方式加载

代码如下:

复制代码
func createLibrary(_ device:MTLDevice) -> MTLLibrary?{
      //项目中已经有了metal文件了
        guard let libraryURL = Bundle.main.url(forResource: "default", withExtension: "metallib") else {
            return nil
        }
        let library = try! device.makeLibrary(URL: libraryURL)
        return library
    }

特点:适合复杂的业务场景,MSL能够高亮显示语法错误,每个业务模块都可以单独创建一个单独的metal文件,通过命令单独编译为独立的metallib文件,避免创建library对象时导入过多不需要的内容,编译好的metallib和在ipa包的目录下,每次创建library时不用再运行时编译了。

注意:默认情况下不论有多少个metal文件,打包时都会编译为默认的default.metallib文件,此时需要注意不同文件中结构体,函数名不要重复,如果通过命令行编译不同的metallib文件则不需要考虑这种问题,使用命令行编译metal文件参考这篇博客《使用 Metal 命令行来构建库》网址:https://blog.csdn.net/SkyNullCode/article/details/122190736

相关推荐
2501_9159090621 小时前
Charles 抓不到包怎么办?iOS 调试过程中如何判断请求路径
android·ios·小程序·https·uni-app·iphone·webview
2501_9160074721 小时前
iOS和iPadOS文件管理系统全面解析与使用指南
android·ios·小程序·https·uni-app·iphone·webview
2501_915921431 天前
iOS App 开发阶段性能优化,观察 CPU、内存和日志变化
android·ios·性能优化·小程序·uni-app·iphone·webview
游戏开发爱好者81 天前
在 iOS 开发、测试与上架过程中 如何做证书管理
android·ios·小程序·https·uni-app·iphone·webview
ii_best1 天前
按键精灵安卓/IOS手机助手 × 手机按键 App:1 分钟搞定设备连接(超详细教程)
android·ios·智能手机·自动化·编辑器
2501_916007471 天前
在没有 Mac 的情况下完成 iOS 应用上架 App Store
android·macos·ios·小程序·uni-app·iphone·webview
TheNextByte11 天前
iPhone存储空间已满?如何轻松释放iPhone空间?
android·ios·iphone
—Qeyser2 天前
Flutter 颜色完全指南
android·flutter·ios
2501_916008892 天前
iOS 上架需要哪些准备,账号、Bundle ID、证书、描述文件、安装测试及上传
android·ios·小程序·https·uni-app·iphone·webview
Zender Han2 天前
Flutter Android 启动页 & App 图标替换(不使用任何插件的完整实践)
android·flutter·ios