概述

在使用 Metal 开发过程中,为了实现功能,我们可能会自定义多个 .metal 文件。我们也可能输出 sdk 给使用方调用。

此时就会遇到如下的问题:

  1. 太多的 .metal 文件,导致 sdk 文件增多,不好管理。
  2. 暴露的 .metal 透露了一些算法逻辑之类的,而这些有可能我们不希望给使用者看到。

那有没有好的解决方式呢?答案是有的,我们可以将多个 .metal 文件打包一个 Metal 库(.metallib格式) 文件。

本文将介绍如何在不使用 Xcode 情况下, 通过命令行来编译 Metal Shading Language 源代码并生成 Metal 库。

运行命令构建库

Metal 命令参数

如下是 Metal 命令行的一些参数说明,在终端中敲 xcrun -sdk macosx metal -help 或者 xcrun -sdk iphoneos metal -help 来查看帮助信息。

生成中间产物

使用 xcrun -sdk macosx metal MyLibrary.metal -o MyLibrary.air 命令将单个 .metal 文件编译成 .air 文件。.air 文件存储的是 Metal Shading Language 源码编译后的中间代码。

对于多个 .air 文件,我们可以通过 metal-ar 工具来将多个 .air 文件压缩到一个 .metalar 文件中 (metal-ar 类似于 UNIX 下 的ar)。

生成库文件

直接通过 metallib 工具将多个 .air 文件或 .metalar文件合并成一个 .metallib文件。

.metalar 文件只是一个中间文件,最后都会合并到 .metallib 中。

可以通过如下命令来实现合并: xcrun -sdk macosx metallib MyLibrary.air -o MyLibrary.metallib

加载和使用库文件

使用 Metal 的命令行工具构建了一个库之后,需要将生成的 .metallib 文件添加到 Xcode 项目中。然后调用 makeLibrary(filepath:) 方法以作为 MTLLibrary 来加载刚才生成的库。 guard let libraryFile = Bundle.main.path(forResource: "MyLibrary", ofType: "metallib") else { return } do { let myLibrary = try device.makeLibrary(filepath: libraryFile) } catch let error { print("Library error: \(error.localizedDescription)") } MTLLibrary 是 Metal 着色器函数的集合。加载预先编译的库,可以调用如下的方法: - makeDefaultLibrary() - makeLibrary(filepath:) - makeLibrary(data:) 加载运行时编译的库,可以调用如下的方法: - makeLibrary(source:options:completionHandler:) - makeLibrary(source:options:)

总结

本文介绍了如何在不使用 Xcode 情况下, 通过命令行来编译 Metal Shading Language 源代码并生成 Metal 库以及如何加载生成的库。


​​​​​​​

使用 Metal 命令行来构建库相关推荐

  1. python 基础命令-Python 命令行(CLI)基础库

    在 CLI 下写 UI 应用 前阵子看了一下自己去年写的 Python-视频转字符动画,感觉好糗..所以几乎把整篇文章重写了一遍.并使用 curses 库实现字符动画的播放. 但是感觉,curses ...

  2. 仅需5道题轻松掌握Python命令行相关标准库 | Python技能树征题

    仅需5道题轻松掌握Python命令行相关标准库 | Python技能树征题 0. 前言 1. 第 1 题:命令行日志记录 2. 第 2 题:将日志存储在磁盘上 3. 第 3 题:命令行参数解析 4. ...

  3. Java命令行程序构建工具airlift使用

    package com.ilucky.airlift;import java.util.Arrays;import io.airlift.airline.Cli; import io.airlift. ...

  4. python3 命令行参数处理库 argparse、docopt、click、fire 简介

    一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse.docopt.click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. 本文作 ...

  5. boost学习之命令行参数解析库program_options

    介绍 程序参数项(program options)是一系列name=value对,program_options 允许程序开发者获得通过命令行(command line)和配置文件(config fi ...

  6. 关于安装cmd命令行安装pyinstaller库失败的解决方法

    我相信很多同学都是看了北京理工大学嵩老师的python教学视频,然后安装pyinstallet库: 用cmd命令行输入pip install pyinstaller进行安装 遗憾的是,我们都用cmd通 ...

  7. golang实现一个linux命令ls命令(命令行工具构建)

    希望2023可以听到这些话: 恭喜你得到了这份工作 恭喜你的建议被采用了 恭喜你被录取了 恭喜你的考试顺利通过了 恭喜你上岸了 恭喜你升职了 恭喜你加薪了 恭喜你体检结果一切正常 在这篇文章下面许个愿 ...

  8. [league/climate]一个功能健全的命令行功能操作库

    我们在使用Linux系统当中,会和命令行打交道,很多的命令行并不只有一个简单的运行参数,而是有各种交互操作.简单地比如输入密码.Y/N.[yes]等效果,那么PHP能不能做到这些呢?可以的. 基本用法 ...

  9. mysql命令行如何建库_MySQL心得2--命令行方式建库和表

    1.创建使用create database或create schema命令可以创建数据库.create database 库名create database if not exists 库名(创建库并 ...

最新文章

  1. 财务用计算机可以一次摊销,购入的电脑可以一次性计提折旧吗
  2. 《编译与反编译技术实战》——第2章编译器实践概述
  3. tensorflow练习
  4. 分布式计算Hadoop系列之如何修改Eclipse插件
  5. D进制的A+B (20)
  6. perl学习之:localtime
  7. IntelliJ IDEA部署javaweb项目
  8. Buying Shovels CodeForces - 1360D(数论+找因子)
  9. 程序员面试金典 - 面试题 05.06. 整数转换(位运算)
  10. ArcGIS Runtime SDK for Android开发之调用GP服务(异步调用)
  11. 谷歌微软 IBM 激战云端,亚马逊地位恐将不保?
  12. 使用TensorFlow 来实现一个简单的验证码识别过程
  13. vofuria的开发(2)利用android studio+vuforia搭建AR开发环境
  14. Linux下JDK和Tomcat安装
  15. 数学教育与计算机教育ppt,计算机基础教育课件.ppt
  16. 全国31省份实体经济发展水平数据 (2004-2017年)
  17. win7无法连接打印机拒绝访问_win7 无法连接到打印机 添加本地打印机拒绝访问 - 卡饭网...
  18. wordpress连接mysql数据库_wordpress远程连接mysql数据库方法
  19. 长江中游水文站点流量数据下载及处理
  20. 视频水印去除工具哪个好

热门文章

  1. 计算机基础是公共必修课,计算机公共必修课《大学计算机基础》课程教学大纲.doc...
  2. 怎样将计算机32位换为62位,电脑32位怎么换62位
  3. Snowflake vs. Databricks谁更胜一筹?2022年最新战报
  4. Thinkpad L440 无线驱动突然无法使用,无法搜索到无线上网
  5. 详细解读什么是自适应巡航?
  6. 80后小学生必杀经典句子
  7. 后台服务架构高性能设计之道
  8. 雨天-一万个理由-LRC歌词下载
  9. Python中计算圆的周长,面积
  10. Redis 设计与实现 1:数据库 redisDb