在C++游戏中使用资源管理器的singleton

Using singleton for Resource Manager in C++ game

本文关键字:资源管理器 singleton C++ 游戏      更新时间:2023-10-16

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

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

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

在编程社区中,我们经常听到"使用X是坏的"或"使用X很好",但仅仅将某个东西标记为坏或好根本不能解释它的长处和短处,也不能解释某个东西是如何出现问题的,也不能说明如何正确使用它。如果你不明白为什么有些东西可能不好,那么当它以其他形式或以不同的名字出现时,你很可能不会注意到它。

在你的单身汉例子中,我会做一些研究来确定使用单身汉的批评和陷阱,并评估它们是否会给你带来问题。

我最关心的两个问题是:

  1. 辛格尔顿介绍了全球数据和全球状态。

    有了全局数据,访问和修改可能会发生在整个代码中,这使得错误很难追踪,而且更容易陷入混乱状态。单身汉往往是糟糕设计的结果。

  2. 单身汉通常不安全。

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

你可以在这里阅读更多单身汉有什么不好的?