c++ - 在 C++ 游戏中使用单例资源管理器

标签 c++ oop singleton sfml

我已经和我的公司一起开发游戏好几年了。然而,最近我们一直在改进我们游戏基本系统,以使 future 的添加更容易。我们所做的一项更改是添加资源管理器,而不是手动加载屏幕类中的信息,这些信息本质上是游戏状态。我们决定将其实现为单例。然而,我知道在编程社区中使用单例的争议。 我将在下面举例说明我们如何使用我们的字体管理器。我想知道在这种情况下是否可以接受单例,或者您是否会推荐其他方法。

mTextToBeDrawn.setFont(FontManager::GetInstance()->GetFont("Default"));

我愿意接受所有建议,我将解释当前的OOP 设计,以便更深入地了解系统。每个管理器都从一个名为管理器的基类扩展而来,具有通用的添加和删除方法。然后在派生类中实现添加和删除方法。这些类只需要一个实例,因为游戏只需要一个状态管理器、字体管理器等。所以我应该使用单例还是应该使用其他方法来创建更好的代码。

最佳答案

在编程社区中,我们经常听到“使用 X 不好”或“使用 X 好”,但仅仅将某些东西标记为坏或好并不能完全解释它的优点和缺点,或者某些东西可能有什么问题或如何正确使用它。如果您不明白为什么某些东西可能是坏的,那么当它以其他形式或以不同的名称出现时,您很可能不会注意到它。

在您的单例示例中,我会做一些研究以确定使用单例的批评和陷阱,并评估它们是否会对您造成问题。

我最担心的两个问题是:

  1. 单例引入全局数据和全局状态。

    使用全局数据,访问和修改可能发生在整个代码中,这使得错误难以追踪,并且更容易陷入困惑状态。单例通常是设计不当的结果。

  2. 单例通常不是线程安全的。

在某些应用程序中,陷阱并没有真正成为问题。在 Cocoa/Objective-C 世界中,Apple 偶尔会使用 Singletons 来解决在我看来完全适合这项工作的问题。它们的一些用法与您描述的类似,例如图像管理/缓存。

您可以在此处阅读更多信息 What is so bad about singletons?

关于c++ - 在 C++ 游戏中使用单例资源管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33860380/

相关文章:

c# - 我应该把我的代码放在 Singleton 中的什么地方?

C++ & boost::threads - 如何根据工作类型确定线程的优先级?

c++ - 通过右值引用返回更有效吗?

c++ - 在 Linux 上启动文件的默认应用程序

oop - 使用多态性进行表达式评估和树遍历? (阿拉史蒂夫耶格)

swift - 关于单例类中定义的常量

c++ - C++中如何剪切和粘贴文件

oop - Eiffel :放宽前置条件,收紧后置条件?

c# - SQL 连接方法和最佳实践

swift - Swift 中的单例