“缺少插件”的提示本不该出现

设计札记

工程文件应该在哪台电脑上都按保存时的样子打开。所以 Keyframe 干脆不给插件留空位,也就没有哪台电脑会发现它空着。

那条“缺少效果”的提示到底在说什么

这个场面多半遇到过:同事发来一个工程,或者在新电脑上打开去年的项目,画面还没出来,After Effects 先弹出警告,说工程里用到的效果没有加载。时间轴和效果控件里,这些效果的名字前面标上了“缺失”,连按两下 F 就能列出合成里所有缺失的效果,Adobe 关于效果的帮助⁠ (外部网站,在新标签页打开)里写的就是这套行为。

工程是打开了,软件没崩,参数也都还在。可画面已经不是保存时的样子:粒子、辉光、把角色串起来的绑定,统统没有画出来。想恢复原样,只能在这台电脑上把对应的插件找到、买授权或者重新装上。

我们觉得这条提示指向的是一个设计问题,而不只是装机时的杂事。工程文件本该是一个承诺:打开我,看到的就是我本来的样子。只要工程有一部分住在每台电脑各自安装的软件里,文件就没法独自兑现这个承诺。所以 Keyframe 根本没有插件接口:工程画出自己要用的东西,要么是编辑器的一部分,要么是工程的一部分。

After Effects

  • Trapcode Particular粒子,第三方插件
  • Duik骨骼绑定,第三方脚本
  • PixelsWorld自写着色器,第三方插件
  • 换一台没装插件的电脑效果成了“缺失”的占位,图层不带它渲染

Keyframe

  • 粒子与模拟编辑器自带,在显卡上计算
  • 骨架与网格蒙皮一种图层
  • 着色器与画面程序项目数据,跟着工程走
  • 换一台电脑有支持 WebGPU 的浏览器就能打开

这个立场不算温和,代价也实实在在。谈代价之前,先公道地说说插件当初为什么会出现。

插件当年是个好答案

这不是 Adobe 粗心。After Effects 很早就定型为闭源软件,外部开发者改不了它的核心,它只留了三个口子:表达式写属性上的逻辑,脚本让程序自动化,编译好的效果插件带来新的像素处理方式。核心没有的东西,都是从这三扇门进来的。

进来的东西非常多。粒子系统、Duik⁠ (外部网站,在新标签页打开) 这样的角色绑定工具、让人写自己着色器的桥接插件,不少后来成了行业里的标准做法。正是这个生态让 After Effects 几乎什么都能做,这是它实打实的长处,我们不假装能比。

代价是,你屏幕上的 After Effects 和同事屏幕上的,从来不完全是同一个程序。每个插件各自安装、各自更新,各守各家的规矩,一个工程能不能原样打开,取决于这台电脑恰好装了什么。“缺少效果”的提示就是这份代价,偏偏还在最糟的时候到来:工程离开做它的那台电脑的时候。

在 Keyframe 里,“内置”指什么

Keyframe 的核心是从零写起的,用不着给别人留门来补核心缺的东西。做动态图形时人们最常为之去装插件的那些能力,在这里都是编辑器自己的功能,由我们来写,同时发到每个人手上。

跟踪最能说明问题。点跟踪与平面跟踪、蒙版跟踪(含面部)、变形稳定器、内容识别填充和 3D 摄像机跟踪器,都在下面这个跟踪器面板⁠ (在新标签页打开)里,跟踪完的结果写成被它带动的图层上的普通关键帧。抠像效果、Roto 笔刷和调整边缘也在编辑器里。粒子世界在显卡的计算通道上运行。带 FK 与 IK 的骨架和网格蒙皮是一种图层⁠ (在新标签页打开),不是脚本用形状层拼出来的骨骼。

一段小卡片向右上方漂移的视频已被跟踪:跟踪点落在卡片上,身后画出了它的路径,一个圆形跟着它移动。右侧打开着跟踪器面板。
  1. 给选中的视频图层添加跟踪器。
  2. 跟踪器跟住什么、怎样应用。
  3. 向后或向前,分析一帧或一直分析到头。
  4. 由跟踪结果带动的图层。
  5. 把跟踪结果写成目标上的关键帧。
  6. 跟踪点及其路径:特性区域、搜索区域与附加点。

剩下的是任何编辑器都没法全部预料的那一块:某个项目偏偏需要、又没人做过的独特画面。为此 Keyframe 有写成代码的效果⁠ (在新标签页打开),也就是着色器效果、模拟效果和画面程序,可以自己写,也可以让 Agent 写。它和插件的区别在于代码放在哪里:代码存在工程里,跟着工程走;只能经版本化的接口运行,画面程序更是在另一个源的沙箱里运行;打开带代码的工程时,编辑器会先告诉你。

