时序竞争导致看不到投喂食材

昨天 21:26综合
现在我看到问题了。BeatSystem.StartBeat 中的 else 分支在 injectedFoods 为空时仍然会调用 generateWaveComposition 生成随机敌人。这就是 Beat 1 出现黄色圆形的原因——食物还没从云队列消费回来,Beat 1 就已经开始了。
让我确认一下 Beat 1 启动和食物注入的时序关系。
Bot Avatar
我看到了时序问题:ConsumeAndInjectFoods 通过 FoodPipeline.ConsumeFromOrgan 异步拉取云队列数据,回调在网络返回后执行。但 BeatSystem.Reset() 之后第一个 Beat 可能在回调之前就已经开始了。
让我看看 Beat 是什么时候启动的。
找到根本原因了。时序问题:
InitGameAfterMapLoad() 同步调用 BeatSystem.StartBeat() (line 528)
ConsumeAndInjectFoods() 在之后调用,且是异步的(云队列回调)
Beat 1 启动时 injectedFoods 为空 → else 分支生成随机敌人(黄色圆形)
这个随机敌人在 Beat 2 期间仍然存活(敌人不会在节拍之间被清除)
修复方案:移除 else 分支的随机敌人生成,无投喂食物时 composition 为空。
构建成功。问题原因和修复总结:
根因:时序竞争。InitGameAfterMapLoad() 同步调用 BeatSystem.StartBeat() 启动 Beat 1,但 ConsumeAndInjectFoods() 是异步的(从云队列拉取数据),回调在 Beat 1 之后才返回。Beat 1 启动时 injectedFoods 为空,走进了 else 分支调用 generateWaveComposition() 生成了随机敌人(黄色圆形/椭圆形)。这些随机敌人不会在节拍之间被清除,所以它们一直存在到 Beat 2 甚至更久。
修复:BeatSystem.StartBeat 的 else 分支不再生成随机敌人,改为空节拍。Beat 1 会快速空转过去,等食物在回调中注入后,Beat 2 开始时就只有投喂的食材了。