【发布时间】:2018-06-19 04:28:24
【问题描述】:
我正在使用 DirectX 11 和 C++(使用默认 Visual Studio 模板)开发游戏引擎,我有一些问题无法在线找到答案。
所以游戏有三个主要组件,实际游戏类、渲染器和逻辑类。游戏类应该是这样的
class Game {
Game();
~Game();
Logic* m_Logic;
Renderer* m_Renderer
}
(如果你很好奇,我这样做有两个原因,1. 玩类,我以前用传统的方法做过,所以我想尝试一下其他方法,看看它是否有任何真正的好处。 2.使两者的代码完全相互抽象)
我的问题是,将两个子类变成单例(假设游戏类是)是否是一个坏主意。我理解人们何时以及为什么会使用它们,但考虑到游戏类中只会有一个实例,这可以正常工作吗?如果游戏类不是单例,而是可以同时运行多个副本(因此允许同时运行多个游戏,再次出于好奇)
注意:因为每个人都一直在指出这一点。我知道他们不是一个好主意。这是一个测试/实验。我正在享受有趣的编程。让我玩得开心:P
示例:当游戏类可以有多个实例时,我可能希望渲染器成为单例的一个示例。由于游戏的不同实例之间的渲染器是相同的,因此不需要有多个实例。把它想象成一个包含所有函数的容器,它只接受存储在游戏类中的各种变量,并对它进行处理以输出到屏幕。逻辑类也是如此。
【问题讨论】:
-
单身从来都不是一个好主意。
-
在游戏类的情况下,由于我(通常)一次只希望运行一个,因此将其作为单例运行是有意义的。无论哪种方式,就像我解释的那样,这都是一个实验。如果我想制作游戏,我宁愿只使用 Unreal 或 Unity,我很喜欢几年前制作引擎并且想再做一次,但更好/不同
-
你为什么使用指针?
-
我再说一遍,单身从来都不是一个好主意。单例只是伪装的全局变量,你用来欺骗自己认为你没有使用全局变量。至于为什么它们是个坏主意,全局变量是 Minecraft 在 Beta 1.6 之前无法在服务器上拥有下界的原因。到处都在使用
MinecraftServer.get().theWorld,必须更新才能在多个世界中正常工作。 -
我也会重复一遍。我正在试验和玩弄一切。我不在乎这是否是“一个坏主意”,我想尝试一下,看看会发生什么,然后从中学习。如果您了解范围并努力解决,就很容易避免概述的那种问题。我知道一个游戏永远只有一个渲染器,所以我只需要一个,而且只有一个。 @Sid S 因为我不希望堆栈中的整个类,我更希望游戏类指向实际类(将自身作为参考)。我是如何学到东西的