坚持游戏演员对象

时间:2014-02-24 16:45:31

标签: xna persistence polyglot-persistance

这个问题与我一直在开发的游戏有关,但我认为这是一个非常通用的概念,我无法找到明确的答案。

我一直在试图弄清楚如何将演员(游戏世界中的对象)序列化为文件, 动态且在任意时间

上下文

要理解我的问题,你需要知道世界是如何构建的。游戏是一个基于细胞的世界,有3个维度,分为更小,更易于管理的部分,我将其称为块。地形信息都是固定的已知长度,我可以很好地序列化这些信息,只需在需要将块加载到内存中时(例如玩家靠近它),只需用适当的偏移量写入/读取具有适当偏移量的世界文件。这一切都很好,直到我必须处理演员并将它们写入单个文件。

问题

我知道ISerializable是一个非常有用的资源,可以实际从actor中获取数据,但我遇到的问题是动态地将其提交给磁盘。我的意思是从包含所有actor的大文件的中间插入/删除actor。如果我可以序列化整个游戏状态和演员树,那将会容易得多,但我需要能够一次在世界的一些小部分上执行此操作。有些部分没有演员,有些会有很多(比如说有几百个)。随着玩家在世界各地移动,这些部分正在被加载和保存。此外,演员的数量和数据的大小将在游戏过程中发生变化,因此我无法像处理地形那样处理它。我需要一种快速提交演员的方法,我可以在以后快速找到它并且不会浪费大量的文件空间。可能有用的一件事是,块中的所有actor都会被一次序列化/反序列化,而不是单独的。

注意:这些世界可以变得非常大(16k x 16k x 6),因此很容易拥有数百万演员。

问题

数据库真的是最好的方法吗?我并不反对实施一个,但这是一个涉及的过程,我想在继续之前确定它是一个推荐的行动方案。似乎可能会有严重的性能影响。

1 个答案:

答案 0 :(得分:1)

传统数据库(RDBMS)并不总是正确的方法。但是,唉,你正试图坚持数据。

大多数IT专业人员可能会引导您走向传统数据库,因为对我们来说它并不参与。这是面包和黄油。更进一步,有数百个图书馆让我们的生活更轻松,其中最新一代是全面的ORM

然而,正如您所指出的,完整的RDBMS对您的应用来说有点重要(取决于您的特定扩展需求)。所以我建议一些替代方案。

  • MongoDB的
  • RavenDB
  • CouchDB的
  • 卡桑德拉
  • Redis的

现在,从许多方面来看,这些都比RDBMS轻得多。然而,这些所谓的NoSQL(我选择了文档商店,因为它们似乎是最接近你的要求)有点不成熟。这并不是说它们是错误的,而且不可靠(它们具有比RDBMS更高的可靠性),但是人们并不真正知道如何使用它们。

同样,我需要对该陈述进行限定。 RDBMS背后有数十年的研究和最佳实践。每个实现的工具链都有大量的插件。 SO中的每个贡献者都知道如何使用数据库。但是,对NoSQL来说,这些都不是真的。

TLDR

所以它真的归结为这个。是的RDBMS(传统的DB)很复杂,就像现代公路车一样。但就像公路车(你买的那样),这些都是支持它们的基础设施。

另一种选择是NoSQL数据库,就像建造一个小型电动踏板车。是的,它更简单。但你把它带到一家汽车店,他们仍然没有任何线索。

最后

我的建议。使用现成的ORM和RDBMS。当前一代ORM几乎可以隐藏您的数据库。设置不会非常高效(你不会用它进行微秒算法交易),但它应该足以满足你的需求。