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

时间:2019-04-07 15:47:37

标签: c# unity3d pooling object-pooling

我只想知道Unity中池化系统的最佳快速方法是什么?一个List<Transform>还是简单的Transform[]数组?

3 个答案:

答案 0 :(得分:2)

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


基本知识:

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


游戏开发和池化的上下文:

通常,池的大小应为 dynamic 。它们可以成长和收缩。大小静态的池通常不称为,而是称为缓存。存储预初始化对象以在需要时使用的基本概念是相同的,区别通常是动态性。

特别是在游戏的上下文中,池通常用于避免由于在单个帧或短时间内初始化或垃圾收集大量对象而导致FPS下降尖峰。

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

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

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

答案 1 :(得分:1)

您应根据实际需求选择正确的数据结构。在C#中for f1 in *_1.tar.gz; do base=${f1%_1.tar.gz} # Strip _1.tar.gz, leaving File1, File2, etc f2=${f1%_1.tar.gz}_2.tar.gz # add _2.tar.gz to get File1_2.tar.gz, etc ... done List<T>之间并没有太大区别,T[]实际上实际上是数组的抽象。

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

每个集合都有自己的表现,表现为渐进复杂性。您可以考虑到您期望有多少元素以及将要执行的操作,请阅读here

最后,没有灵丹妙药,您应该选择最合适的。

答案 2 :(得分:0)

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