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

Jon*_*man 5 c++ oop storage caching reference

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

class Being {
    weak_ptr<Being> target;
    // other members
};
Run Code Online (Sandbox Code Playgroud)

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

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

这些选择有更好的替代方案吗?我想这是一个常见问题,但我无法在SO上找到相关问题.

gct*_*gct 1

您可以使用享元模式之类的东西来帮助您做到这一点。那么每种类型的 Being 实际上只加载一次(可以根据需要延迟加载),然后每个 Being 实例只包含特定于实例的变量,例如位置、速度等。

如果这还不够节省,您可以编写一个实例管理器,它具有一个 API,用于请求指向 Being 的引用计数指针。当引用对象被破坏时,它会通知实例管理器。这将使参考管理器可以根据需要轻松地将Beings编组到磁盘或从磁盘编组。