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

这篇具有很好参考价值的文章主要介绍了Unity自带的对象池——UnityEngine.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();
            }
        }
    }
}

总结

欢迎大佬多多来给萌新指正,欢迎大家来共同探讨。
如果各位看官觉得文章有点点帮助,跪求各位给点个“一键三连”,谢啦~

声明:本博文章若非特殊注明皆为原创原文链接
https://blog.csdn.net/Wrinkle2017/article/details/130767046
————————————————————————————————

版权声明

版权声明:本博客为非营利性个人原创
所刊登的所有作品的著作权均为本人所拥有
本人保留所有法定权利,违者必究!
对于需要复制、转载、链接和传播博客文章或内容的
请及时和本博主进行联系
对于经本博主明确授权和许可使用文章及内容的
使用时请注明文章或内容出处并注明网址
转载请附上原文出处链接及本声明
文章来源地址https://www.toymoban.com/news/detail-469169.html

到了这里,关于Unity自带的对象池——UnityEngine.Pool的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Apache Commons Pool2创建Java对象池

    在Java应用程序中,频繁地创建和销毁对象会消耗大量的内存和CPU资源,影响应用程序的性能和可伸缩性。为了解决这个问题,我们可以使用对象池技术,将对象存储在池中,在需要的时候从池中获取,使用完毕后将对象归还到池中。Apache Commons Pool2是一个流行的开源对象池实

    2023年04月08日
    浏览(52)
  • 【Unity3D】Unity 脚本 ③ ( C# 脚本的执行入口函数 | 获取当前游戏物体及物体名称 | 获取游戏物体的 Transform 组件数据 | UnityEngine 命名空间简介 )

    在 C# 脚本中控制 游戏物体 GameObject 运动 , 要先获取该物体 , 然后 修改其 Transform 组件的属性 ; 在 游戏开始运行后 , 会自动执行 游戏物体 GameObject 上的 C# 组件代码 , 程序入口是 MonoBehaviour#Start() 函数 ; 在 C# 脚本中 , 主要的内容都在 Start() 函数 中实现 ; 在 C# 脚本中 , 游戏物体

    2023年04月12日
    浏览(89)
  • 【Android】使用对象池(Object Pool)来缓存已经创建的字节数组,避免频繁地进行内存分配和回收操作提高性能

    在Android中,使用new byte[]创建字节数组是在堆上分配内存,不会直接导致Native内存的增长。但是,如果我们频繁地创建和销毁字节数组,就可能会导致堆内存不足,并触发GC,从而影响应用程序的性能。 在Android中,堆内存的大小是有限制的。如果我们频繁地创建和销毁字节数

    2024年02月09日
    浏览(52)
  • 【微信小程序】显示自带的弹窗,包括加载中,成功,错误,提示,警告

    在微信小程序中,可以使用以下方法来显示自带的弹窗: 显示加载中的弹窗: 显示成功的弹窗: 显示错误的弹窗: 显示提示的弹窗: 显示警告的弹窗: 在上述示例中, wx.showLoading() 方法用于显示加载中的弹窗, wx.showToast() 方法用于显示成功、错误、提示和警告的弹窗。这

    2024年02月15日
    浏览(37)
  • Unity自带方法读写JSON文件

    最近使用JSON文件保存模型表情数据,简单记录一下。 首先自定义数据类,需要记录表情每帧的所有BlendShape及时间戳: 使用Unity自带的JSON读写方法: 保存与读取JSON文件: 简单记录,部分变量与方法未展示,仅供参考。

    2024年02月12日
    浏览(50)
  • unity监听手机自带截屏(Android)

    参考 Unity监听手机自带截屏(支持Android10及以上) - 简书 Unity实现监听手机自带的截屏事件的实现,首先从Android获取到手机截图的图片路径,在通过Android将路径传给Unity,Unity再根据路径加载截屏的图片。 An... https://www.jianshu.com/p/67af95458679 发现cursor数据一直为空,最后发现

    2024年02月11日
    浏览(41)
  • 【Unity】自带的录屏插件Recorder

    Recorder是Unity官方的录屏插件,可以直接录制Game窗口,还可以录制不同相机的视图。不仅可以直接生成视频、帧动画图、还可以制作gif和animation。 菜单栏Windows→Package Manager,左上角选择Unity Registry,右侧搜索栏查找recorder: 找到该插件,右下角点击Install,安装完成即可使用。

    2024年02月04日
    浏览(50)
  • 关于Unity中动画自带模型位移问题的解决

    解决方法: 1.将模型的Animator组件中 Apply Root Motion 的勾选去掉 2.把相应动画中的 Loop Pose 选项勾选 上。(注意:在勾选上之后一定要记 得点下面的Apply保存设置) 这样,动画播放会移动模型位置发生变化的问题就解决了。

    2024年02月15日
    浏览(34)
  • [工具笔记]1.UnityEngine.Plane

    public struct Plane : IFormattable{} Plane是存在于 3D 空间中,无限大的平坦表面,将空间划分为两半(称为半空间)。可方便地确定特定点处于两个半空间的哪一个中,以及确定该点与平面相距多远。 此对象在unity并不可见,只是假设存在一个表面。 法线矢量源自哪一侧十分重要,

    2024年02月09日
    浏览(31)
  • 新手向 使用C#自带方法制作unity存档系统(无插件)

    纯原创,自制 本人还是个在校的高中生,能力不精如果有漏洞欢迎指出 先放出我们示范项目的样子 演示项目工程文件下载 后面会在B站发详细的视频教程(所以文章之后肯会改) 嫌麻烦的直接复制到项目里就可以用哦 (全部的SaveSystem源码最后放出方便大家复制) 可以存储

    2024年02月10日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包