【问题标题】:Best way to import csv data into a game? [closed]将csv数据导入游戏的最佳方法? [关闭]
【发布时间】:2021-12-28 06:50:30
【问题描述】:

我有一堆 csv 文件,其中包含不同类型的数据条目。现在我想以游戏可读的方式加载这些 csv 文件,比如条目列表。并在性能和内存使用之间保持平衡。 我想出了几种方法:

  1. 在运行时解析所需的 csv 文件。理想情况下,当解析不会引入延迟时,在需要它之前解析 csv 数据,例如在场景加载期间。
  2. 我可以离线解析它们,并生成如下文件:
public class ContentOfSomeCsv {
    private static data;
    public static LoadData(){
        data = new EntryType[] {
            entry1,
            entry2,
            ...
            entryn,
        }
    }
}
  1. 将 csv 文件导入运行时数据库,从数据库中加载所需条目并在需要时进行缓存。

我已经尝试了第一种方法,它的解析器实现并不那么智能。场景加载需要更长的时间。所以我想切换到方法 2 或 3。但我不确定这些方法是否有效。

我想知道何时应该使用上述方法以及它们是否有任何问题。或者有没有更好的方法来导入 csv 文件?

【问题讨论】:

    标签: c# csv


    【解决方案1】:

    不要重新发明轮子 ;) 虽然 Unity 没有板载 CSV 库(假设这是您使用的引擎),但有一个广泛的开源实现: https://github.com/JoshClose/CsvHelper 教程:https://zetcode.com/csharp/csv/ 对于在 Unity 中的使用,您不会调用“dotnet add package CsvHelper”行,而是只需从 Github 下载代码并将其插入到您的资产文件夹中。

    至于哪种方法是正确的,取决于用例和数据量。

    使用2.(转换成自己的文件): 如果您知道您只需要原始 CSV 中已知的一小部分数据。由于 CSV 是基于文本的,因此读取每个条目的速度与从自定义文件中读取一样快。 从技术上讲,您可以使用不需要解析文本值的二进制格式来加快速度,但这相当先进。 编辑:我误解了这种方法。认为这将是一个外部文件,而不是实际生成包含数据的 C# 文件本身。 虽然我不知道是否会出现真正的缺点,但它只是打破了将数据与代码分离的原则。通常不需要这样做。

    使用 3.(数据库): 如果原始数据很大(>50k 条目)并且您需要在运行时执行复杂的“查询”,例如关联 CSV 中的不同字段等。 加载到数据库中可能不会比加载到内存中快。

    否则使用 1.(游戏启动时的简单阅读)。这适用于大多数游戏应用程序。 “明显更长”的确切含义是什么?

    顺便说一句,一个 mroe 选项是使用 Excel 或 Open Office 来过滤您的 CSV 中的数据,并根据您的需要导出一个新的 CSV。这可能是最灵活的方法,而且您无需提出自己的文件格式。

    【讨论】:

    • 我看到有人反对将数据写入 csharp 文件。一点是可扩展性差,如果生成文件,可以将其最小化。我不确定。您能解释一下方法 2 在应用于大数据时的问题吗?它与内存使用和gc有关吗?
    • @TinglePan 请为您定义什么是“大数据”,以便我们可以讨论一些共同点。您可以很容易地计算内存量,因为您知道浮点数(通常为 32 字节)、整数(通常为 16 字节)等需要多少。如果您只读取一次,则 GC 不是什么大问题,因为您可以通过不使用动态增长的数据结构而是使用一次性创建的固定数组来减少 GC 影响(因此只有一个内存分配- 动态结构定期重新分配)。
    • 啊,我有点误解你的意思了#2。认为这将是关于导出然后读取不同的 .txt 文件。不是 C# 文件。嗯,我不能从那里的经验谈起。这绝对是通常不会做的事情。从技术上讲,与从 .txt 或 .csv 读取相同数据相比,内存或 GC 影响不应该更高。 --- 但是我可以想象,当 C# 文件非常庞大时,一些解释文件的 IDE 不会喜欢它!我宁愿建议我认为您的意思:写出一个较小的 .csv\.txt 并阅读那个。还是您需要所有数据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多