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



我正在制作一个开放世界的单人RPG,其中世界由大多数孤立的区域组成,为了可扩展性,这些区域被划分为多个部分。这个世界包含着相互作用的生物。大多数生物都会提到其他生物,可能包括其他地区的生物。being的类定义可能看起来像

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

当然,我需要能够保存和加载游戏状态到磁盘和从磁盘。现在,我不想让所有的生物在任何时候都被装载。我只想加载玩家附近的生物,或者最坏的情况下,加载当前加载区域中的所有生物。实现这一目标的好策略是什么?到目前为止,我有几个想法。

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

有没有更好的替代方案?我想这是一个常见的问题,但我还没能在SO上找到相关的问题。

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

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

最新更新