随着年关将近,我们都期待着享受 Zed 闪亮新基础 GPUI 2 带来的好处。看着所有功能在 nightly build 中重新上线,并开始以团队形式使用新版 Zed,这真是一件有趣的事。以下是一些来自前线的更新...
Nathan 和 Antonio
GPUI 2 在开发人员生产力方面是一个巨大的进步,但性能必须非常出色。随着越来越多的 Zed 功能在新框架上重新上线,本周我们真正专注于理解和改进 GPUI 的性能。
为了进行基准测试,我们使用一个简单的测试,即以 60hz 的按键重复率按住切换标签页的绑定。
这是一张显示本周工作结果的直方图。红色部分包含了一种改进的分配方法,如下所述。两个不同的集群可以用两个标签页之间的不同内容来解释。我们认为还有一些改进的空间,但我们正在接近目标。

一个很大的已知问题是渲染一帧会执行大量的分配。元素树中的每个元素都需要是一个特征对象,因为我们希望系统是开放且可组合的。例如,Div 元素必须能够包含任何类型的子元素。
在 GPUI 的早期,我尝试使用 bumpalo 来“bump 分配”所有元素。使用 bump 分配,每个新分配的值在内存中都会附加在先前分配的值之后。因为我们总是在末尾分配,所以不可能释放单个元素并重用该内存,但它也简单和快速得多。这非常适合帧渲染,因为一旦渲染了新帧,我们就会丢弃用于渲染前一帧的所有对象并回收内存。
bumpalo 的问题是,每个分配的值都带有一个生命周期,将其绑定到分配它的竞技场中,而这些生命周期给 API 增加了大量的复杂性,所以在 GPUI 1 中,我们决定承担 malloc 的成本,并简单地将我们的特性对象装箱。
在 GPUI 2 中,我们分配了更多的闭包,并且还需要通过 taffy 执行布局,这比我们旧的方法更昂贵,但也更灵活和强大。为了给自己争取更多的余地,我们最终实现了自己的简单 bump 分配竞技场,我们在帧渲染期间通过线程局部变量访问它。我们没有使用生命周期,而是动态地强制执行内存安全,每当竞技场被清除时就使我们的引用失效。
我们做的另一个改变是避免将对象从堆移动到栈。这是由于我为 Element::paint 做出的一个设计决定导致的,它会移动 self。当时,这似乎是一个好主意,有助于匹配每个元素只使用一次的语义。然而,在实践中,语义上可行的方法却很慢,因为移动 self 来绘制元素会导致对象无故从堆复制到栈。将 paint 更改为接受 self 的可变引用,在一定程度上牺牲了人体工程学,但加快了速度。
下周我们还有一些想法要探索。我们的目标是,在 M1 上,最复杂的全窗口重绘时间控制在 4 毫秒或更短。然后,我们打算使用缓存来避免对未更改的视图执行布局和绘制,这应该能为编辑提供更多的余地。我和 Antonio 将在下周再次报告我们在实现这一目标方面的进展。
马歇尔
本次更新是来自 Zed2 的现场直播(好吧,书面文字能有多“直播”就多“直播”了)!
我这周大部分时间都在打磨 Zed2 的各种细节。其中大部分是调整 UI 样式,但在此过程中也修复了一些bug。
本周后半段,我再次拜访了我们的老朋友 theme_importer,以提高导入的 VS Code 主题的质量。这是一项有点棘手的任务,因为每个 VS Code 主题在应用其样式的方式上都是独一无二的。最初感觉就像一场打地鼠游戏,导入器中的一个改动修复了一个主题,就不可避免地导致另一个主题出现问题。
花了一些时间后,我对结果非常满意,到目前为止,我们已经能够导入一些不同的主题系列,并且它们在 Zed2 中看起来很棒。
我期待着下周在 Zed2 中试驾这些新主题,因为我将开始在日常编码中认真使用它。
约瑟夫
这周,我第一次有机会学习和使用新的 UI 框架来移植我们的反馈箱。我非常高兴它能让我真正将代码放入 Zed 并快速迭代 UI 更改。我们正在从编辑器选项卡切换到一个带有嵌入式编辑器的模态窗口。移植体验有点挑战,但仍然很有趣。我很高兴看到这个新库如何赋能对 Zed 贡献感兴趣的社区。
茱莉亚 (Julia)
在过去的几天里,我一直在追查与 Antonio 和我对焦点处理程序调用时间所做的更改相关的测试失败。我们的编辑器分屏存在时间问题,即当为焦点更改运行焦点处理程序时,新创建的编辑器窗格尚未渲染。结果,工作区从未知道哪个窗格获得了新焦点,并且命令面板操作将继续影响原始编辑器窗格。
我们改变了焦点处理程序的调用方式,使其在每个帧绘制之后,元素树渲染完毕后被调用,这样我们就能获得关于焦点树结构最新鲜的信息。不幸的是,一些测试假定焦点处理程序会立即调用,这需要修复,还有更多测试在假设可以聚焦而不实际渲染它时出现问题。调试每个测试都需要时间,以及大量的调试打印来捕获焦点循环,但最终分支变为绿色了:)
内特
要做的事情清单还在不断增加,但不知何故,我们正接近一个点,我们几乎能够每天使用 Zed2 来构建 Zed2。

(我的 UI 比例很小,所以如果觉得东西很小,请不要担心。)
这个项目正在朝着终点线迈进,感觉非常令人兴奋——虽然新的应用程序会感觉很棒,但解锁快速迭代应用程序的能力才是真正的胜利!
我们已经能够推出我们和其他人期待已久的一些定制功能。这是一个小视频,展示了其中的一些功能
我的简短更新,但我会继续埋头苦干,继续前进!
Nathan 再度登场
感谢您的耐心等待,因为我们正在继续取得表面上不那么明显的进展。这项工作实际上是为了在明年开源代码库时,为您提供一个漂亮的代码库。放慢我们可见的进展一直很困难,但随着大修接近完成,我越来越相信这项投资将在未来几个月和几年内获得回报。感谢您的阅读!
注意:Zed2 并不意味着新的版本号,它只是我们用来表示使用新 GPUI 框架的 Zed 版本的内部别名。