我在C#中创建了Unity中的一个游戏空间(它只是略微相关),表面上是.NET,因为它在Unity中.游戏空间是二维的,并且通过细胞自动机生成,具有精炼方法,这使得游戏空间的形状“可用于”我的意图.
目前,关于基本游戏空间(活细胞或死亡,开放或封闭,通路或墙壁)的数据作为二进制值存储在int [,]数组中.最终,其他数据也将存储在数组中,或者可能存储在映射回该int [,]数组的辅助集合中.
附加数据将包括有关以下内容的信息:如果玩家访问过此单元格,玩家是否可以看到此单元格(LoS),此单元格中是否有敌人或物品/物品.
显然,当玩家导航并且敌人沿着他们的路径移动时,LoS,hasVisited和敌方数据将是动态的.
我想从头开始设计和开发性能,因为早期的失误可能会导致性能瓶颈,这可能需要大量的重构 – 在项目结束时浪费宝贵的开发时间.
我的问题是:
更新数组或多个数组以跟踪数据是否会以线性或指数方式变得资源昂贵?换句话说,如果mapA是[80,80]而mapB是[160,160],那么mapB将消耗大约4倍的资源来维护,或者某些更大或更小的数量?如果大小超过int [,]的某个值,那么使用Dictionary或自定义集合之类的东西会有好处吗?
我最初的想法是使用像Dictionary< int [,],Dictionary< string,string>>这样的东西.我在工作中维护的实用程序中使用了很多字典,但是性能是我不考虑的,因为它是内部的,非常特定于用途,因此我对Dictionary<>的性能并不十分熟悉.一般来说.使用不同数据的同一网格的多个数组对Dictionary的好处是我可以使用有意义的键,而不仅仅是需要跟踪的其他值.但是,我怀疑数组可能只是更快,而长期来说可读性较差.
谢谢!
最佳答案 根据
this answer,Dictionary在内部是一个struct数组.因此,您只需添加一个额外的图层,而不仅仅是将它们存储在多维数组中.如果你正在寻找微优化,那么你将永远无法通过堆积更多来击败阵列.
此外,int [,]至少有助于提高可读性,因为它准确地表示了数据的可视化显示方式.首先,确保在进行之前需要进行优化.首先考虑过早优化的可读性.
我会坚持使用int [,]来处理你正在做的事情.它将具有更好的性能和可读性.