在 C# 中保存二维数组的快速方法
Posted
技术标签:
【中文标题】在 C# 中保存二维数组的快速方法【英文标题】:Fast way to save 2D array in c# 【发布时间】:2020-12-04 19:45:56 【问题描述】:我正在尝试在 Unity 游戏期间保存 2D 数组。我尝试使用 StreamWriter 将数组保存到 csv,虽然这可行,但它太慢了,游戏停止/崩溃了一秒钟。有没有更快的方法来保存数组?它不需要是 csv,只要我以后可以在 C# 中检索数组,我就可以在游戏后进行转换。
编辑 - 更多信息:我正在使用 Leap Motion 来跟踪用户的手部。我想在每一帧中保存每个手部骨骼(手掌 + 每根手指 3 根骨骼)的位置和旋转。
【问题讨论】:
玩游戏期间是否需要保存?是否可以将其存储在内存中并在游戏的时间关键部分完成后保存? 我们将作为最后的手段这样做。这是为了研究,我们正在尝试在整个游戏过程中保存数据,这样我们就不会在任何崩溃时丢失它。 我建议研究事件溯源。如果您将状态视为更改的事件流,则只需附加到文件。有快照等概念来加速状态恢复。 我是新手,所以我刚开始阅读有关事件溯源的内容,因为您发布了。我认为这可能不适用,但我会感谢您对此的反馈!我正在使用 Leap Motion 来跟踪用户的手部。我想在每一帧保存每个手骨(手掌+每个手指 3 个骨头)的位置和旋转。你认为这种技术还能用吗? 如果二维数组很大(占用大量内存),您还可以查看持久化memory-mapped files。如果你打开一个持久化到磁盘的内存映射文件,你可以以虚拟内存的速度操作它的数据,但数据最终会存在于磁盘上。如果可以的话,减少保存到磁盘的大小(正如@Jason 所了解的那样)可能会更好。 【参考方案1】:对于 Unity 2017 及更高版本,您可以尝试将数据保存在不同的线程中。但是,由于您将在每一帧都执行此操作,因此您还需要实现一个排队系统,以防止 frame x+n
在 frame x
之前保存,如果 frame x
的保存滞后。
您可以检查这些资源作为开始:
Trying to use threads to save a file in the background http://www.stevevermeulen.com/index.php/2017/09/using-async-await-in-unity3d-2017/【讨论】:
以上是关于在 C# 中保存二维数组的快速方法的主要内容,如果未能解决你的问题,请参考以下文章