持久化游戏参与者对象



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

我一直在试图弄清楚如何将参与者(游戏世界中的对象)串行化到一个文件中,动态且在任意时间

上下文

要理解我的问题,你需要知道世界是如何构建的。游戏是一个基于细胞的世界,有3个维度,分为更小、更易于管理的部分,我称之为区块。地形信息都是固定的已知长度,我可以很好地串行化这些信息,只要在需要将块加载到内存中时(比如玩家靠近它),就可以用适当的偏移量向世界文件写入/读取。这一切都很好,直到我不得不和演员打交道,把他们写在一个文件里。

问题

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

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

问题

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

传统数据库(RDBMS)并不总是正确的做法。但遗憾的是,你正试图持久化数据。

大多数IT专业人士可能会引导您使用传统数据库,因为对我们来说,它并不涉及。外面没有面包和黄油。此外,还有数百个图书馆让我们的生活更轻松,其中最新一代是全面的ORMs。

然而,正如您所指出的,完整的RDBMS对您的应用程序来说有点沉重(取决于您的特定扩展需求)。因此,我将提出一些替代方案。

  • MongoDB
  • RavenDB
  • 沙发数据库
  • 卡桑德拉
  • Redis

现在,在很多方面,这些确实比RDBMS轻得多。然而,这些所谓的NoSQL(我选择了Document存储,因为它们似乎最符合您的需求)有些不成熟。这并不是说它们有缺陷、不可靠(它们的可靠性比RDBMS高),但人们并不真正知道如何使用它们。

我需要再次对该发言加以限定。RDBMS背后有几十年的研究和最佳实践。每个实现的工具链都有大量插件。SO中的每个贡献者都知道如何很好地使用DB。但是,对于NoSQL来说,这些都不是真的。

TLDR

所以归根结底就是这个。YES RDBMS(传统数据库)很复杂,就像一辆现代公路车。但就像公路车(你买的)一样,这些车也有支撑它们的基础设施。

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

最后

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

最新更新