大多数浏览器和
Developer App 均支持流媒体播放。
-
探索 Core Image 内核改进
了解如何将使用 Metal 着色语言编写的 Core Image 内核添加到您的 app 中。我们将探索如何为以 Metal 着色语言编写的 Core Image 内核使用 Xcode 规则和命名惯例,并帮助您理解 Metal 的 Stitchable 函数和动态库功能以使 Core Image 内核受益。
资源
相关视频
WWDC21
WWDC20
-
下载
♪播放重低音音乐♪ 欢迎大家 我是大卫海沃德 是Core Image小队的高级工程师 我今天会简短地报告 向您展示最新最好的技术 用来让你新增定制化的 Metal Core Image核心 到你的Xcode专案 在这次的报告 我会讨论到 一般在Metal 写定制化CIKernels的好处 接着我会介绍两个建议的方法 让你建立Metal CIKernels 然后我会一步步示范 要如何把这些加到你的项目里 首先 我们来复习一下 在Metal写定制化CIKernels的好处 在Metal写定制化CIKernels 你会有Core Image额外功能的存取权 像是自动分割和串接功能 这会提升你应用程序的表现 让它把更多时间用在编译核心 从执行期到建立完你的应用程序 这么做可以让你的kernels使用 高性能的功能 像是gather-reads group-writes和half-float math 最后 它可以让你的开发人生更轻松 在你打字的同时将语句标注起来 在你建立时检查换行错误 有了上述的动机 我会一步步做给你看 要如何把Metal Core Image的核心 加入你的应用程序 现在有两种推荐的作法 把CIKernels加到你的项目 我也会详细地解说这两种方法 我会把这个当作外部的方法 因为核心功能需要被指定成 外部的“C”调用 而且要用定制化的建立标志来建立 第二个方法是从iOS15 和macOS12才有的 我会把这个当作可缝合的方法 因为核心功能需要被 归在可缝合的 它是用Metal动态库来执行 在这两个方法中 都有四个基本的步骤要遵守 首先是把你的项目配置好 第二是把Metal CIKernel的源文件 加到你的专案里 第三是写你的Metal CIKernel程序代码 第四是写Swift或Objective-C程序代码 来启动和使用你的核心 来建立新的CIImage 那我们先来解释这四步骤 在用外部CIKernels时 先从项目配置开始 不像传统的Metal计算和图形着色器 这个Core Image Metal程序代码 必须被编译 也要 跟特殊的标签链接 我建议你加两个定制化的建立规则 到你的项目目标 这会让标签自动被使用 首先 你先到项目的目标设定 在文件名是.ci.metal结尾的文件 加上建立规则 这些有了扩展功能的文件 规则会以一行的脚本形式执行 调用Metal编译器 有着要求的-fcikernel标签 这个建立规则会产生二进制输出 以.ci.air结尾 接着你要加第二个建立规则 给以.ci.air结尾的文件 有了这个扩展功能的文件 这个规则会执行一行形式的脚本 调用有着要求的-cikernel标签 的Metal链接器 这个建立规则会产生输出 到你应用程序的来源目录 会以.ci.metallib结尾 现在你已经新增了定制化的建立规则 你只需要再加.ci.metal的来源 到你的项目 要这样做 你就从文件菜单选择 你想要加新的Metal的文件 然后把那些文件 重新命名成以.ci.metal结尾 下一步是把你的CIKernel写进 Metal的源文件 首先 在来源的最上面 你要包含CoreImage.h的标题 让你可以取得所有类别的存取权 那些Core Image提供的 核心功能需要被指定成外部的“C” 才能被Core Image辨认 你真正启用核心的内容 是取决于你的想象 举个你可以做的例子 我推荐你去看2020年 WWDC开发者大会的报告 题目是“用AVFoundation 编辑和回放HTTP实时流媒体” 最后一步是加入Swift程序代码 来加载你的核心 然后使用它来建立新的影像 核心通常被用在CIFilter的子类 它有一些性质 像是输入的图像 和其他输入的参数 我建议你的筛选器 把它的CIKernel对象实例化 成静态性质 这样 加载金属化来源 在它第一次被需要时只会执行一次 因为有我解释的定制化建立规则 你需要指定一个来源网址 名称要跟你的来源一样 和一个延伸的.ci.metallib 最后 CIFilter子类必须覆盖 输出影像的属性 在获得器中 你要从静态性质取得核心 然后用它的使用方法建立新的图像 根据输入性质 上述完整地解释了 建立外部CIKernels的过程 现在我们来解释新的过程 来建立可缝合的CIKernels 要用可缝合的方法 只有一个设定需要被改变 来配置你的Xcode项目 这个设定会叫Metal链接器 去针对Core Image框架链接 要这样做 只需要去项目的目标设定 然后新增一个建立设定给 其他Metal链接器标签 有着“-framework CoreImage”值的 因为可缝合的CIKernels 不需要定制化的建立规则 你可以直接把.metal来源 加到你的专案 不需要特别的字尾 你可以在一个或多个源文件加入核心 预设状态是 Xcode会把它们 全部建立在.metallib来源 下一步是把你的CIKernel 写进Metal源文件 跟之前一样 你要包含CoreImage.h标题 才能取得Core Image类别的存取权 但有了这个方法 核心必须被归在 可缝合的 才能被Core Image辨认 再一次 最后一步是把Swift程序代码加入 来加载你的核心 然后使用它来建立新的图像 唯一在可缝合的CIKernels改变的是 你可以直接加载来源 用预设.metallib的标准名称 这总结了建立可缝合CIKernels的过程 这里在补充说明一些 用这个方法的好处 可缝合的核心可以 针对其他Metal资源库链接 它们现在也支持输入的参数 是整数和无正负号整数的向量类型 另一个利基好处是 可缝合的核心 可以在执行期从来源被编译 大部分的应用程序不应该用这个功能 因为它会导致初始编译变慢 虽然这样说 但还是有一些类别的应用程序 会从这个弹性得到好处 还有最后一个主题要在这次报告介绍 可缝合CIKernel的执行 取决于两个重要的Metal功能 第一个是新的Metal着色器语言 2.4版本 除了其他东西之外 这个版本支持可缝合的属性 让编译程序联合额外的元数据 和每个功能 第二是Metal动态数据库功能 用来让你的核心 链接Core Image Metal类别 想要了解更多关于Metal功能 你一定要去看 “发现编译程序 在Metal的作业流程”报告 但要小心 Metal动态数据库 只在一些图像装置上被支持 具体来说就是 有A11以上版本的iPhone和iPad 所有有Apple silicon的Mac 和有AMD Navi和Vega图形处理器 并用Intel处理器的Mac 你的应用程序应该可以 正确地检查Metal装置 是否支持动态数据库 在使用可缝合CIKernels前 以上就是我一步步地解释 要如何用两个推荐的方法 来把Metal CIKernels 加入你的应用程序 每个方法我都有讲 要如何配置你的项目 写核心的来源 和初始化核心对象 我希望这些可以 让你新增更棒的影像特效 到你应用程序的图像和影像中 谢谢观看 敬请继续欣赏 2021年WWDC开发者大会 ♪
-
-
3:54 - Extern CIKernels
// MyKernels.ci.metal #include <CoreImage/CoreImage.h> // includes CIKernelMetalLib.h using namespace metal; extern "C" float4 myKernel (coreimage::sample_t s, float param, coreimage::destination dest) { float4 result = s; // Example code to create striped pattern float diagLine = dest.coord().x + dest.coord().y; float stripe = fract(diagLine/20.0 + param*2.0); // Color range check if((stripe > 0.5) && ((s.r > 1) || (s.g > 1) || (s.b > 1))) result = float4(2.0, 0.0, 0.0, 1.0); return result; }
-
4:32 - Load your extern CI kernel and apply it to create a new image
class MyFilter: CIFilter { var inputImage: CIImage? var inputParam: Float = 0.0 static var kernel: CIColorKernel = { () -> CIColorKernel in let url = Bundle.main.url(forResource: "MyKernels", withExtension: "ci.metallib")! let data = try! Data(contentsOf: url) return try! CIColorKernel(functionName: "MyKernel", fromMetalLibraryData: data) }() override var outputImage : CIImage? { get { guard let input = inputImage else { return nil } return MyFilter.kernel.apply(extent:input.extent, arguments:[input, inputParam]) } } }
-
6:18 - Stitchable CI Kernel
// MyKernels.ci.metal #include <CoreImage/CoreImage.h> // includes CIKernelMetalLib.h using namespace metal; [[stitchable]] float4 myKernel (coreimage::sample_t s, float param, coreimage::destination d) { float4 result = s; // Example code to create striped pattern float diagLine = dest.coord().x + dest.coord().y; float stripe = fract(diagLine/20.0 + param*2.0); // Color range check if((stripe > 0.5) && ((s.r > 1) || (s.g > 1) || (s.b > 1))) result = float4(2.0, 0.0, 0.0, 1.0); return result; }
-
6:40 - Load your stitchable CI kernel and apply it to create a new image
class MyFilter: CIFilter { var inputImage: CIImage? var inputParam: Float = 0.0 static var kernel: CIColorKernel = { () -> CIColorKernel in let url = Bundle.main.url(forResource: "default", withExtension: "metallib")! let data = try! Data(contentsOf: url) return try! CIColorKernel(functionName: "MyKernel", fromMetalLibraryData: data) }() override var outputImage : CIImage? { get { guard let input = inputImage else { return nil } return MyFilter.kernel.apply(extent:input.extent, arguments:[input, inputParam]) } } }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。