设计一个非常大型游戏世界的存储方式

7 投票
3 回答
873 浏览
提问于 2025-04-15 15:32

我又开始学习游戏编程了。十年前我用qbasic做过游戏,但之后就没再做过,所以现在有点生疏。不过我一直在编程,现在是个网页开发者、数据库管理员和系统管理员。我有几个问题,但我决定每次只问一个。

我正在开发的游戏会是一个非常大的世界,类似于URW,但会更大,更像一个角色扮演游戏(RPG)。

我在考虑的一个问题是,怎样布局地图、保存地图和访问地图是最好的方法。我想到了用sqlite来存储数据。这样我甚至可以把sqlite数据库当作游戏的存档文件,简单又方便。

有没有人能给我一些建议,或者其他存储方法的想法?

这是我游戏的需求:

  • 我需要能够随时随机访问游戏世界中的任何地方(游戏中的NPC、怪物和动物都会一直活动)。
  • 我使用的是Stackless Python 3.1,选择不多,除非我做很多工作。
  • 需要能够处理一个非常大的世界。
  • 支持并发是个加分项,但我觉得我可能不需要这个功能。

3 个回答

1

我正在使用非关系型数据库来存储大量数据。如果你可以在64位的硬件上工作,MongoDB配合它的Python驱动真的非常不错。我不太确定这是否适用于Stackless,但这是一个可行的选择。

3

听起来你想要的是一种叫做空间索引的东西。如果你在做一个很大的二维游戏,我建议你使用四叉树。四叉树特别适合大范围的区域,而且活动通常集中在某些特定地方,这在大多数角色扮演游戏中都是这样的情况。使用四叉树可以减少存储需求,同时也能加快碰撞检测的速度。

至于保存游戏,像玩家和怪物的状态可以放在数据库里,如果你担心这些数据会经常变化的话。至于实际的关卡布局,我建议使用一种专门为你的游戏设计的二进制文件格式。关卡布局通常不需要进行很多数据库查询,而且你可以用自己的格式进行很好的优化。我不太清楚如何在数据库中存储类似四叉树的格式(不过我相信这是可能的)。

11

除非外部因素逼着你,否则别去碰关系型数据库。

看看Python的 pickleshelve

Shelve 运行速度快,扩展性好。它避免了在Python和其他格式之间转换时的麻烦。


补充一下。

更重要的建议是,不要在技术选择上纠结。先把地点、物品、角色、规则等搞定,让它们在Python中正常运作。尽量简单、准确。

不要浪费脑力在除了核心模型、正确性和基本功能集以外的事情上,这些是用来证明东西能工作的。

一旦你有了一个真正能工作的模型,并且可以用一些复杂的单元测试来验证它,那么你再去做技术选择。

有了模型后,你可以有效地扩展到数百万个地点,看看需要什么样的存储。模型是不能改变的——它是应用的核心。只有访问层和持久层可以调整,以提高性能。

撰写回答