我正在使用DirectX 11和C ++(使用默认的Visual Studio模板)开发游戏引擎,但是我有一些无法在线找到答案的问题。
因此,游戏包含三个主要组件:实际游戏类,渲染器和逻辑类。游戏类看起来像这样
class Game {
Game();
~Game();
Logic* m_Logic;
Renderer* m_Renderer
}
(如果您很好奇,我这样做的原因有两个:1.玩类,之前我已经按照常规方式进行过学习,所以我想尝试一下其他方法,看看它是否有真正的好处。2.因此两者的代码完全相互抽象)
我的问题是使两个子类成为单例(考虑到游戏类)是否是个坏主意。我知道何时以及为什么会使用它们,但是考虑到游戏类中将永远只有一个实例,这样行得通吗?如果游戏类别不是单例,而是可以同时运行多个副本,该怎么办(因此出于好奇而允许同时运行多个游戏)
注意:由于每个人都在不断指出这一点。我知道这不是一个好主意。这是一项测试/实验。我的编程很有趣。让我玩得开心:P
示例:一个示例,说明当游戏类可以具有多个实例时,为什么我希望渲染器为单例。由于渲染器在游戏的不同实例之间将是相同的,因此不需要多个实例。可以将其视为所有函数的容器,这些函数只接受存储在游戏类中的各种变量,并对其进行处理以输出到屏幕。逻辑类也是如此。
有人会说“单打独斗绝不是一个好主意”,但是直到今天,许多流行游戏引擎背后的工程师仍未发表这种说法。我会建议您尽可能地减少它们的使用,但是在某些情况下它们非常适合。实际上,“淘气狗”的杰森·格雷戈里(Jason Gregory)撰写的“游戏引擎体系结构”(Game Engine Architecture)完整介绍了它们的用途。我将举一个例子,我将其视为一种混合方法。
如果您通读了虚幻引擎的代码库(或至少使用了该引擎),则会发现以下内容:
extern class UEngine * GEngine
UEngine实际上是所有Engine实现的基类(并且有多个,因为需要不同的变体)。在启动过程中,启动器确定需要加载哪个变体,然后继续构建a single instance
整个系统将要使用的变体。这类似于您的方法,但是您可以对初始化在设置期间设置一次的Game对象进行全局引用,而不是创建多个Singleton:
extern std::unique_ptr<Game> game; // Global game reference in some .h file
(in .cpp)
std::unique_ptr<Game> game;
int main(int numArgs, char ** args) {
game = std::make_unique<Game>( ... ); // Initialize game exactly once!!
...
}
这种方法使您可以做一些有趣的事情,特别是当您使Game成为虚幻引擎背后的工程师决定要做的界面,然后根据其背后的需求进行多种实现时。
游戏维护的每个对象都应该是一个单例吗?我不会这样认为,因为它实际上限制了您以后可以做什么。游戏至少需要支持以下内容:
我认为这比使所有核心类都单例更好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句