首页 > 其他分享 >Unity自带的对象池——UnityEngine.Pool

Unity自带的对象池——UnityEngine.Pool

时间:2023-05-22 14:36:46浏览次数:48  
标签:ps UnityEngine system Unity Pool main public pool



简介

之前对象池都是自己写,现在unity的API自带对象池了,UnityEngine.Pool 官方文档:https://docs.unity3d.com/ScriptReference/Pool.CollectionPool_2.html 主要包含了几个类

1.CollectionPool<T0,T1> 集合池,可以放List、HashSet、Dictionary啥的,非线程安全

2.DictionaryPool<T0,T1> 字典池,继承自CollectionPool

3.GenericPool< T0 > 通用池,ObjectPool的静态实现,启用了集合检查,以确保不会重复回收。非线程安全

4.HashSetPool< T0> 哈希集池,CollectionPool<T0,T1>的HashSet版本。

5.LinkedPool< T0> 链表池,IObjectPool的链表版本,池子内的对象是以链表形式保存的,非线程安全

6.ListPool< T0> 列表池,CollectionPool<T0,T1>的list版本。

7.ObjectPool< T0> 对象池,基于堆栈的IObjectPool< T0>,池子内的对象是以堆栈的形式保存的,非线程安全

8.UnsafeGenericPool< T0> 不安全通用池,提供ObjectPool的静态实现,这是禁用集合检查的GenericPool的替代方法。某些对象在收集检查期间进行比较时会产生垃圾。此版本不执行任何收集检查,因此不会产生垃圾。注意这不是线程安全的。


使用

官方案例,主要是unity的粒子系统来用对象池

using System.Text;
using UnityEngine;
using UnityEngine.Pool;

// 当粒子系统stop时,对象池回收,直接release
[RequireComponent(typeof(ParticleSystem))]
public class ReturnToPool : MonoBehaviour
{
    public ParticleSystem system;
    public IObjectPool<ParticleSystem> pool;

    void Start()
    {
        system = GetComponent<ParticleSystem>();
        var main = system.main;
        main.stopAction = ParticleSystemStopAction.Callback;
    }

    void OnParticleSystemStopped()
    {
        // Return to the pool
        pool.Release(system);
    }
}

// This example spans a random number of ParticleSystems using a pool so that old systems can be reused.
public class PoolExample : MonoBehaviour
{
    public enum PoolType
    {
        Stack,
        LinkedList
    }

    public PoolType poolType;

    // Collection checks will throw errors if we try to release an item that is already in the pool.
    public bool collectionChecks = true;
    public int maxPoolSize = 10;

    IObjectPool<ParticleSystem> m_Pool;

    public IObjectPool<ParticleSystem> Pool
    {
        get
        {
            if (m_Pool == null)
            {
                if (poolType == PoolType.Stack)
                    m_Pool = new ObjectPool<ParticleSystem>(CreatePooledItem, OnTakeFromPool, OnReturnedToPool, OnDestroyPoolObject, collectionChecks, 10, maxPoolSize);
                else
                    m_Pool = new LinkedPool<ParticleSystem>(CreatePooledItem, OnTakeFromPool, OnReturnedToPool, OnDestroyPoolObject, collectionChecks, maxPoolSize);
            }
            return m_Pool;
        }
    }

    ParticleSystem CreatePooledItem()
    {
        var go = new GameObject("Pooled Particle System");
        var ps = go.AddComponent<ParticleSystem>();
        ps.Stop(true, ParticleSystemStopBehavior.StopEmittingAndClear);

        var main = ps.main;
        main.duration = 1;
        main.startLifetime = 1;
        main.loop = false;

        // This is used to return ParticleSystems to the pool when they have stopped.
        var returnToPool = go.AddComponent<ReturnToPool>();
        returnToPool.pool = Pool;

        return ps;
    }

    // Called when an item is returned to the pool using Release
    void OnReturnedToPool(ParticleSystem system)
    {
        system.gameObject.SetActive(false);
    }

    // Called when an item is taken from the pool using Get
    void OnTakeFromPool(ParticleSystem system)
    {
        system.gameObject.SetActive(true);
    }

    // If the pool capacity is reached then any items returned will be destroyed.
    // We can control what the destroy behavior does, here we destroy the GameObject.
    void OnDestroyPoolObject(ParticleSystem system)
    {
        Destroy(system.gameObject);
    }

