一段泛型动态对象池的定义
来源:互联网 发布:淘宝手机壳评价 编辑:程序博客网 时间:2024/06/03 17:41
这个对象池的定义来源于unity asset store 中的HTC VIVE INPUT插件
泛型动态对象池。
此对象池保存对象的容器是一个泛型栈。这个栈中保存的是没被使用的对象,当外界需要一个新对象时,就从此栈中弹出一个对象以供使用。当对象使用完毕后,此对象将会被压入栈。 对象池还有三个委托类型的变量,分别用于新建一个对象、获取一个对象和释放一个对象。新建一个泛型对象池时需要给构造函数传入这三个变量的值。以unity中的一个简单的生成子弹为例:当玩家按下发射键需要显示出一个子弹时,需要调用获取一个对象这个委托,此处即是本对象池中的 Get方法,此方法先检查栈中是否有未使用的对象实例,有则弹出栈顶对象,无则新建一个对象并压入栈。当获取到一个子弹后,可能需要对这个子弹实例进行一些处理,比如初始化位置、激活它等,这就可以用actionOnGet来执行。当使用玩对象后需要销毁,比如子弹过一段时间后消失,那么 就把这个子弹实例的使用权释放掉,让子弹消失时可能需要执行一些操作,比如爆炸、隐藏等操作,就需要调用Release方法,该方法调用actionOnRelease来执行具体的操作。
namespace HTC.UnityPlugin.Utility{ public class ObjectPool<T> { private readonly Stack<T> stack = new Stack<T>(); private readonly Func<T> actionOnNew; private readonly UnityAction<T> actionOnGet; private readonly UnityAction<T> actionOnRelease; public int CountAll { get; private set; } public int CountInactive { get { return stack.Count; } } public int CountActive { get { return CountAll - CountInactive; } } public ObjectPool(Func<T> onNew, UnityAction<T> onGet = null, UnityAction<T> onRelease = null) { actionOnNew = onNew; actionOnGet = onGet; actionOnRelease = onRelease; } //从对象池中获取一个对象实例 public T Get() { T element; if (stack.Count == 0) { element = actionOnNew == null ? default(T) : actionOnNew.Invoke(); CountAll++; } else { element = stack.Pop(); } if (actionOnGet != null) { actionOnGet.Invoke(element); } return element; } public void Release(T element) { if (stack.Count > 0 && ReferenceEquals(stack.Peek(), element)) { Debug.LogError("Internal error. Trying to destroy object that is already released to pool."); } if (actionOnRelease != null) { actionOnRelease.Invoke(element); } stack.Push(element); if (stack.Count > CountAll) { CountAll = stack.Count; } } }}
1 0
- 一段泛型动态对象池的定义
- 一段用java反射动态构建对象的代码
- javaScript动态原型的方式定义对象
- 一段宏定义的代码
- 一段拖动对象的代码
- 一段拖动对象的代码
- vector对象的定义和初始化 动态增长
- 一段动态滚动公告栏的js代码
- 保存一段ASP动态包含的代码
- 一段不错的代码,动态效果
- 写的一段拖动对象的代码
- JavaScript中定义对象的方式,动态添加属性和动态删除属性!
- 动态数组的定义
- 一段关于对象引用的形象解释
- 一段js面向对象的写法
- 一段观察者对象(MutationObserver)的使用
- 如何动态定义一个 对象指针数组
- javascript (对象定义)动态原型模式
- 简化激活Tensorflow环境的方法
- C#调用EasyPusher推送到EasyDarwin流媒体服务器直播方案及示例代码整理
- shiro的认证思路分析(即登录,流程)
- 博客搬迁说明
- poj 2378 树形dp求树的割点
- 一段泛型动态对象池的定义
- nyoj61 传纸条(一) dp
- css3
- SecureCRT 7.3.破解版下载地址(亲测可用)
- 深入理解Java内存模型(一)——基础
- JSON学习
- 网游开发目录结构
- 欢迎使用CSDN-markdown编辑器
- 学习笔记--车牌识别(一)