每隔几个月,他就会装一个新的应用启动器,说服自己"这次就是它了",然后大约一周后卸载——要么是某个小细节让他不爽,要么是它做不到他想做的事。这个循环重复了十几次之后,他放弃了继续寻找,决定自己写一个。
这个项目叫Zenkai,可以在 zenkai-launcher.netlify.app 上拿到,源码放在 GitHub。剩下的故事,是关于它为什么被造成现在这个样子。
![]()
名字来自童年,目标来自执念
他坦言自己一直不擅长给东西起名,这个项目也不例外。纠结了"尴尬地长"的一段时间后,他定下了 Zenkai 这个名字,来源是童年痴迷的《龙珠》。Zenkai 是赛亚人在经历一场苦战后获得的巨大力量提升——在他看来这名字再合适不过,因为这正是他对这个项目的设想:每一次迭代之后都更强、更快、性能更好。
他想一头扎进性能优化的兔子洞里,花几个小时只为了砍掉大约 20 毫秒。他想把这当成一个业余爱好来做。
跨平台也是他想要的。他用 Linux,作为一个"优秀的 Arch Linux 用户",他必须有一个可定制、性能好的启动器。工作他用 macOS,原生启动器虽然很棒,但他希望两个系统上有同样的体验。Windows 他承认只是偶尔不得不用,所以如果说它是高优先级那是在撒谎。而且给 Windows 做启动器相当有挑战性——这一点他留到后面再说。
最终,三个系统他都跑通了,并且完整支持。
快和好看,他两个都要
他还想要它又快又好看,因为他想每天都用它,并且享受使用它的过程。他想要的体验是:按下一个热键,敲两个字母,想要的东西已经被高亮选中,回车,启动器在他意识到它出现过之前就已经消失了。
这就是全部的想法,于是他开始动手。第一个要做的决定是语言和 GUI 框架,他选了Zig 和 Qt6。
Zig 他已经用了一段时间。他喜欢这门语言,喜欢那种可以手动扩展到复杂度的简洁。Zig 感觉像 C,看起来像 C,但有合理的内存管理工具,又不会因为没处理掉世上每一个潜在内存问题就闹脾气的编译器。它信任你是个手艺人,信任你知道自己在做什么。它不挡你的路,而且他可以信任它足够快、足够高效——就像有人递给你一个分类整齐的专业工具箱。
Qt 不是出于理念选的,而是因为他以前用过。他在工作中专业地交付过 Qt 应用,喜欢它的控件集,喜欢它能做得真正漂亮,而不是所有东西最后都变成那种灰扑扑的商务工具模样,而且它跨平台。Zig 则是因为他喜欢、契合他的思维方式:手动内存配合理默认值,还有一个真能帮上忙的标准库。整个战略决策就是这样,并不特别聪明——他挑了两样自己已经喜欢的东西,然后指望剩下的自己理顺。
140 毫秒里,他写的只占 20 毫秒
他对性能的痴迷由来已久。通常这种痴迷没有空间,因为你做的东西属于别人,或者有人正眼巴巴等着,有截止日期,花一周把启动路径砍掉 40 毫秒会让你变成一个难合作的人。但 Zenkai 是他自己的,而且他把它当爱好,而不是一个明确要赚钱的目标或产品。这意味着没人在等它,他花三天让某个东西快 15 毫秒,什么也不会坏。很久以来第一次,他可以正当地放纵自己的性能执念,这让他感到解放。
他给出的实测数据是:
- 带插件、解析并渲染 100-200 个应用和图标的情况下,窗口完全可见耗时140ms
- 不带插件、加上 no-icons 标志时,到完全可交互只要20-70ms
他认为,人类感知上 200 毫秒以下就算瞬时,而 Zenkai 在他机器上做到了 140 毫秒。更让他意外的是,这点启动时间里属于他的部分少得可怜——拆解之后,他实际写的代码只占 140 毫秒里的14.75ms-20ms,其余都是 Qt 在构建控件、合成器在往屏幕上放像素。
他说这只是一个很简短的说明,之后会单独写一篇更详细的性能拆解,因为光这一件事就值得用更长篇幅解释他是怎么做到的、用了哪些技巧。但眼下,只要知道它很快,而且它快是因为他想让它快。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.