Unity C# 引用池 ReferencePool
Unity C# 引用池 ReferencePool
1.目的
对于多次创建的数据使用new 关键字是十分消耗性能的,使用完成后由GC去自动释放,当一个类型的数据频繁创建可以使用引用池进行管理。
2.实现
项目目录
IReference 接口
要放入引用池的数据只需要继承这个接口即可
namespace ReferencePool
{public interface IReference{void Clear();}
}
ReferenceCollection 引用集合
一个类型对应一个引用集合,每次请求从引用集合的队列中获取
namespace ReferencePool
{public class ReferenceCollection{private readonly Queue<IReference> m_References = new Queue<IReference>();private Type m_ReferenceType;private int m_CurrUsingRefCount;//当前引用的数量private int m_AcquireRefCount;//请求引用的总数量private int m_ReleaseRefCount;//释放引用的总数量private int m_AddRefCount;//添加引用的总数量private int m_RemoveRefCount;//移除引用的总数量public int CurrUsingRefCount => m_CurrUsingRefCount;public int AcquireRefCount => m_AcquireRefCount;public int ReleaseRefCount => m_ReleaseRefCount;public int AddRefCount => m_AddRefCount;public int RemoveRefCount => m_RemoveRefCount;public ReferenceCollection(Type refType){m_ReferenceType = refType;m_CurrUsingRefCount = 0;m_AcquireRefCount = 0;m_ReleaseRefCount = 0;m_AddRefCount = 0;m_RemoveRefCount = 0;}public T Acquire<T>() where T : class, IReference, new(){if (typeof(T) != m_ReferenceType){throw new Exception("类型不相同无法请求!!!");}m_CurrUsingRefCount++;m_AcquireRefCount++;lock (m_References){if (m_References.Count > 0){return (T)m_References.Dequeue();}}m_AddRefCount++;return new T();}public void Release(IReference reference){reference.Clear();lock (m_References){if (m_References.Contains(reference)){throw new Exception("引用已经被释放,请勿重新释放!!!");}m_References.Enqueue(reference);}m_CurrUsingRefCount--;m_ReleaseRefCount++;}public void Add<T>(int count) where T : class, IReference, new(){if (typeof(T) != m_ReferenceType){throw new Exception("类型不相同无法添加!!!");}lock (m_References){m_AddRefCount += count;while (count-- > 0){m_References.Enqueue(new T());}}}public void Remove(int count){lock (m_References){if(count > m_References.Count){count = m_References.Count;}m_RemoveRefCount += count;while (count-- > 0){m_References.Dequeue();}}}public void RemoveAll(){lock (m_References){m_RemoveRefCount += m_References.Count;m_References.Clear();}}}
}
ReferencePool 真正的引用池
对引用集合进行统一管理
public static class ReferencePool{private static readonly Dictionary<Type,ReferenceCollection> m_ReferenceCollections = new Dictionary<Type,ReferenceCollection>();public static int Count => m_ReferenceCollections.Count;//获取引用池的数量public static void ClearAll(){lock (m_ReferenceCollections){foreach (var reference in m_ReferenceCollections.Values){reference.RemoveAll();}m_ReferenceCollections.Clear();}}public static T Acquire<T>() where T : class, IReference, new(){return GetReferenceCollection(typeof(T)).Acquire<T>();}public static void Release(IReference reference){GetReferenceCollection(reference.GetType()).Release(reference);}public static void Add<T>(int count) where T : class, IReference, new(){GetReferenceCollection(typeof(T)).Add<T>(count);}public static void Remove<T>(int count) where T : class, IReference, new(){GetReferenceCollection(typeof(T)).Remove(count);}public static void RemoveAll<T>() where T : class, IReference, new(){GetReferenceCollection(typeof(T)).RemoveAll();}private static ReferenceCollection GetReferenceCollection(Type type){if (type == null){throw new Exception("Type 类型 为空!!!");}ReferenceCollection referenceCollection = null;lock (m_ReferenceCollections){if(!m_ReferenceCollections.TryGetValue(type,out referenceCollection)){referenceCollection = new ReferenceCollection(type);m_ReferenceCollections.Add(type, referenceCollection);}}return referenceCollection;}public static int GetCurrUsingRefCount<T>() where T : class, IReference, new(){return GetReferenceCollection(typeof(T)).CurrUsingRefCount;}public static int GetAcquireRefCount<T>() where T : class, IReference, new(){return GetReferenceCollection(typeof(T)).AcquireRefCount;}public static int GetReleaseRefCount<T>() where T : class, IReference, new(){return GetReferenceCollection(typeof(T)).ReleaseRefCount;}public static int GetAddRefCount<T>() where T : class, IReference, new(){return GetReferenceCollection(typeof(T)).AddRefCount;}public static int GetRemoveRefCount<T>() where T : class, IReference, new(){return GetReferenceCollection(typeof(T)).RemoveRefCount;}}
3.测试
namespace ReferencePool
{public class Program{static void Main(string[] args){TeacherData teacherData1 = ReferencePool.Acquire<TeacherData>();teacherData1.Name = "zzs";teacherData1.Age = 20;ReferencePool.Release(teacherData1);TeacherData teacherData2 = ReferencePool.Acquire<TeacherData>();teacherData1.Name = "xxx";teacherData1.Age = 18;Console.WriteLine(ReferencePool.GetCurrUsingRefCount<TeacherData>());Console.WriteLine(ReferencePool.GetAcquireRefCount<TeacherData>());Console.WriteLine(ReferencePool.GetReleaseRefCount<TeacherData>());Console.WriteLine(ReferencePool.GetAddRefCount<TeacherData>());Console.WriteLine(ReferencePool.GetRemoveRefCount<TeacherData>());Console.ReadKey();}}public class TeacherData : IReference{public string Name;public int Age;public void Clear(){Name = string.Empty;Age = 0;}}
}
4.总结
重复使用的对象只创建有限次,避免来回实例化对象的开销
相关文章:

Unity C# 引用池 ReferencePool
Unity C# 引用池 ReferencePool 1.目的 对于多次创建的数据使用new 关键字是十分消耗性能的,使用完成后由GC去自动释放,当一个类型的数据频繁创建可以使用引用池进行管理。 2.实现 项目目录 IReference 接口 要放入引用池的数据只需要继承这个接口…...

opencv 进阶10-人脸识别原理说明及示例-cv2.CascadeClassifier.detectMultiScale()
人脸识别是指程序对输入的人脸图像进行判断,并识别出其对应的人的过程。人脸识别程 序像我们人类一样,“看到”一张人脸后就能够分辨出这个人是家人、朋友还是明星。 当然,要实现人脸识别,首先要判断当前图像内是否出现了人脸&…...

〔013〕Stable Diffusion 之 图片自动评分和不健康内容过滤器 篇
✨ 目录 🎈 下载咖啡美学评价插件🎈 咖啡美学评价使用🎈 不健康内容过滤器插件🎈 下载咖啡美学评价插件 想让系统帮你的图片作品打分评价,可以下载咖啡美学自动评价插件插件地址:https://github.com/p1atdev/stable-diffusion-webui-cafe-aesthetic也可以通过扩展列表…...

6.RocketMQ之消费索引文件ConsumeQueue
功能:作为CommitLog文件的索引文件。 本文着重分析为consumequeue/topic/queueId目录下的索引文件。 1.ConsumeQueueStore public class ConsumeQueueStore {protected final ConcurrentMap<String>, ConcurrentMap<Integer>, ConsumeQueueInterface…...

Appium-移动端自动测试框架,如何入门?
Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门,那么我们就直奔主题。文章结构如下: 1、为什么要使用Appium? 2、如何搭建Appium工具环境?(超详细) 3、通过demo演示Appium的使用 4、Appium如何…...

复数混频器、零中频架构和高级算法开发
文章里讲解了关于射频IQ调制器、零中频架构相关的原理及技术,全都是干货!其实好多同行对软件无线电的原理、IQ调制、镜像抑制都是一知半解,知其然不知其所以然。好好研读这篇文章,相信会让你有种恍然大悟的感觉。 RF工程常被视为…...

Web 拦截器-interceptor
拦截器是一种动态拦截方法调用的机制,类似于过滤器,是Spring框架提出的,用来动态拦截控制器方法的执行。 其作用是拦截请求,在指定方法调用前后,根据业务执行预设代码。 实现步骤 1.定义拦截器,实现Handl…...

Java进阶(4)——结合类加载JVM的过程理解创建对象的几种方式:new,反射Class,克隆clone(拷贝),序列化反序列化
目录 引出类什么时候被加载JVM中创建对象几种方式1.new 看到new : new Book()2.反射 Class.forName(“包名.类名”)如何获取Class对象【反射的基础】案例:连接数据库方法 3.克隆(拷贝)clone浅拷贝深拷贝案例 序列化和反序列化对象流-把对象存…...

扩散模型实战(四):从零构建扩散模型
推荐阅读列表: 扩散模型实战(一):基本原理介绍 扩散模型实战(二):扩散模型的发展 扩散模型实战(三):扩散模型的应用 本文以MNIST数据集为例,从…...

YOLOv5、YOLOv8改进:S2注意力机制
目录 1.简介 2.YOLOv5改进 2.1增加以下S2-MLPv2.yaml文件 2.2common.py配置 2.3yolo.py配置 1.简介 S2-MLPv2注意力机制 最近,出现了基于 MLP 的视觉主干。与 CNN 和视觉Transformer相比,基于 MLP 的视觉架构具有较少的归纳偏差,在图像识…...

LeetCode 542. 01 Matrix【多源BFS】中等
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...

使用open cv进行角度测量
使用open cv进行角度测量 用了一点初中数学的知识,准确度,跟鼠标点的准不准有关系,话不多说直接上代码 import cv2 import mathpath "test.jpg" img cv2.imread(path) pointsList []def mousePoint(event, x, y, flags, param…...
java 线程池实现多线程处理list数据
newFixedThreadPool线程池实现多线程 List<PackageAgreementEntity> entityList new CopyOnWriteArrayList<>();//多线程 10个线程//int threadNum 10;int listSize 300;List<List<PackageAgreementDto>> splitData Lists.partition(packageAgre…...

Centos安装Docker
Centos安装 Docker 从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。 Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。 本文介绍 Docker CE 的安装使用。 移除旧的版本&#x…...
Unity启动项目无反应的解决
文章首发见博客:https://mwhls.top/4803.html。 无图/格式错误/后续更新请见首发页。 更多更新请到mwhls.top查看 欢迎留言提问或批评建议,私信不回。 摘要:通过退还并重新载入许可证以解决Unity项目启动无反应问题。 场景 Unity Hub启动项目…...
2.3 opensbi: riscv: opensbi源码解析
文章目录 3. sbi_init()函数4. init_coldboot()函数4.1 sbi_scratch_init()函数4.2 sbi_domain_init()函数4.3 sbi_scratch_alloc_offset()函数4.4 sbi_hsm_init()函数4.5 sbi_platform_early_init()函数3. sbi_init()函数 函数位置:lib/sbi/sbi_init.c函数参数:scratch为每个…...

点破ResNet残差网络的精髓
卷积神经网络在实际训练过程中,不可避免会遇到一个问题:随着网络层数的增加,模型会发生退化。 换句话说,并不是网络层数越多越好,为什么会这样? 不是说网络越深,提取的特征越多ÿ…...

Ubuntu服务器service版本初始化
下载 下载路径 官网:https://cn.ubuntu.com/ 下载路径:https://cn.ubuntu.com/download 服务器:https://cn.ubuntu.com/download/server/step1 点击下载(22.04.3):https://cn.ubuntu.com/download/server…...

re学习(33)攻防世界-secret-galaxy-300(脑洞题)
下载压缩包: 下载链接:https://adworld.xctf.org.cn/challenges/list 参考文章:攻防世界逆向高手题之secret-galaxy-300_沐一 林的博客-CSDN博客 发现这只是三个同一类型文件的三个不同版本而已,一个windows32位exe࿰…...

Mybatis Plus中使用LambdaQueryWrapper进行分页以及模糊查询对比传统XML方式进行分页
传统的XML分页以及模糊查询操作 传统的XML方式只能使用limit以及offset进行分页,通过判断name和bindState是否为空,不为空则拼接条件。 List<SanitationCompanyStaff> getSanitationStaffInfo(Param("name") String name,Param("bi…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...