ListPool怎么用

这篇文章主要介绍“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怎么用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/tech/opensource/220091.html

(0)
上一篇 2022年1月2日 16:16
下一篇 2022年1月2日 16:16

相关推荐

发表回复

登录后才能评论