在 C++ 游戏中使用单例资源管理器
Using singleton for Resource Manager in C++ game
我已经和我的公司一起开发游戏好几年了。然而,最近我们一直在改进 游戏 的 基础系统 以使将来的添加更容易。我们所做的一项更改是添加 资源管理器 ,而不是手动加载屏幕 class 中的信息,这些信息本质上是 游戏状态 。我们决定将其实现为 单例 。然而,我知道在编程社区中使用单例的争议。
我将在下面举例说明我们如何使用 字体管理器 。我想知道在这种情况下是否可以接受单例,或者您是否会推荐其他方法。
mTextToBeDrawn.setFont(FontManager::GetInstance()->GetFont("Default"));
我愿意接受所有建议,我将解释当前的 OOP 设计,以便更深入地了解系统。每个管理器都从一个名为管理器的基础 class 扩展而来,具有通用的添加和删除方法。然后在派生的 classes 中实现添加和删除方法。这些 classes 只需要一个实例,因为游戏只需要一个状态管理器、字体管理器等等。那么我应该使用单例还是应该使用其他方法来创建更好的代码。
我们经常在编程社区中听到 "using X is bad" 或 "using X is good",但仅仅将某事标记为坏或好并不能完全解释它的优点和缺点或某些事情可能有问题或如何正确使用它。如果您不明白为什么某些东西可能是坏的,那么当它以其他形式或以不同的名称出现时,您很可能不会注意到它。
在你的单例示例中,我会做一些研究以确定使用单例的批评和陷阱,并评估它们是否会给你带来问题。
我最担心的两个问题是:
单例引入全局数据和全局状态。
使用全局数据,访问和修改可能发生在整个代码中,这使得错误难以追踪,并且更容易陷入混乱状态。单例通常是设计不当的结果。
单例通常不是线程安全的。
在某些应用程序中,陷阱并没有真正成为问题。在 Cocoa/Objective-C 世界中,Apple 偶尔会使用 Singletons 来解决在我看来完全适合这项工作的问题。他们的一些用法与您描述的类似,例如图像management/caching。
您可以在此处阅读更多内容What is so bad about singletons?
我已经和我的公司一起开发游戏好几年了。然而,最近我们一直在改进 游戏 的 基础系统 以使将来的添加更容易。我们所做的一项更改是添加 资源管理器 ,而不是手动加载屏幕 class 中的信息,这些信息本质上是 游戏状态 。我们决定将其实现为 单例 。然而,我知道在编程社区中使用单例的争议。 我将在下面举例说明我们如何使用 字体管理器 。我想知道在这种情况下是否可以接受单例,或者您是否会推荐其他方法。
mTextToBeDrawn.setFont(FontManager::GetInstance()->GetFont("Default"));
我愿意接受所有建议,我将解释当前的 OOP 设计,以便更深入地了解系统。每个管理器都从一个名为管理器的基础 class 扩展而来,具有通用的添加和删除方法。然后在派生的 classes 中实现添加和删除方法。这些 classes 只需要一个实例,因为游戏只需要一个状态管理器、字体管理器等等。那么我应该使用单例还是应该使用其他方法来创建更好的代码。
我们经常在编程社区中听到 "using X is bad" 或 "using X is good",但仅仅将某事标记为坏或好并不能完全解释它的优点和缺点或某些事情可能有问题或如何正确使用它。如果您不明白为什么某些东西可能是坏的,那么当它以其他形式或以不同的名称出现时,您很可能不会注意到它。
在你的单例示例中,我会做一些研究以确定使用单例的批评和陷阱,并评估它们是否会给你带来问题。
我最担心的两个问题是:
单例引入全局数据和全局状态。
使用全局数据,访问和修改可能发生在整个代码中,这使得错误难以追踪,并且更容易陷入混乱状态。单例通常是设计不当的结果。
单例通常不是线程安全的。
在某些应用程序中,陷阱并没有真正成为问题。在 Cocoa/Objective-C 世界中,Apple 偶尔会使用 Singletons 来解决在我看来完全适合这项工作的问题。他们的一些用法与您描述的类似,例如图像management/caching。
您可以在此处阅读更多内容What is so bad about singletons?