ObjectPool的原理是什么
发表于:2024-11-15 作者:千家信息网编辑
千家信息网最后更新 2024年11月15日,本篇内容主要讲解"ObjectPool的原理是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"ObjectPool的原理是什么"吧!ObjectPool
千家信息网最后更新 2024年11月15日ObjectPool的原理是什么
本篇内容主要讲解"ObjectPool的原理是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"ObjectPool的原理是什么"吧!
ObjectPool是什么
通过对Unity的UI源码解析我们发现了一个对游戏性能优化相关的一个Object缓存池ObjectPool.cs
为什么
在游戏中,我们需要创建和销毁3D模型,粒子特效,List,Array,包括战斗中由于频繁释放技能创建出来的子弹等物体,它们在频繁的销毁创建过程中会产生很多的碎片在内存中,如果没有一个统一的管理器来循环利用很容易造成游戏卡顿。因此ObjectPool就是用来对游戏中的Object对象进行对象池管理用的。
怎么做
下面我们来查看源码,看下其实现原理。
using System.Collections.Generic;
using UnityEngine.Events;
namespace UnityEngine.UI
{
internal class ObjectPool where T : new()
{
private readonly Stack m_Stack = new Stack();
private readonly UnityAction m_ActionOnGet;
private readonly UnityAction m_ActionOnRelease;
public int countAll { get; private set; }
public int countActive { get { return countAll - countInactive; } }
public int countInactive { get { return m_Stack.Count; } }
public ObjectPool(UnityAction actionOnGet, UnityAction actionOnRelease)
{
m_ActionOnGet = actionOnGet;
m_ActionOnRelease = actionOnRelease;
}
public T Get()
{
T element;
if (m_Stack.Count == 0)
{
element = new T();
countAll++;
}
else
{
element = m_Stack.Pop();
}
if (m_ActionOnGet != null)
m_ActionOnGet(element);
return element;
}
public void Release(T element)
{
if (m_Stack.Count > 0 && ReferenceEquals(m_Stack.Peek(), element))
Debug.LogError("Internal error. Trying to destroy object that is already released to pool.");
if (m_ActionOnRelease != null)
m_ActionOnRelease(element);
m_Stack.Push(element);
}
}
}
ObjectPool使用了一个Stack堆(last-in-first-out (LIFO))后进先出的结构,当我们需要新建(Get)一个新的Object的时候先从Stack的堆顶取出第一个,当使用结束的时候将其释放掉(Release),也就是将其重新放回Stack堆里面。原理其实很简单,当然里面增加了放进和放出时候的Action,可以用来传入回调函数,分别在取出和释放的时候调用。
到此,相信大家对"ObjectPool的原理是什么"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
原理
时候
频繁
内容
对象
源码
学习
管理
实用
更深
也就是
兴趣
内存
函数
后进
子弹
实用性
实际
就是
性能
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
忠诚保大庆网络安全培训
广州中普软件开发有限公司
网络安全周 挂掉
放置奇兵9有服务器安全吗
严禁软件开发的分包转包
怎么下载原神官方服务器
软件开发收款情况说明范文
网络安全作文550
怎么知道数据库连接文件有没有错
仓库erp软件开发企业
阿里聚石塔服务器配置参数
服务器数据安全管理系统
网络安全典型事件
网络安全技术的未来发展
公共信息网络安全监察标志
以下哪项不是IIS服务器
户外电子屏网络安全责任书
高质量软件开发
小米铃声软件开发
无线局域网管理网络安全
网络安全红线承诺书
信息网络安全管理义务罪主体
sql数据库对照表
联盟圣骑士服务器多少钱
闵行区创新软件开发哪家好
学软件开发需要掌握多少英语
星环+大数据库
国家注册网络安全高级工程师
软件开发部门建设意见
数据库对象可以有几个