欢迎光临散文网 会员登陆 & 注册

【Unity】官方对象池总算实装了

2021-04-18 15:38 作者:YouSing  | 我要投稿

写在前面

    最近在Unity2021,发现了新的命名空间UnityEngine.Pool,这套API最早出现的地方应该是UGUI。后面大概是用到这套API的Package太多,干脆变成默认的API,可喜可贺。

初阶使用

    所有类如下图所示

    使用很简单,所有类API风格分为两种:

  • 手动Get,手动Release;

var list=ListPool<MyType>.Get();

// Do Something with list.

ListPool<MyType>.Release(list);

  • 使用Get(out)返回System.IDisposable,放在using中自动释放;

using(ListPool<MyType>.Get(out var list)) {

    // Do Something with list.

}

    这套API的设计初衷,是因为Unity功能包的有些操作需要频繁使用临时C#容器类,比如List<T>。如果不使用对象池系统,当然就是每帧都会造成GC负担。所以最常用的傻瓜式静态类都是System.Collections.Generic的池封装。

高阶使用

    核心实现类为ObjectPool<T>,而傻瓜式静态容器类(如ListPool<T>)就是声明一个ObjectPool<T>的静态变量,利用泛型变量会根据T生成,内存上不会相互干扰。不过我们直接使用ObjectPool<T>,自定义想要的池对象类型。

public ObjectPool<T0>(Func<T> createFunc, Action<T> actionOnGet, Action<T> actionOnRelease, Action<T> actionOnDestroy, bool collectionCheck, int defaultCapacity, int maxSize);

    参数简介如下:

  • createFunc:对象实例化实现;

  • actionOnGet:出池回调;

  • actionOnRelease:进池回调;

  • actionOnDestroy:销毁回调;

  • collectionCheck:检查集合,对象进池前,会先检查是否在池中;

  • defaultCapacity:默认容量;

  • maxSize:池大小的最大值,超出这数值,进池的对象直接销毁;

后记

    其实有了这个API,可以少做很多那些,你为了回避Unity的GC,而做缓存变量等反人类操作。由于实现一个GameObject的对象池,算是烂大街的教程,我也不想多加阐述。毕竟用这个API,代码可以省一大半了。

【Unity】官方对象池总算实装了的评论 (共 条)

分享到微博请遵守国家法律