在游戏世界中存储和检索对已卸载对象的引用

时间:2014-09-01 17:17:47

标签: c++ oop caching reference storage

我正在制作一个开放世界的单人RPG游戏,其中世界主要由孤立区域组成,其可扩展性分为几个部分。世界包含彼此相互作用的生物。大多数生物都会提到其他生物,可能包括其他地区的生物。 being的类定义可能类似于

class Being {
    weak_ptr<Being> target;
    // other members
};

当然,我需要能够在磁盘上保存和加载游戏状态。现在,我不想让所有生物一直装满。我只想加载那些靠近玩家的生物,或者最坏的情况是加载当前加载区域内的所有生物。实现这一目标的好策略是什么?以下是我到目前为止所提出的一些想法。

  1. 在磁盘上,beings将为每个引用的存储器存储唯一的标识符。当A被加载时,如果已经加载了B,则只需设置指针。如果B已卸载,则还必须加载。缺点是,这可能会递归加载许多可能无法直接使用的生物。
  2. 它们不包含包含实际指针的生物,而是包含标识符。然后,当使用引用的生物时(例如,如果一个物体需要损坏另一个目标),它们将仅在需要时加载。这使得使用引用变得复杂,并且可能导致更多的保存/加载操作,但它避免了加载不必要的数据。
  3. 这些选项有更好的替代方案吗?我想这是一个常见问题,但我无法在SO上找到相关问题。

1 个答案:

答案 0 :(得分:1)

您可以使用类似Flyweight Pattern的内容来帮助您执行此操作。然后每种类型的存储实际上只加载一次(可以在需要的时候懒得完成),然后每个存在实例只包含特定于实例的变量,如位置,速度等。

如果这还不够节省,您可以编写一个具有API的实例管理器,用于请求指向存在的引用计数指针。引用对象将在实例管理器被销毁时通知它。这将使参考管理员可以根据需要轻松地将Beings与磁盘进行编组。