Outland 开发日志 ①:队列收口的一周
这是开发日志第一篇,按周记流水。之前发的那批技术笔记(时间系统、测试门禁、物品实例、存档持久化)是从坑里提炼的,这篇反过来——不按坑讲,按天讲,这一周实际发生了什么。
先交代背景:10 月初的时候,项目里有一支”选中实例”的长队列没清完——物品从堆栈升级成实例(见那篇《两把相同的枪》)之后,每个操作动词都要逐个改到”操作选中的那个”。这一周就是清完这支队列、然后开始下一件事的一周。
10-08:持久化周
这一天的提交密度是整周最高的一档,而且几乎全是 fix: persist…:
- 代谢小数余量进了存档(六个池子的 float 余数,空胃不再预支消化量)
- 世界疾病池跨存读档保留
- 可变代谢状态持久化
- 体征池按经过的回合数恢复,分数部分持久化
- 世界机制结算改成按”活跃世界时间”走,不再按墙钟
战斗侧修了一条躲闪:碰撞判定钉在玩家所在地板层。
UI 侧开始动”选中实例”的队列:wield(手持)选中实例的 preflight 通过,wear 候选验证完。
这一天的特点是”把欠的债集中还”——存档那篇技术笔记里讲的余数问题,大部分就是这几天补进格式的。
10-09:身份与界面
- 铁变异状态(iron mutation)持久化并加了读档校验
- cultivation identity(修行身份)和心魔状态持久化
- 力量系统页面暴露了 demon refinement(炼魔)入口
战斗这边,combat launcher 和队列审计的阻塞项过了 review。这一天是”状态类”的收尾:凡是”玩家身上挂着、存读档后不能丢”的东西,这周基本都过了一遍。
10-10:队列开始加速
- wield、wear 两个动词的选中实例正式落地(
fix: wield the selected complete inventory instance/fix: wear the selected inventory item instance) - 物品菜单的动作行修到标题栏以下(之前菜单动作被标题栏压住)
- D2c 的 native 控制矩阵和 SDL 正式门禁验证完
从这天起,队列进入了”一天一个动词”的节奏。
10-11:截图修复
- charshot(角色截图)历史修复:读角色捕获要发生在呈现帧之前(
fix(render): read character capture before presenting frame) - D4 观测证据记录在案
这条看起来小,但它卡了几天——截图功能是全自动化试玩链路的眼睛,它不修好,后面的验收截图全是错的。
10-12:队列过半
- drop(丢弃) 选中实例
- 容器清空(drain) 选中实例
- FOV 归一化:chunk 加载后重建 FOV,归一化瞬时可见性
容器那条要单独说一句:容器是实例身份最刁钻的场景,因为”存进容器的东西”和”容器本身”都有状态,而且可以嵌套。修完之后,两把完全相同的装配枪存进同一个货舱,能保持两个 count 1 的独立个体,不再合并成 count 2。
10-13:队列清完,快照开工
这一天队列全部收口:
- eat:吃掉的必须是选中的那个完整可食堆栈(新门禁
verify_e3_eat_selected_instance.py) - use:使用的必须是选中的那个完整实例(
verify_e3_use_selected_instance.py) - special:消耗选中的完整特殊物品实例
- skillbook:读取选中的完整技能书实例
wield / wear / drop / drain / eat / use / special / skillbook,八个动词,一支队列清完。
下午开始下一件事:把世界快照的捕获和恢复抽成独立函数。这条重构线当天就推进了两层——世界实体快照、NPC 快照,各自抽完、各自过门禁。
10-14(今天):快照线继续
- 车辆(vehicle)快照捕获/恢复抽出
- 尸体(corpse)快照抽出并发布
- 下一站:陷阱(trap)快照
这一周学到了什么
- “队列”是对付长尾的正确形态。 选中实例这件事如果当成一个大重构来做,早该两周前就完了(或者一直没完)。拆成八个动词、每个动词一个门禁、绿一个结一个,它反而在八天内清完了——因为每个单元小到”不会改错”。
- 截图是自动化测试的眼睛。 charshot 那两天卡住的真正成本不是修它本身,是后面所有依赖截图的验收都在用错的眼睛看世界。
- 重构线要接在收口线后面。 队列没清完就动快照抽取,等于在流动的地基上搬砖。先收口、再抽取,这一周的提交顺序里能明显看到这个节奏。
下一篇日志预计写快照抽取的收尾和陷阱/世界机制那一档。技术笔记那边,下一篇是 UI 重做(多 agent 那篇结尾预告的)。