【发布时间】:2019-04-07 15:47:36
【问题描述】:
Unity 中池化系统的快速方法是什么?一个List<Transform>,简单的Transform[]数组,队列还是栈?
【问题讨论】:
标签: c# unity3d pooling object-pooling
Unity 中池化系统的快速方法是什么?一个List<Transform>,简单的Transform[]数组,队列还是栈?
【问题讨论】:
标签: c# unity3d pooling object-pooling
我原则上同意@Johnny 的回答,但由于有一个 Unity3D 标签,表示游戏开发上下文,我相信通常 是一种普遍首选和推荐的方法,这反过来又给出了一般首选和推荐的数据结构。
这两种数据结构之间的主要区别在于,虽然数组可以增长和缩小,但它们设计不是为此而设计的。列表本身具有动态大小。
通常,池的大小是动态。它们可以增长和缩小。大小为静态的池通常不称为 pools,而是称为 caches。存储预初始化对象以备需要时使用的基本概念是相同的,区别通常是动态性。
特别是在游戏的上下文中,池通常用于避免由于在单帧或短时间内对大量对象进行初始化或垃圾收集而导致 FPS 下降峰值。
由于效果、爆炸、可破坏对象或地形等原因,游戏需要这些对象数量的峰值。
池还可以用作控件,以限制玩家或一般场景中部署的某些类型对象的数量。在这种情况下,池的优点是限制是动态的和可配置的,而基于数组的缓存对于数组的硬编码大小是静态的,除非变通。
此外,这可能是使用列表的主要原因,因为对于游戏来说,一个通用的池系统通常就足够了,因此创建一个灵活的这样的系统可以让您在多个领域重复使用它。同一场比赛,以及后来的其他比赛。为您节省开发时间和精力。
【讨论】:
您应该根据您的实际需求选择正确的数据结构。 C#中List<T>和T[]没有太大区别,List<T>本质上是对数组的抽象。
问问自己您希望对象池提供哪些功能,例如,如果元素数量是固定的,您可以使用T[]。如果元素数量发生变化,则需要添加\删除元素,那么List<T> 可能是更好的选择。
此外,每个集合都有自己的表现,以渐近复杂度表示。您可以考虑您期望的元素数量以及您将执行的操作,请阅读here。
最终,没有灵丹妙药,您应该选择最适合的。
【讨论】:
如果你有固定大小的对象并且你想频繁地循环它们,你最好使用array[]。但是,如果您经常添加和删除对象,则最好使用 List。因为调整数组 [] 的大小是一个昂贵的过程。
【讨论】:
List 的大小也是如此,因为它在内部使用数组来存储值;)列表重复其数组大小(从 4 开始),每次添加元素都会超过大小。