统一池系统中的列表与数组

List vs Array in unity pooling system

Unity中Pooling系统的快速实现方式是什么?一个 List<Transform> ,简单的 Transform[] array , Queue 或 Stack ?

您应该根据自己的实际需求选择合适的数据结构。 C#中List<T>T[]没有太大区别,List<T>其实本质上是对数组的抽象

问问自己,您希望从对象池中获得哪些功能,例如,如果元素的数量是固定的,您可以使用 T[]。如果元素的数量发生变化,你需要 add\remove 个元素,那么 List<T> 可能是一个更好的选择。

此外,每个集合都有自己的表现,表现为渐近复杂性。你可以考虑关于你期望有多少元素以及你将要执行的操作,阅读here

最后,没有银弹,你应该选择最适合的。

如果你有固定大小的对象并且你想频繁地循环它们你最好使用数组[]。但是,如果您经常添加和删除对象,则最好使用 List。因为调整 array[] 的大小是一个昂贵的过程。

我原则上同意@Johnny 的回答,但因为有一个 Unity3D 标签,表示游戏开发上下文,我相信通常 一种普遍首选和推荐的方法,这反过来又给出了通常首选和推荐的数据结构。


一般基础知识:

这两种数据结构的主要区别在于,虽然数组可以增长和收缩,但它们并不是设计的。列表本身具有动态大小。


game-dev 和 pooling 具体的上下文:

一般来说,池的大小是动态。它们可以增长和收缩。静态大小的池通常不称为 pools,而是称为 caches。存储预初始化对象以供需要时使用的基本概念是相同的,区别通常是动态性。

在特定的游戏环境中,池通常用于避免由于在单个帧或短时间内对大量对象进行初始化或垃圾回收而导致的 FPS 下降峰值。

由于效果、爆炸、可破坏物体或地形等原因,游戏需要大量的物体。

池还可以用作控件,以限制玩家或一般场景中部署的某些类型的对象的数量。在这种情况下,池的优点是限制是动态的和可配置的,而基于数组的缓存对于数组的硬编码大小是静态的,除非变通。

此外,这可能是使用列表的主要原因,因为对于游戏来说,一个通用的池化系统通常就足够了,因此创建一个这样的灵活系统可以让您在多个领域重复使用它同一场比赛,以及后来的其他比赛。节省您的开发时间和精力。