温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

ListPool怎么用

发布时间:2021-12-18 14:09:30 来源:亿速云 阅读:180 作者:iii 栏目:大数据

这篇文章主要介绍“ListPool怎么用”,在日常操作中,相信很多人在ListPool怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ListPool怎么用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

是什么

ListPool是Unity的UISystem源码中的List对象池,它是由ObjectPool 扩展而来的。具体源码如下

using System;
using System.Collections.Generic;
using UnityEngine;

namespace UnityEngine.UI
{
   internal static class ListPool<T>
   {
       // Object pool to avoid allocations.
       private static readonly ObjectPool<List<T>> s_ListPool = new ObjectPool<List<T>>(null, Clear);
       static void Clear(List<T> l) { l.Clear(); }

       public static List<T> Get()
       {
           return s_ListPool.Get();
       }

       public static void Release(List<T> toRelease)
       {
           s_ListPool.Release(toRelease);
       }
   }
}

为什么

List是在游戏中经常会用到的数据结构,比如需要读取表格数据载入关卡表中的各项关卡,还有平时需要用到List的时候都需要临时new一个,后面的销毁完全交给C#。这种方式会导致不必要的GC,游戏中临时使用的List都应该考虑使用ListPool,而不是直接取new一个出来,List通过ListPool去管理。

怎么做

创建时调用

List<Vector3> m_Positions = ListPool<Vector3>.Get();

销毁时调用

ListPool<Vector3>.Release(m_Positions);

需要注意的是,创建和销毁一定要成对出现,不然就失去了循环利用的效果了。

ListPool继承自ObjectPool,因此内部也是一个Stack(last-in-first-out (LIFO))后进先出的结构,当我们需要新建(Get)一个新的List的时候,先从Stack的堆顶取出第一个,当使用结束的时候将List释放掉(Release),也就是将其重新放回Stack堆里面。ListPool里面设置了Get的回调为null,Release时候的回调为List.Clear()函数,将List置空。

到此,关于“ListPool怎么用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI