慢迭代:我和 AI 打磨 Orbit Courier 的故事

AI 教会了我一个没想到会喜欢上的词:慢迭代。
我的工作生涯,大部分时间都朝着另一个方向走。Scrum、Sprint、交付、下一轮改进,总有理由再快一点。可在和 AI 做一个小游戏的时候,我却开始考虑另一种节奏:因为喜欢,就把它慢慢做下去。今天调一束灯,改天添一座桥,看着自己的小世界一点点完整起来。
10 月 7 日,我把这种感觉写成了一篇手记。当时想到的比喻是写小说:隔几天回来,添一点,改一点,看着那个世界逐渐成形。
接着,是那些图片。
一辆陶瓷小车停在浮岛上,木桥朝着另一座平台延伸,一小段玻璃接住晨光。金属是温暖的,岩石有分量,整个世界像是悬在一个安静的清晨里。
我突然很想开着这辆车,走进这张图。
如果借助 AI,慢慢把一个小游戏打磨成自己心目中的精品,会是什么样?这个念头,让 Orbit Courier 有了下一步。如今,Morning Crossing 已经是它正式开放的第一条路线。而走到这里,经历了很多次看图、选择、再说一句“Go”,也经历了后来才认真面对的问题:漂亮的世界,还得让人玩得进去。
封面是《慢迭代》手记当时的原始配图。它表达了让我想继续做下去的那个世界;下面也会放出真实游戏画面。
慢迭代:和 AI 打磨 Orbit Courier 的故事(英文旁白)
一张图,让我想继续做下去
那时,我们已经有了一个可以接着做的游戏。九月底的一次博客项目里,Dot 做出了早期的 Orbit Courier:小车、浮岛、旋转障碍,以及收集三颗能量核心后返回珊瑚色火箭的任务。Dot 交付可下载的项目,Codex 在本地检查、录下自动演示。我在之前的 OpenAI Dot:让它变得可以玩 中写过这个阶段。
我喜欢那辆小车,也喜欢它的材质。“慢迭代”让我开始想,可以怎样把它继续做下去。图片则把这个可能性变得特别具体。
我们围绕陶瓷、珊瑚色、香槟金、岩石、木头和玻璃,发展出一个晨光里的世界。我选了两张桥梁图片作为游戏的视觉参考。以后每做一轮,都能回来看:实现也许已经完成,但画面离想要的感觉,还有多远?

我们用来确定视觉方向的一张晨光概念图。这是插画,并非游戏截图。
我想要的东西其实挺具体。小车要像一件能拿在手里的小物件,有一点亲切感。金属要接得住晨光,又不要变成一大片平涂的黄。浮岛要像这个世界的一部分,底下是岩石,上面是一条可以走的路。桥要让人想过去,又要留出足够的空隙,让“跨过去”这件事有点分量。
插画可以把这些感觉放进一个静止的画面。浏览器里的场景,却还得经得住不同角度、车辆移动和桥面变化。
10 月 7 日,我们给游戏建了独立的工作目录,保留原始源码包。它成了一件我想认真继续的事。没有必须赶上的期限,也不用下一步就铺开一整套关卡。一条路线,已经足够让我们花心思。
一句 Go,就再往前做一轮
后来,节奏逐渐熟悉起来:看这一轮的结果,决定下一步在意什么,然后让 AI 继续。
Go。
沿着这个方向,再改一轮,带回来一个我能检查的结果。
这些工作陆续跑了几十个小时。有时在改浮岛的形状,有时在调材质、反射,或桥后面的云。只看那一小段路线,很难想象它已经被反复打磨了这么多遍。

10 月 7 日的真实游戏画面。路线已经有了,岛体、材质和空气感还需要继续打磨。
早期场景很清楚地显示出它与图片的距离。主要物体都有了,但岩石折面很尖,表面比较简单。原料都在,还得让它们真正属于同一个世界。
我们改悬垂的岛体、香槟金边缘的厚度、陶瓷表面、木板切口和玻璃。光线要让小车确实坐在平台上,而不是悬在自己的倒影上。云要有纵深,又不能把场景吞掉。过程中也用到了现成的图形库和有授权的素材,并保留来源与署名。
有些变化,马上就能感觉到。有些则是一大段技术说明,换来画面上很小的一点区别。所以,保存真实截图很重要。我可以把新画面放到参考图旁边,判断我们有没有更接近那个想要的世界。

10 月 8 日的游戏。两张开发画面的视角不同,用来观察变化,并非严格控制条件的图像比较。
过程中也有放弃和回退。一个方案做完了,不代表一定要留下。下一句 Go,可能是继续一个有希望的变化,也可能是退回上一版,再找一个更值得做的方向。
这就是我在手记里想象过的那种过程。一个兴趣,可以持续得到照顾。我可以在意一块岩石像不像真的、一束光是不是安静、小车从这个角度看是不是更好,然后再回来看看结果。图片一直摆在那里,指明想去的方向,也提醒我们实际画面还没有完全走到那里。
这个世界,还得跑得起来
画面打磨到一定程度,另一个问题就很难忽略了。
在一个较早的 Preview 里,我等一两分钟才进入场景,看到大约 17 FPS,游戏在窗口里还显得偏小。我喜欢这个世界,但进入它、在里面移动的体验,仍然需要改善。
云、反射和柔和阴影,都是气氛的一部分,也给浏览器带来了不少工作。画面看起来很安静,电脑却可能忙得很。
其实到了 10 月 9 日,我就已经决定先放下进一步的美术调整,把性能作为重点。这个阶段有有效的改进,也有绕路。有一次阴影缓存实验,因为我反馈机器严重卡顿、连 Codex 都受到影响而被撤回。我们没有确定那次问题唯一的硬件原因,先恢复之前的版本,处理游戏怎样使用资源。
其中一个特别实际的改变,是暂停。原来模拟停了,渲染器却可能还在继续画。小车不动,电脑没有跟着休息。加入渲染休眠后,停止的场景可以保留最后一帧,只在需要时重画。离开标签页,游戏也应该休息。
性能验证开始更在意短时检查、资源归属和清理。有的想法通过了真实浏览器中的比较,有的到了后面的检查就被放弃。通过路线、掉落、恢复、重试,都用有限时间的自动操作来验证。一个看起来有希望的数字,还得经得住其他检查。
后来,我也允许在更轻的可玩版本里,适度减少云、背景和光影细节。这是对发布体验作出的选择:场景的气质值得保留,玩家也得能进去、能移动。
这一阶段的数据,不能拼成一张干净的优化前后对比图。不同窗口、启动状态和测试路径,测到的含义并不一样。更有用的变化,是我们的注意力转向了真正打开它的人。
小车的操作,也要对劲
有了具体的可玩版本,接下来的要求反而更容易说清楚。
A、D 转动车头;W 朝车头方向走;S 倒车。我希望车身的朝向是有意义的,而观察四周是一件独立的事。
游戏也应该铺满窗口。显示可以跟着窗口展开,底层实际绘制的像素尺寸仍然有上限,不必因为屏幕变大,就自动增加渲染负担。

本地检查时的真实游戏。可见的 Start 按钮和一秒保护提示属于诊断界面;后来的普通界面直接响应新的驾驶按键。
界面变得安静了一点。场景准备好,关闭首次指引后,按下一个新的驾驶按键,就能开始。拖动鼠标或使用方向键观察,按 C 重置视角。空闲和切到后台时,游戏仍然休眠。
这个阶段的满足感和之前不太一样。我们已经花了很多时间看这辆小车。现在,选择开始围绕怎样接过它的控制:认清车头,看清路线,过去,没走好就掉下去,再试一次。
进入游戏前的呈现也整理了。加载页用品牌图片,进度跟着实际准备状态走。等得较久时,有一个安静的恢复选项。操作指引放在游戏里,由浏览器记住是否关闭过,也可以从菜单重新打开。
这些呈现改进,不等于底层加载已经更快。它们让等待和接下来该做什么更容易理解。一个新玩家,不应该先了解整个开发过程,才知道怎样开始。
名字、行星,还有一扇正式的门
Morning Crossing 逐渐成形后,我希望它的身份能表达:这是一款我想继续做的游戏。
“跨越”成了贯穿它的线索。第一条路线只是开始,以后每一次跨越,我希望都有不同的地方、逐渐增加的挑战。这个世界的温暖,以及路线的清晰,应该能一直认得出来。
品牌图片帮助我把这种想法表达出来。我接受了六张小车和世界的图片,选第一张小车图作为主图。

