游戏架构/设计问题-在避免全局实例的同时构建高效的引擎(C ++游戏)
我对游戏体系结构有一个疑问:使不同组件相互通信的最佳方法是什么? 如果这个问题已经被问了一百万遍,我真的很抱歉,但是我找不到任何与我正在寻找的信息完全相同的信息。 我一直在尝试从头开始构建游戏(如果需要的话,请使用C ++),并观察了一些开源游戏软件的灵感(超级玛丽纪事报,OpenTTD等)。我注意到许多此类游戏设计在整个地方使用全局实例和/或单例(用于渲染队列,实体管理器,视频管理器等)。我试图避免使用全局实例和单例,并构建一个尽可能松散耦合的引擎,但是由于我对有效设计的缺乏经验,我遇到了一些障碍。(此项目的部分动机是解决这个问题:) 我已经建立了一个设计,其中有一个主要GameCore对象,该对象的成员类似于我在其他项目中看到的全局实例(即,它具有一个输入管理器,一个视频管理器,一个GameStage控制所有实体和游戏玩法的对象)对于当前加载的任何阶段等)。问题在于,由于一切都集中在GameCore对象中,所以我没有一种简单的方法来使不同的组件相互通信。 例如,以《超级玛丽纪事》为例,每当游戏的某个组件需要与另一个组件进行通信时(即,一个敌对对象想要将其自身添加到要在渲染阶段绘制的渲染队列中),它只会与全局实例。 对我来说,我必须让我的游戏对象将相关信息传递回该GameCore对象,以便该GameCore对象可以将该信息传递给需要它的系统的其他组件(即:对于上述情况,每个敌人对象会将其渲染信息传递回GameStage对象,对象将收集所有信息并将其传递回GameCore,然后依次将其传递给视频管理器进行渲染)。这确实感觉像是一个非常可怕的设计,而我正试图考虑一个解决方案。我对可能的设计的想法: 全局实例(Super Maryo Chronicles设计,OpenTTD等) 让GameCore对象充当中间对象,所有对象都通过该中间人进行通信(上述当前设计) 为组件提供指向它们将要与之交谈的所有其他组件的指针(即,在上面的Maryo示例中,敌人类将具有一个与之交谈的视频对象的指针) 将游戏分为子系统-例如,在对象中具有管理器对象,以GameCore处理子系统中对象之间的通信 (其他选项?...。) 我以为上面的选项4是最好的解决方案,但是我在设计它时遇到了一些麻烦……也许是因为我一直在考虑使用全局变量的设计。感觉就像我正在处理当前设计中存在的相同问题,并在每个子系统中以较小的比例复制它。例如,GameStage上面描述的对象为此在某种程度上做了尝试,但是该GameCore对象仍然参与该过程。 有人可以在这里提供任何设计建议吗? 谢谢!