【问题标题】:Maintaining data locality in a Dictionary<TKey,TValue>在 Dictionary<TKey,TValue> 中维护数据局部性
【发布时间】:2020-06-12 23:40:25
【问题描述】:

我正在制作一个游戏,我决定为每个游戏对象分配一个 int 实体 ID,这样我就可以轻松地搜索它们,而不必线性搜索一个列表或更糟糕的是,许多列表。这个想法受到 ECS 模式的启发,我想如果我确保在它们被销毁时重新使用 int,这将有助于将所有数据在内存中保持紧密并减少缓存未命中。 (我知道这更多地取决于访问顺序,只是在这里抽象地思考)。问题是我现在开始怀疑自己,而且我读了很多书,以至于我无法将这些想法直接记在脑海中。

问题本质上是如果我不断地向Dictionary&lt;int, SomeClass&gt; 添加更高编号的键,那么速度/内存使用情况会比我尝试重复使用更低编号的情况更糟吗?

注意:我觉得答案将是“编写自己的课程”,但我试图避免这种情况,如果我不理解这个概念,我认为我不会做得很好。

【问题讨论】:

  • 简短的回答是你需要尝试一下看看。
  • 我发现很难写出不被关闭的好问题,所以我重写了三遍以使其更简洁,在其中一个版本中我删除了解释行我不知道如何找出一个好的测试,这就是为什么我在字典如何存储数据的基本概念方面寻求帮助。
  • 您可以查看Dictionary 的源代码以了解其工作原理。但老实说 - 分析将是关键,看看这些好处是否真的发生了......

标签: c# unity3d optimization memory game-engine


【解决方案1】:

不,根本没有区别。来自MSDN

Dictionary 泛型类提供从一组键到一组值的映射。字典中的每个添加都包含一个值及其关联的键。使用其键检索一个值非常快,接近 O(1),因为 Dictionary 类是作为哈希表实现的。

因此,速度将始终为 O(1),因为它在内部使用哈希表,键的值根本不会影响它。

您可能面临的唯一问题是,如果您到达int.MaxValue,这取决于您的场景。

【讨论】:

    【解决方案2】:

    好的,这是我自己尽力回答的问题,如果我有任何错误,请道歉。

    简短回答:。如果您添加更高的数字,它们只会卡在数组的某个位置,直到它满了。示例问题的解决方案是将字典替换为 GameObject 数组并使用 int 作为索引,如果需要,编写一个类来处理它的扩展。

    更长的答案:我认为我的困惑来自于在某处读到字典只是一对并行数组或类似的东西。我想这是真的,但由于它是由哈希码索引的,所以它不适用于连续的索引值。所以它做了一堆多余的工作来处理我永远不会使用它的案例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      相关资源
      最近更新 更多