Proxyos Weekly 026
Laurence-042
- 2 minutes read - 282 wordsTL;DR 概览
本期目标
- 修好剩下的 bug
- 需要有一个机制来等 ANORA 的 IPC 加载后再跑 IPC,否则启动 ANORA 后立刻用 IPC 加载回放会因 ANORA IPC 未加载而被忽略
- 完成第一章测试
- 第六节
- 过渡到第二章
进展速记(Changelog)
本期假设 / 预期
我当时以为世界是怎样的? 这个预期中,哪一条被证伪 / 被削弱 / 被确认?
- 理想情况是预计使用半天修好 BUG,然后半天搞定第一章,接下来的一天主要用于处理第二章的轻聊测试。但是我觉得这个 bug 没那么好修,可能得改一堆东西
- 确实……我寻思还是一步到位比较好,所以我要去重构整个 Godot 和 Python 的交互逻辑,以为未来的 Python http 请求玩法铺路
后来发现还是缺东西……又在补功能
本期确定性变化
哪些东西现在「更确定」或「被明确否定」了? “确认 X 不可行” “删掉 Y 抽象” “意识到 Z 是伪问题”
新增:
- 基于 WebSocket 的 Godot-Python 双向通信
- 添加复制粘贴、撤销等功能
- 添加禁用特定的边,使执行时将其忽略的功能
变更:
- 优化录制/回放系统,使其和用于撤销操作的编辑历史功能使用相同底层逻辑
- 优化边的样式,使其激活/禁用状态下的选中/未选中样式更符合直觉
修复:
- ANORA 录制时执行器状态变化事件没有被正确录制,导致执行时因为缺失数据而卡住
删除:
- Terminal 的 Middleware 相关逻辑
- 之前残留的桌面模式的第一章脚本
主要进展内容/本期关键判断点
我做出了哪些「如果错了也要付代价」的判断?
彻底重构 Godot 和 Python 之间的 IPC
之前基于 stdout 的 IPC 本以为够用了,因为感觉第一章应该用不上双向通信,而需要双向通讯的 rest 接口编程可以直接给 godot 上 server 或者提供独立的基于 python 的 server
但是这次仔细想了想,不如直接重构一步到位
为什么需要重构
就像上期说的那样,存在一个“启动 ANORA 后立刻用 IPC 加载回放会因 ANORA IPC 未加载而被忽略”的 bug。而这个 bug 的根因就是 python 不知道 ANORA 的 IPC 什么时候就绪。
怎么重构
为了解决这个 bug,有两大类方案
- 给 Godot 和 Python 弄个双向 IPC,而双向 IPC 可以基于以下子方案
方案 复杂度 数据量 适用场景 stdin 极低 中 简单的文本指令,快速原型 命名管道 中 大 大量流式数据,低延迟 Socket 高 极大 复杂交互,异步并发架构 信号 低 极小 仅状态触发(开关、退出) HTTP 高 大 单向请求,延迟不敏感但异步敏感 - Godot 先行加载 ANORA 并将其 invisible
说实话,我一般改代码都挺激进的,有了 copilot+claude 后更是重构重度依赖,所以第二类治标不治本的方案自然是直接 pass。
但看了看第一类,感觉不如直接就借此机会把之后章节需要的 rest 接口编程的基础设施搞定,所以我第一时间想要不要干脆引入完整 HTTP。
但是进行了技术调研后发现,Godot 并不自带 http 支持,而且即使支持,我也得在 python 里整一套 proxy://到 http://的转换模块。
于是我决定干脆用 Socket,简单、跨平台、可以完全控制消息结构与映射关系,而且没有复杂的解析性能也会更好。
重构发生了什么问题
最大的问题是 Python 侧的各种 utils 都得 async 了,但实际上确实应该 async,毕竟是网络活动。
在游戏世界观设定上,玩家也是得用网络连 ProxyOS 的 Utils 的,代码和叙事一致。
不过为了避免玩家学习曲线出问题,第二章没有任何 async 和 proxyos 相关内容,我准备第三章一起教/
其次的问题就是 python 的 WebSocket 库的await conn.send(...)里面的逻辑根本不是 async 的,本质上是同步地将其存入缓冲区,由事件循环将缓冲区里的提交给 OS。而我一开始不知道这个情况,claude 也没意识到,于是我们把它当正经 await 看了,并在其后面使用同步逻辑的 input。这导致实际上 Python 的 WebSocket 经常因为事件循环全在conn.send但没有机会将其放入缓冲区的数据提交给 OS,最终导致“看起来消息发出去了,但是 Godot 收不到”的诡异 bug
至于重构后的功能一致性,这反而没有出任何毛病,这年头如果谁还在 demo 模式开发时不用 claude 重构,反而自己吭哧吭哧迁移,那纯属给自己找不自在。
添加撤销功能并重构录制/回放功能
这个没啥好说的,第六节的图实际上应该支持增删节点的回放,并支持激活/禁用边,但之前把这功能给忘了……
所以就开始还债了
瓶颈与问题清单
哪些问题还没解,但也许我已经知道“它们不是什么”?
忘实现功能这事确实不应该……
硬要说的话我也不是不能找到理由,比如我的 2+1+3+1 工作节奏(每周两期,每期有 1 天休息)让我搞混了一些上下文,导致遗忘功能。又比如禁用边的功能确实不是 ANORA 预期要提供的,预期录制过程中也不该瞎动节点位置甚至增删节点,但是在实现 ProxyOS 的过程中才发现需要这些功能,而且没反应过来这些功能不在 ANORA 的预期提供功能里
但我觉得这事还是得解决
但我还真不确定该如何解决
其实也许这些功能也该作为 ANORA 的一个 mod 提供?但这玩意还真不适合当 mod,毕竟影响核心执行逻辑了,而且也确实该有
但可以肯定的是,如果我说“下次注意”那我肯定不会注意
但我想我在单个项目(即纯 ProxyOS 内部,不包含 ANORA)里,我可以反向应用“让不同模块的测试人员拿着用户指南去操作功能来确认指南有没有问题”的这个测试方法,只是在这里我不是验证文档,而是验证实现。我可以在一些关键阶段(Story 完成编写、功能初步实现并经过了基本功能验证、内容填充完成)准备一份预期的用户操作流程,然后让 claude 大致过一遍看看有没有实现上不满足的,确认没问题后我再手工测试一波
下期计划(Next)
- 完成第一章测试
- 第六节
- 过渡到第二章
试玩版
预计第一个可玩版本将在第二章的第一个涉及外部编程的游戏内容完成后推出