【发布时间】:2014-02-24 16:45:31
【问题描述】:
这个问题与我一直在开发的一款游戏有关,但我认为这是一个非常笼统的概念,我还没有找到明确的答案。
我一直在尝试弄清楚如何将actor(游戏世界中的对象)在任意时间动态地序列化到一个文件中。
上下文
要理解我的问题,您需要了解世界一般是如何构造的。游戏是一个基于单元的世界,具有 3 个维度,分为更小、更易于管理的部分,我将其称为块。地形信息都是固定的已知长度,我可以很好地序列化这些信息,只要需要将块加载到内存中(比如玩家靠近它),只需使用适当的偏移量向世界文件写入/读取。在我必须处理演员并将它们写入单个文件之前,这一切都很好。
问题
我知道 ISerializable 是一种非常有用的资源,可用于实际从参与者那里获取数据,但我遇到的问题是将其动态提交到磁盘。我的意思是从包含所有演员的大文件的中间插入/删除演员。如果我可以序列化整个游戏状态和演员树会容易得多,但我需要能够一次在世界的一小部分上做到这一点。有些部分没有演员,有些会有很多(最多几百个)。当玩家在世界各地移动时,这些部分会被加载和保存。此外,演员的数量和他们的数据大小会随着游戏的进行而变化,所以我不能像处理地形一样处理它。我需要一种快速提交 actor 的方法,以便稍后我可以快速找到它并且不会浪费大量文件空间。可能有用的一件事是,一个块中的所有参与者都被一次序列化/反序列化,而不是单独的。
注意:这些世界可以变得非常大 (16k x 16k x 6),因此很容易拥有数百万演员。
问题
数据库真的是最好的方法吗?我不反对实施一个,但这是一个涉及的过程,我想确保在我继续之前这是一个推荐的行动方案。似乎可能会对性能产生严重影响。
【问题讨论】:
-
你应该考虑使用 NoSQL 数据库;可能会简化你的生活......
-
我使用 Protobuf-net 进行类似的活动。这会将单个或多个实例序列化为一个小文件,
-
@rae1 我正在研究 Redis,但能够找到支持可能是个问题。根据 Aron 的回答,我可能会首先尝试使用更厚的数据库,如果我真的遇到了令人心碎的性能问题,即使使用线程,我也会跳到 NoSQL。
-
查看FoundationDB。它似乎两全其美。
-
@rae 是的!我很想派一个新手用 C API 编写一个互操作层。 FoundationDB 没有 .net 绑定!
标签: xna persistence polyglot-persistance