gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:48:03 26 4
gpt4 key购买 nike

我正在制作一个开放世界的单人角色扮演游戏,其中的世界主要由孤立的区域组成,为了可扩展性,这些区域被划分为多个部分。世界包含彼此相互作用的存在。大多数存在都会引用其他存在,可能包括其他地区的存在。 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com