当前位置: 首页 > news >正文

河北建设工程信息网网址dz论坛seo

河北建设工程信息网网址,dz论坛seo,怎么看behance和其他设计网站,免费下载建设银行官方网站Unity C# 引用池 ReferencePool 1.目的 对于多次创建的数据使用new 关键字是十分消耗性能的,使用完成后由GC去自动释放,当一个类型的数据频繁创建可以使用引用池进行管理。 2.实现 项目目录 IReference 接口 要放入引用池的数据只需要继承这个接口…

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.总结

重复使用的对象只创建有限次,避免来回实例化对象的开销

http://www.hkea.cn/news/533789/

相关文章:

  • 敦煌网站做外贸怎样网页推广怎么做的
  • 南京网站建设优化今日头条普通版
  • 网站编辑的工作职能有哪些活动营销案例100例
  • 小程序招商加盟平台我是seo关键词
  • wordpress 发帖机镇江抖音seo
  • 网站建设的小结可以发外链的论坛有哪些
  • 网站正常打开速度网店营销与推广策划方案
  • 义乌 网站制作进入百度app
  • 做外围网站赌球红树林seo基础入门免费教程
  • 绿色风格网站seo排名赚钱
  • 南宁企业免费建站百度推广营销怎么做
  • 建立个人网站的成本短视频seo营销系统
  • 深圳公司名称大全网站结构优化的内容和方法
  • 安康市代驾公司上海网站关键词排名优化报价
  • 怎么在网站上建设投票统计在线培训系统app
  • 泰州网站建设哪家好网站seo的主要优化内容
  • 洛卡博网站谁做的seo权重查询
  • 东莞网络科技公司有哪些山东网站seo
  • 网站建设需要学什么网站模板购买
  • 用html做的游戏网站关键词推广效果分析
  • 做影视网站引流正规推广平台有哪些
  • 免费下载简历模板北京seo排名厂家
  • 西昌市做网站的百度搜索排名靠前
  • 办公室装修实景拍摄图重庆seo俱乐部联系方式
  • 网站建设阶段推广计划书怎么写
  • 代做毕业设计网站现成注册网站平台
  • 电商网站开发工作计划企业网络营销策划
  • 用wps网站栏目做树形结构图网页设计代码案例
  • 多媒体网站设计开发是指什么每日关键词搜索排行
  • 网站 seo正规网络公司关键词排名优化