Unity3D在2021.1版本新增了内置的对象池系统
这是一项对大多数开发者来说非常好用且常用的功能
目录
三、Unity3D额外内置不同数据结构实现的Object Pool(大概描述)
四、实现Object Pool的小案例(案例以及源码会放到最后供大家参考)
1、使用前请先导入命名空间 —— using UnityEngine.Pool;
1、节省大量的学习时间,大幅提升开发效率。不需要去网络中筛选解决方案或是搜寻教程案例,又或是去掏腰包购买插件,然后再学习插件怎么用。
3、可以通过自己的理解进行池优化,通过一定的额外扩展以及维护达到自己想要的效果。
一、Object Pool的定义
1、将Object Pool在想象中抽象的比喻为 —— 容器:银河系 单个对象:星球
2、将Object Pool在生活中形象的比喻为 —— 容器:台球桌 单个对象:带有数字的球
3、定义:
我觉得通俗易懂的来说就是将已经实例化的大量对象重复循环利用,而不是在每次需要用时都去重复的创建和销毁它们(频繁的反复操作会导致大量的GC垃圾回收),通过预先创建和管理对象的集合,实现对象的重复利用,从而提高游戏性能和资源利用效率。这个对象可以是任何内容,它可以是 GameObject,也可以是 Component。(自我理解总结)
系统官方的来说对象池是一种优化项目并减轻 CPU 在必须快速创建和销毁新对象时负担的方法。这是一种很好的做法和设计模式,以帮助减轻 CPU 的处理能力,以处理更重要的任务,而不会被重复的创建和销毁调用所淹没。 对象池使用堆栈来保存对象实例的集合以供重用,并且不是线程安全的。(官方话术)
二、在游戏编程中我们为什么要使用Object Pool?
优点:
1、提高性能
对象池避免了频繁地创建和销毁对象的开销,减少了内存分配和垃圾回收的压力,从而提高了游戏的性能。
2、减少内存碎片
由于对象在重复使用过程中不断被创建和销毁,可能会导致内存碎片问题。对象池可以通过预先创建一定数量的对象来避免这个问题,减少内存碎片的产生。
3、控制对象创建的时间和成本
对象池在游戏开始之前就可以预先创建好一定数量的对象,避免了在游戏运行时动态创建对象的开销。这样可以提前分配对象所需的资源,并且可以更好地控制对象创建的时间和成本。
4、简化对象管理
使用对象池可以统一管理对象的生命周期和状态,简化了对象的创建、初始化、销毁等操作,提高了代码的可维护性和可读性。
凡事都有两面性,ObjectPool也是一把双刃剑
缺点:
1、会持久化占用内存
对象池需要预先创建一定数量的对象,占用了一定的内存空间。如果对象池设置得过大,可能会浪费内存;设置得过小,则可能频繁地创建和销毁对象。
2、对象状态的初始化管理
由于对象在重复使用过程中可能会保存其被收回池中之前的状态,需要在对象重新获取和归还时正确地管理和重置对象的初始化状态,否则可能出现意料之外的行为。
三、Unity3D额外内置不同数据结构实现的Object Pool(大概描述)
1.CollectionPool<T0,T1>
集合池,可以放