C# 经常更新xml文件的最佳方法是什么?

C# 经常更新xml文件的最佳方法是什么?,c#,xml,xna,xmlnode,C#,Xml,Xna,Xmlnode,我在制作一款类似minecraft风格的小型3D voyel游戏。 在我的游戏中,你可以删除并添加一些立方体。 因此,我总是需要更新/保存我的XML文件。整个世界都保存在一个xml文件中。 在我的xml文件中,关于添加/删除节点的所有工作都正常,但问题在于性能 每次我需要保存xml文件时,程序都需要睡眠1秒钟。这在我的游戏中真的很难看。。每次播放器添加一个多维数据集时,请等待1秒钟,以便保存到我的xml文件中 你有什么想法吗 下面是保存xml文件的方法 示例(删除多维数据集后) 老实说,您不应该

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

每次我需要保存xml文件时,程序都需要睡眠1秒钟。这在我的游戏中真的很难看。。每次播放器添加一个多维数据集时,请等待1秒钟,以便保存到我的xml文件中

你有什么想法吗

下面是保存xml文件的方法

示例(删除多维数据集后)


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

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

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


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

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

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


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

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

添加/删除每个块后,是否确实需要保存世界?您应该将世界保存在内存中,并定期保存,或者让用户从菜单中单击“保存世界”。另一种选择是使用SQL数据库来存储世界数据,而不是文件。SQL将更快地添加/删除块的记录,它们应该立即获取/保存。考虑使用SQL LoalDB,因为它易于部署、自由和轻量级。我做的一件事就是将XML片段追加到文本文件中,然后添加根节点TrimMHh OK,谢谢,不,我不需要直接保存。我已经考虑过定期保存到xml文件中,但是如果应用程序崩溃,什么都不会发生。saveXML是序列化数据的一种很好的文件格式,但不是一种性能良好的数据结构,您应该实时更新它!在启动时将数据读入一个更合适的数据结构,然后在决定保存时将其写出。但重要的是,XML不是游戏的“实时”数据结构,它只是一种序列化格式。像在Minecraft中那样使用二进制文件怎么样?它会更快,因为您只能保存修改过的块。NBT格式并不难理解。如果我没记错的话,每30秒MC保存一次游戏。你真的需要在添加/删除每个区块后保存世界吗?您应该将世界保存在内存中,并定期保存,或者让用户从菜单中单击“保存世界”。另一种选择是使用SQL数据库来存储世界数据,而不是文件。SQL将更快地添加/删除块的记录,它们应该立即获取/保存。考虑使用SQL LoalDB,因为它易于部署、自由和轻量级。我做的一件事就是将XML片段追加到文本文件中,然后添加根节点TrimMHh OK,谢谢,不,我不需要直接保存。我已经考虑过定期保存到xml文件中,但是如果应用程序崩溃,什么都不会发生。saveXML是序列化数据的一种很好的文件格式,但不是一种性能良好的数据结构,您应该实时更新它!在启动时将数据读入一个更合适的数据结构,然后在决定保存时将其写出。但重要的是,XML不是游戏的“实时”数据结构,它只是一种序列化格式。像在Minecraft中那样使用二进制文件怎么样?它会更快,因为您只能保存修改过的块。NBT格式并不难理解。如果我没记错的话,每30秒保存一次游戏。你甚至可以只将编辑列表存储为{X,Y,BlockId},你甚至可以只将编辑列表存储为{X,Y,BlockId}。谢谢你,最后我退出游戏时保存。这工作很好;-)谢谢你,当我退出游戏时,我终于省钱了。这工作很好;-)
            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");