这样一来,搬一个工程就是搬一个文件。项目包⁠ (在新标签页打开)里有合成、图层和关键帧,也有导入的素材和撤销历史。在任何支持 WebGPU⁠ (外部网站,在新标签页打开) 的浏览器里打开,每个效果都在,因为没有别的东西要装:编辑器就是一个网页,打开文件的人用的就是和你同一个编辑器。

内置不等于从零造轮子

把能力做进编辑器,容易被理解成什么都自己写。其实不是,真那样做也不明智:跟踪、分割、补全画面都是很深的领域,最好的实现是作者花了多年才做出来的。我们的规矩正好相反:有成熟的库,就直接用。

跟踪和视频分析用 OpenCV.js 与 MediaPipe,补背景用 LaMa 补全模型,渲染经 luma.gl 跑在 WebGPU 上,表达式在隔离的 JavaScript 引擎 QuickJS 里运行。这些都不是 After Effects 意义上的插件,区别在于由谁来装、什么时候装。

  1. 编辑器选定成熟的库,锁定版本接入前先审许可证和维护状况。
  2. 编辑器放在 Keyframe 的适配层后面换掉这个库,已保存的工程一点不变。
  3. 你的设备从 Keyframe 自己的服务器取来,校验后在你的设备上运行补背景模型这类大文件,第一次用到时才下载。
  4. 编辑器结果存成工程数据跟踪结果成为关键帧,或带素材校验的分析记录。

每个库都由我们装一次、给所有人用,而且放在我们自己的适配层后面。文件来自我们自己的服务器,带完整性校验,工程不会依赖哪台电脑恰好装了什么。库的输出又存成普通的工程数据,所以工程也不依赖库本身:跟踪就是关键帧;模拟的结果只取决于参数和帧号,不管从哪一帧跳过来都一样。明年要是出现更好的跟踪算法,我们在适配层后面换掉就是,你保存的工程察觉不到。

我们放弃了什么

这是一笔真实的交换,装作没有代价就不诚实了。没有插件接口,就没有第三方插件。那些花了多年把一套粒子系统或一个抠像器做到极致的专家,没法把作品带进 Keyframe;在 After Effects 里能花钱买插件补上的缺口,在这里买不到。不做插件 SDK、ExtendScript 与 UXP 脚本、MOGRT 和 Dynamic Link 是有意的选择,这些门对本可以在门后做出好东西的人也一样关着。

这也意味着,功能来得多快,全看我们做得多快。After Effects 现在的效果比 Keyframe 多得多;差距我们公开列着、一项项补,但一个团队做的编辑器,不可能下个月就赶上几十年攒下的生态。编辑器只能在支持 WebGPU 的浏览器里运行,没有备用的渲染方式。还有,“打开都一样”指的是每个效果连同参数都在,不是说写成代码的效果在每块显卡上都画出一模一样的像素:我们保证的是同一台电脑上预览与导出一致。

After Effects

  • 效果插件编译好的 C++,来自许多厂商
  • 脚本ExtendScript 或 UXP,让程序自动化
  • 表达式写在属性上的逻辑

Keyframe

  • 着色器、模拟与画面程序存在工程里,经版本化接口运行
  • 表达式写在属性上的逻辑,在隔离环境里运行
  • Agent和界面用同一套操作完成自动化
  • 新的面板、工具与导入格式只能由我们来做

对 Keyframe 要做的那类项目,我们认为这笔交换值得,也尽量留好了合适的出口。写成代码的效果覆盖了装插件最常见的理由,也就是编辑器做不出来的画面,却不会把“缺少效果”的提示带回来,因为代码就是文件的一部分。自动化交给 Agent⁠ (在新标签页打开):它和界面用同一套注册操作,每一步都能审核、能撤销,不像脚本那样各有各的规矩。这两样都替代不了一个生态,它们做的是让工程保持完整。

仍落后于 After Effects 的地方

工程应该带着它需要的东西

“缺少效果”只是一个小对话框,背后却是一个大选择:让画面成立的那些东西,属于文件,还是属于电脑。After Effects 很早就选了电脑,换来一个了不起的生态。我们选了文件。

这意味着今天功能更少,将来也不会有插件市场。也意味着你把 Keyframe 工程发给别人,对方拿到的是完整的一份,每个效果都在,不用先四处去找。在人和 Agent 一起做同一个工程的工具里,我们更愿意守住这个承诺。

接着看