你好,我有一个问题我想在GameDev作为一种爱好开始,并且我不是专业人士,如果我的问题很愚蠢,希望各位包涵。作为一名工程师,我正在进行这个项目的专业发展,因为我的目标不是发布任何东西,所以我不会采用“好 enough”的态度。我正在使用Godot,但我会尝试为可读性添加Unity的等价物。

我当前有一个AppStateMachine,它从BootState开始,我希望等待所有必需的Singleton加载完毕后再继续。但是,为了解决这个问题我遇到一个Race Condition问题。

  • 在每个Singleton的 Ready() / Start() 方法结尾,他们都会更新一个IsReady Boolean并触发一个IsReady事件。
  • BootState 的 Enter() 方法会检查每个Singleton的 IsReady bool,如果为真,它会更新自己的私有bool或者连接到那个Singleton的事件。当BootState接收到这个事件时,它会触发一个私有函数,更新它自己的私有bool并调用一个私有 IsAllReady()函数。IsAllReady()函数会检查每个内部私有bool,如果所有私有bool都为真,它会调用TransitionToNextState()函数。

我看到这个实现的问题是它以BootState和每个Singleton偶合为耦合。唯一的替代方案我能想出来的是一种polling函数:

  • 每个Singleton会更新IsReady Boolean如前所述,但然后会调用一个IsReady私有函数。这函数会检查IsReady Boolean,如果为真会触发一个IsReady事件。
  • BootState会在 Ready() / Start() 的结尾触发一个IsReady事件它也会有一个SingletonReadyEvent私有函数,里面有一个switch语句以便将事件的串匹配来更新一个对应的私有bool,然后调用IsAllReady()函数如前所述。
  • Singletons和BootState都会连接到一个EventBus,只是为了传递事件,之后EventBus会将信号传递给Singletons和BootState并关闭信号。

我看到这个解决方案会增加复杂度,增加了缓存泄漏或错误的风险,因为它只是为了解决一个无害特性而增加了额外的代码,而且它甚至增加了EventBus的复杂度和bug。这让我不知道EventBus是如何实现的所以可能我理解错了EventBus是如何使用的。

那么为了解决这个问题,什么方法是最好的实践呢?