将csv数据导入游戏的最佳方式



我有一堆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文件吗?

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

至于哪种方法是正确的,这在一定程度上取决于用例和数据量。

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

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

否则使用1。(简单阅读游戏启动(。这适用于大多数游戏应用程序。";明显更长";?

顺便说一句,一个mroe选项是使用Excel或Open office来筛选数据的CSV,并导出一个新的CSV。这可能是最灵活的方法,可以避免您需要制定自己的文件格式。

最新更新