使用 Metal 命令行来构建库
概述
在使用 Metal 开发过程中,为了实现功能,我们可能会自定义多个 .metal 文件。我们也可能输出 sdk 给使用方调用。
此时就会遇到如下的问题:
- 太多的 .metal 文件,导致 sdk 文件增多,不好管理。
- 暴露的 .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 命令行来构建库相关推荐
- python 基础命令-Python 命令行(CLI)基础库
在 CLI 下写 UI 应用 前阵子看了一下自己去年写的 Python-视频转字符动画,感觉好糗..所以几乎把整篇文章重写了一遍.并使用 curses 库实现字符动画的播放. 但是感觉,curses ...
- 仅需5道题轻松掌握Python命令行相关标准库 | Python技能树征题
仅需5道题轻松掌握Python命令行相关标准库 | Python技能树征题 0. 前言 1. 第 1 题:命令行日志记录 2. 第 2 题:将日志存储在磁盘上 3. 第 3 题:命令行参数解析 4. ...
- Java命令行程序构建工具airlift使用
package com.ilucky.airlift;import java.util.Arrays;import io.airlift.airline.Cli; import io.airlift. ...
- python3 命令行参数处理库 argparse、docopt、click、fire 简介
一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse.docopt.click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. 本文作 ...
- boost学习之命令行参数解析库program_options
介绍 程序参数项(program options)是一系列name=value对,program_options 允许程序开发者获得通过命令行(command line)和配置文件(config fi ...
- 关于安装cmd命令行安装pyinstaller库失败的解决方法
我相信很多同学都是看了北京理工大学嵩老师的python教学视频,然后安装pyinstallet库: 用cmd命令行输入pip install pyinstaller进行安装 遗憾的是,我们都用cmd通 ...
- golang实现一个linux命令ls命令(命令行工具构建)
希望2023可以听到这些话: 恭喜你得到了这份工作 恭喜你的建议被采用了 恭喜你被录取了 恭喜你的考试顺利通过了 恭喜你上岸了 恭喜你升职了 恭喜你加薪了 恭喜你体检结果一切正常 在这篇文章下面许个愿 ...
- [league/climate]一个功能健全的命令行功能操作库
我们在使用Linux系统当中,会和命令行打交道,很多的命令行并不只有一个简单的运行参数,而是有各种交互操作.简单地比如输入密码.Y/N.[yes]等效果,那么PHP能不能做到这些呢?可以的. 基本用法 ...
- mysql命令行如何建库_MySQL心得2--命令行方式建库和表
1.创建使用create database或create schema命令可以创建数据库.create database 库名create database if not exists 库名(创建库并 ...
最新文章
- 财务用计算机可以一次摊销,购入的电脑可以一次性计提折旧吗
- 《编译与反编译技术实战》——第2章编译器实践概述
- tensorflow练习
- 分布式计算Hadoop系列之如何修改Eclipse插件
- D进制的A+B (20)
- perl学习之:localtime
- IntelliJ IDEA部署javaweb项目
- Buying Shovels CodeForces - 1360D(数论+找因子)
- 程序员面试金典 - 面试题 05.06. 整数转换(位运算)
- ArcGIS Runtime SDK for Android开发之调用GP服务(异步调用)
- 谷歌微软 IBM 激战云端,亚马逊地位恐将不保?
- 使用TensorFlow 来实现一个简单的验证码识别过程
- vofuria的开发(2)利用android studio+vuforia搭建AR开发环境
- Linux下JDK和Tomcat安装
- 数学教育与计算机教育ppt,计算机基础教育课件.ppt
- 全国31省份实体经济发展水平数据 (2004-2017年)
- win7无法连接打印机拒绝访问_win7 无法连接到打印机 添加本地打印机拒绝访问 - 卡饭网...
- wordpress连接mysql数据库_wordpress远程连接mysql数据库方法
- 长江中游水文站点流量数据下载及处理
- 视频水印去除工具哪个好