在 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+nframe 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# 中保存二维数组的快速方法的主要内容,如果未能解决你的问题,请参考以下文章

返回一个二维数组(在 C# 和 C++ 中)

将二维数组信息传递给 c# 中的方法

在 C# 中有效地缩小二维数组

如何将二维数组从 C# 传递到 C++?

将二维数组转换为列表(一维)的快速方法

Unity C# JSON 不会序列化私有二维数组?