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

标签 c++ oop caching reference storage

我正在制作一个开放世界的单人角色扮演游戏,其中的世界主要由孤立的区域组成,为了可扩展性,这些区域被划分为多个部分。世界包含彼此相互作用的存在。大多数存在都会引用其他存在,可能包括其他地区的存在。 being 的类定义可能如下所示

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

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

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

除了这些选项之外,还有更好的选择吗?我想这是一个常见问题,但我无法在 SO 上找到相关问题。

最佳答案

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

如果这还不够节省,您可以编写一个具有 API 的实例管理器,用于请求指向 Being 的引用计数指针。引用对象在销毁时会通知实例管理器。这将使引用管理器很容易根据需要将 Beings 编码进出磁盘。

关于c++ - 存储和检索对游戏世界中卸载对象的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25610498/

相关文章:

java - 当数据库从批处理端更新时,在 Web 应用程序端刷新 Hibernate 缓存级别 2

android - Qt安卓编译报错

c++ - 这种无锁的dlist插入安全吗?

java - 具有过滤功能的巨大排行榜排名

java - 用于填充值对象的面向对象代码

design-patterns - 领域驱动设计问题

php - 用 PHP 或 JavaScript 处理的大数组

c++ - 双端队列索引

c++ - 如何定义作为不可实例化类的静态成员的数组的大小?

java - 类结构应该匹配 OOP 中的表结构吗?