经常更新 xml 文件的最佳方法是啥?

Posted

技术标签:

【中文标题】经常更新 xml 文件的最佳方法是啥?【英文标题】:What is the best way to update an xml file often?经常更新 xml 文件的最佳方法是什么? 【发布时间】:2014-08-11 14:54:20 【问题描述】:

我正在开发一款类似于 minecraft 风格的小型 3D voyel 游戏。 在我的游戏中,您可以删除并添加一些立方体。 因此,我总是需要更新/保存我的 XML 文件。整个世界都保存在一个 xml 文件中。 关于在我的 xml 文件中添加/删除节点的一​​切工作,但问题在于性能!

每次我需要保存在 xml 文件中,程序需要休​​眠 1 秒。这在我的游戏中真的很难看..每次玩家添加一个立方体意味着等待 1 秒以保存到我的 xml 文件中。

你有什么想法吗?

这是我保存 xml 文件的方式

示例(移除立方体后)

            XElement elementToRemove = elements
              .FirstOrDefault(
              x => (string)x.Attribute("min") == buildMin.ToString() &&
                    (string)x.Attribute("max") == buildMax.ToString());

            if(elementToRemove != null)
            
                elementToRemove.Remove();
            
            //Xdocument Class ~ call this function need 1 seconde
            XDocumentWorld.Save(AppDomain.CurrentDomain.BaseDirectory + @"World\world.xml");

【问题讨论】:

你真的需要在添加/删除每个块后拯救世界吗?您应该只将世界保存在内存中,并定期保存或让用户从菜单中单击“保存世界”。另一种选择是使用 SQL 数据库来存储世界数据,而不是文件。 SQL 会更快地为块添加/删除记录,它们应该立即获取/保存。考虑使用 SQL LocalDb,因为它易于部署、免费且轻量级。 我做的一件事就是将 xml 片段附加到文本文件中,然后稍后添加根节点 mhh 好的,谢谢,不,我真的不需要之后直接保存。我已经考虑过定期保存到 xml 文件中,但是如果应用程序崩溃,什么都不会保存 XML 是一种用于序列化数据的出色文件格式,但它不是一种您应该实时更新的高性能数据结构!在启动时将您的数据读入更合适的数据结构,然后在您决定保存时将其写入。但重要的是 XML 不是游戏的“实时”数据结构,它只是一种序列化格式。 那么在 Minecraft 中使用二进制文件怎么样?它会快得多,因为您只能保存修改过的块。 NBT 格式并不难理解。如果我没记错的话 MC 每 30 秒保存一次游戏。 【参考方案1】:

您不必在每次编辑后保存世界状态。在退出游戏之前或当一个块(即一个区域)将从内存中删除时保存数据。此外,您可以只存储玩家操作列表而不是所有块。要恢复,您使用相同的种子(假设是一个随机世界)重新生成所有内容,然后重做这些操作。

【讨论】:

谢谢你,我终于在退出游戏时保存了。很好用 ;-)【参考方案2】:

老实说,您不应该在每次更新时都保存 XML。这本身被归类为错误代码,因此我不建议使用它。相反,您应该将信息保存在内存中并在退出时写入。

但是,如果您坚持,理论上您可以使用另一个线程并安排代码每隔 5 秒写入 XML 文件,从而减少主线程的负载并仍然保留您请求的功能。

如果您不确定如何使用线程,请查看以下链接:

http://www.albahari.com/threading/

【讨论】:

您甚至可以只将编辑列表存储为 X, Y, BlockId

以上是关于经常更新 xml 文件的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

升级程序集时,在隔离存储中迁移文件的最佳方法是啥?

在 Java 应用程序中读取 XML 文件的最佳/最简单方法是啥? [关闭]

在 Java 中更改 XML 文件中的一个值的最佳方法是啥?

在使用表时更新表中数据而不锁定表的最佳方法是啥?

在 Visual Studio 中为 C# 更新 App.Config 文件的最佳方法是啥? [复制]

对 XML 模式进行版本控制的最佳实践是啥?