    void OnGUI()
    {
        GUILayout.Label("Pool size: " + Pool.CountInactive);
        if (GUILayout.Button("Create Particles"))
        {
            var amount = Random.Range(1, 10);
            for (int i = 0; i < amount; ++i)
            {
                var ps = Pool.Get();
                ps.transform.position = Random.insideUnitSphere * 10;
                ps.Play();
            }
        }
    }
}



标签:ps,UnityEngine,system,Unity,Pool,main,public,pool
From: https://blog.51cto.com/u_16023649/6323766

相关文章

  • python 进程池multiprocessing.Pool
    转载:python进程池multiprocessing.Pool(44)-知乎(zhihu.com)python进程池Pool和前面讲解的python线程池类似,虽然使用多进程能提高效率,但是进程的创建会消耗大量的计算机资源(进程Process的创建远远大于线程Thread创建占用的资源),线程是计算机最小的运行单位,连线程都需要使用线程......
  • python基础-进程池、submit同异步调用、shutdown参数、ProcessPoolExecutor进程池、进
    转载:(14条消息)python基础-进程池、submit同异步调用、shutdown参数、ProcessPoolExecutor进程池、进程池ftp_pythonsubmit_易辰_的博客-CSDN博客引入进程池在学习线程池之前,我们先看一个例子frommultiprocessingimportProcessimporttimedeftask(name):print(......
  • python进程池ProcessPoolExecutor的用法与实现分析
    转载:(14条消息)【Python随笔】python进程池ProcessPoolExecutor的用法与实现分析_utmhikari的博客-CSDN博客concurrent.futures—Launchingparalleltasks—Python3.11.3documentation在python开发期间,由于GIL的原因,不能直接采用并行的方式处理代码逻辑。在multiprocess......
  • unity实时渲染部分
    1.1现代GPU渲染流水线首先,图形渲染流水线以顶点数据作为开始,当GPU获取到CPU传递的顶点数据之后,整个图形渲染流水线正式开始运作图形渲染流水线的第一个站点是顶点着色器(VertexShader),它允许使用者通过程序进行配置。在顶点着色器中,顶点坐标会从模型空间变换到裁剪空间。除此......
  • Unity ZSpace相关操作文档
    适用范围开发文档适用于Unity5.5及更新的版本,包括Unity2017,Unity2018,Unity2019。zSpace插件构建Unity开发人员无需修改zSpace插件中的任何内容即可使用它的所有功能。但是了解插件体系结构对加快应用的开发。本节着重探讨插件结构。ZCoreMonoBehaviourzSpace插件包括一个......
  • Unity的UGUI用TexturePacker全自动打图集,包括九宫格切图信息
    @TOC前言最近在学习UGUI的打图集,之前一直在用SpritePacker和SpriteAtlas打图集,现在记录下另一种打图集方式:TexturePacker主要是讲如何自动打图集到Unity,并且不丢掉九宫格信息,以及一些参数的设置环境准备1.unity版本2019.4.10f12.TexturePacker安装官网,支持正版,支持正版,支持正版ht......
  • 概述 .NET ThreadPool 实现
    基本调度单元IThreadPoolWorkItem实现类的实例。Task全局队列本地队列偷窃机制线程注入实验.NET5实验一默认线程池配置.NET5实验二调整ThreadPool设置.NET5实验三tcs.Task.Wait()改为Thread.Sleep.NET6实验一默认ThreadPoo......
  • Unity中级客户端开发工程师的进阶之路
    上期UWA技能成长系统之《Unity高级客户端开发工程师的进阶之路》得到了很多Unity开发者的肯定。通过系统的学习,可以掌握游戏性能瓶颈定位的方法和常见的CPU、GPU、内存相关的性能优化方法。UWA技能成长系统是UWA根据学员的职业发展目标,提供技能学习的推荐路径,再将所需学习内容按......
  • Unity 愤怒的小鸟
    1.springjoint2D组件    弹簧关节。就是弹弓上伸缩弹性的绳子,添加组件会自动加一个刚体组件,把这个组件加在小鸟身上2.弹弓添加刚体组件Rigibody2D,把BodyType改成static,意思是只让他挂组件,不让他受重力    --世界坐标是以屏幕中心为原点,左负右正,下负上正  ......
  • unity基础2
       向量夹角的余弦值V  然后弧度转角度,用关键字RadDeg 也可以直接求角度   ------------------------------------------------------------------------------------------------------------------------------------------------------------------------......