跳到主要内容

2 篇博文 含有标签「Debugging」

Debugging and troubleshooting

查看所有标签

调试不可见的东西:为什么事件系统需要自己的可观测层

TinyGiants
GES Creator & Unity Games & Tools Developer

QA 提了个 Bug:"玩家捡起钥匙后门没开。"

简单吧?大概是缺了个引用或者条件写错了。你打开工程,捡起钥匙,然后……门开了。在你机器上没问题。于是你问测试员复现步骤,他说"大约 30% 的概率出现,通常在存档/读档之后。"

现在你进入了调试地狱。在钥匙拾取事件、背包更新、任务进度检查、和门的解锁条件之间的链路某处,有东西间歇性地失败。但是哪一环?事件没触发?触发了但监听器没订阅?订阅了但条件评估为 false?条件是对的但门的状态在加载后是过期的?

看不见的事件链:你无法调试看不见的东西

TinyGiants
GES Creator & Unity Games & Tools Developer

玩家死了。死亡音效响了。布娃娃激活了。UI 弹出"你死了"。游戏自动存档。数据分析事件发出去了。重生倒计时开始了。六个不同的系统,全部在响应一个事件:OnPlayerDeath。但我的问题是——这些关系记录在哪?

不在你的代码里。不在项目管理工具里。不在任何图表里。它存在于一个地方:最初配置它的那个人的脑子里。如果那个人半年前离职了,那它哪儿都不存在。

这就是事件驱动架构的脏秘密。我们采用它是因为它解耦了系统。我们庆祝 AudioManager 不需要引用 UIManager 了。但我们从不谈代价:执行流变得不可见了。而不可见的东西,从定义上来说,就是没法可视化调试的。