正式选定的产品主图。它表达游戏的气质,并非实机画面,也不代表额外关卡已经完成。
Logo 也有自己的迭代。我喜欢轨道的概念,希望它带着游戏里的材质:行星、环和卫星,用陶瓷、香槟金和珊瑚色做出立体感。最后选中了第三款材质方案 Floating World Planet。名字旁边,也有了一个属于它的小世界。
然后是正式官网。我选了 Night Beacon 的方向,用深蓝围住温暖的场景,配珊瑚色按钮。我们把它做成铺满首屏的主视觉、Morning Crossing 的介绍、表达更大世界的图片,以及页面底部再一次开始游戏的邀请。

真实的已发布网站。世界插画负责气氛,文字、导航和按钮是真正的网页元素。游戏在独立的玩家页面加载。
之前的博客案例已经做过本地网站。这一次,是给我准备正式发布的独立游戏做入口。页脚写着我的名字 Aaron Guo。
这扇门后面,也有实际的收尾:检查打包范围,修复过期测试,让构建可以复现,连接私有仓库,核对公开域名提供的确实是已提交的 main 版本。游戏终于到了别人也能打开的地方。
第一次跨越,是一个开始
10 月 17 日首次发布时,Morning Crossing 是第一条可玩路线。下方的 10 月 18 日更新,把它扩展成了三关。在桌面 Chrome 里用键盘体验,不需要账号。
写那篇手记时,我想象自己像写小说一样,时不时回到这个小世界。后来,这个比喻变得具体了:有一辆小车、一座桥、一个想去的地方,也有一连串决定,塑造了它今天的样子和操作。
我喜欢 AI 给这种项目留出的空间。我可以在意一块材质的光泽、一座小岛的形状,把喜欢的图片摆在旁边,再说一句 Go,回来看看哪里变了。遇到新问题,也可以继续守着同一个游戏,把它往前做。
正式上线,是我和这个世界之间又向前的一步。当初想走进那张图,现在已经有了第一次可以尝试的跨越,也有了回来翻开下一页的理由。
体验 Morning Crossing · 看看我的 Builds
10 月 18 日更新:三次跨越,继续往上走
第一条路线现在接上了一段小旅程。完成 Morning Crossing,会解锁 Sundial Crossing;再完成第二关,才能进入 Skywheel Ascent。可以在 Crossings 菜单里重玩已解锁的路线,进度保存在当前浏览器里,不需要账号。
01 · Morning Crossing
原来的晨光路线仍然是起点:浮岛、木板和变化的玻璃桥。在这里熟悉小车的转向、跳跃,以及等待合适时机的感觉。

02 · Sundial Crossing
第二关增加了摆动幅度更大的桥、旋转的铜色扫杆,以及两块独立变化的桥板。中间的落脚点和检查点,让下一次起跳前有机会重新调整。

03 · Skywheel Ascent
第三关开始向高处走。摩天轮带着保持水平的平台升降,小车可以跳上去,随着它到达上层落脚点,再跨过空中的阶梯,抵达更高的信标。

这三张是本地浏览器中暂停后的真实游戏截图,裁去了诊断界面。前文的概念插画仍然是视觉参考。各截图的相机取景不同。
游戏也加入了温暖、轻盈的环境音乐,以及跟着驾驶、跳跃、落地和道路变化触发的声音。挑战在增加,我仍然希望这个世界的气氛是安静的。
还有一些小瑕疵。试玩时,有些跳跃看起来已经落稳,小车却掉了下去。让视觉上的表面和小车的碰撞支撑更一致,是接下来要调研的问题。这次发布也不代表已经验证了广泛设备兼容性,或普通电脑上的持续性能。
