【问题标题】:Using singleton for Resource Manager in C++ game在 C++ 游戏中使用单例作为资源管理器
【发布时间】:2015-11-22 21:23:51
【问题描述】:

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

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

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

【问题讨论】:

  • 这看起来非常主观。您对这种方法是否有任何问题,或者您的担忧是基于单身人士的坏名声?
  • 我个人理解单身人士的问题我很了解人们的意见。然而,这并不重要。我只是想知道是否有更好的方法,或者这种情况下的单例是否是最好的解决方案。
  • 关于单例的潜在陷阱之一是除了显而易见的问题之外,它们是全局变量,它们以相当不可预测的顺序创建和销毁。如果你只有一两个,那部分还不错,如果你有几十个可能相互依赖的部分,它可能会变得非常糟糕(例如,销毁一个单例可能会尝试访问另一个已经被销毁的单例)。因此,它有助于整合整个应用程序,并且可能有一个单例,因为这可以聚合所有这些“管理器”并以明确定义的顺序创建/销毁它们。
  • 还有那种“合并的应用程序单例”,你只需为整个应用程序提供一个单例,如果你改变主意并决定应该多次实例化它,那就容易多了管理而不是一大堆单例(如果您在这里改变主意,仍然很痛苦并且涉及级联界面更改,但更新函数涉及传递这个应用程序对象并不难)。

标签: c++ oop singleton sfml


【解决方案1】:

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

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

我最担心的两个问题是:

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

    使用全局数据,可以在整个代码中进行访问和修改,这使得错误难以追踪,并且更容易陷入混乱状态。单例通常是糟糕设计的结果。

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

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

您可以在这里阅读更多内容What is so bad about singletons?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多