对象池适用于:

  • 对象的创建很耗时
  • 对象频繁地释放再创建

对象池的实现:将释放的对象放进对象池中,在新建对象时,从对象池取对象

  1. public class ObjectPool<T> where T : class, new()
  2. {
  3. private Stack<T> m_objectStack = new Stack<T>();
  4.  
  5. public T New()
  6. {
  7. return (m_objectStack.Count == ) ? new T() : m_objectStack.Pop();
  8. }
  9.  
  10. public void Store(T t)
  11. {
  12. m_objectStack.Push(t);
  13. }
  14. }

改进第一步:对象被重新使用前,reset所有的成员变量。

  1. public class ObjectPool<T> where T : class, new()
  2. {
  3. private Stack<T> m_objectStack;
  4.  
  5. private Action<T> m_resetAction; //indicate whether need reset
  6. private Action<T> m_onetimeInitAction; //indicate whether need initialize
  7.  
  8. public ObjectPool(int initialBufferSize, Action<T>
  9. ResetAction = null, Action<T> OnetimeInitAction = null)
  10. {
  11. m_objectStack = new Stack<T>(initialBufferSize);
  12. m_resetAction = ResetAction;
  13. m_onetimeInitAction = OnetimeInitAction;
  14. }
  15.  
  16. public T New()
  17. {
  18. if (m_objectStack.Count > )
  19. {
  20. T t = m_objectStack.Pop();
  21.  
  22. if (m_resetAction != null)
  23. m_resetAction(t);
  24.  
  25. return t;
  26. }
  27. else
  28. {
  29. T t = new T();
  30.  
  31. if (m_onetimeInitAction != null)
  32. m_onetimeInitAction(t);
  33.  
  34. return t;
  35. }
  36. }
  37.  
  38. public void Store(T obj)
  39. {
  40. m_objectStack.Push(obj);
  41. }
  42. }

参数T被指明为”where T:class,new()”,意味着有两个限制。首先,T必须为一个类(毕竟,只有引用类型需要被obejct-pool);其次,它必须要有一个无参构造函数。

以下是池的使用方法:

  1. class SomeClass : MonoBehaviour
  2. {
  3. private ObjectPool<List<Vector3>> m_poolOfListOfVector3 =
  4. //32为假设的最大数量
  5. new ObjectPool<List<Vector3>>(,
  6. (list) => {
  7. list.Clear();
  8. },
  9. (list) => {
  10. //初始化容量为1024
  11. list.Capacity = ;
  12. });
  13.  
  14. void Update()
  15. {
  16. List<Vector3> listVector3 = m_poolOfListOfVector3.New();
  17.  
  18. // do stuff
  19.  
  20. m_poolOfListOfVector3.Store(listVector3);
  21. }
  22. }

改进第二步:允许一次性回收所有已经池化的对象

  1. public class ObjectPoolWithCollectiveReset<T> where T : class, new()
  2. {
  3. private List<T> m_objectList; //Stack<T>被List<T>代替,可以跟踪最近创建或释放的对象在list中索引
  4. private int m_nextAvailableIndex = ;
  5.  
  6. private Action<T> m_resetAction;
  7. private Action<T> m_onetimeInitAction;
  8.  
  9. public ObjectPoolWithCollectiveReset(int initialBufferSize, Action<T>
  10. ResetAction = null, Action<T> OnetimeInitAction = null)
  11. {
  12. m_objectList = new List<T>(initialBufferSize);
  13. m_resetAction = ResetAction;
  14. m_onetimeInitAction = OnetimeInitAction;
  15. }
  16.  
  17. public T New()
  18. {
  19. if (m_nextAvailableIndex < m_objectList.Count)
  20. {
  21. // an allocated object is already available; just reset it
  22. T t = m_objectList[m_nextAvailableIndex];
  23. m_nextAvailableIndex++;
  24.  
  25. if (m_resetAction != null)
  26. m_resetAction(t);
  27.  
  28. return t;
  29. }
  30. else
  31. {
  32. // no allocated object is available
  33. T t = new T();
  34. m_objectList.Add(t);
  35. m_nextAvailableIndex++;
  36.  
  37. if (m_onetimeInitAction != null)
  38. m_onetimeInitAction(t);
  39.  
  40. return t;
  41. }
  42. }
  43.  
  44. public void ResetAll() //原本的store()
  45. {
  46. //重置索引
  47. m_nextAvailableIndex = ;
  48. }
  49. }

局限:显然,当我们需要一个其它类型的对象池时就需要重新申明一个。或许我们可以实现一个对用户透明。创建管理所有类型池的ObjectPool。

对象池 object pool的更多相关文章

  1. [译]Unity3D内存管理——对象池(Object Pool)

    原文地址:C# Memory Management for Unity Developers (part 3 of 3), 其实从原文标题可以看出,这是一系列文章中的第三篇,前两篇讲解了从C#语言本身 ...

  2. go语言学习--go的临时对象池--sync.Pool

    一个sync.Pool对象就是一组临时对象的集合.Pool是协程安全的. Pool用于存储那些被分配了但是没有被使用,而未来可能会使用的值,以减小垃圾回收的压力.一个比较好的例子是fmt包,fmt包总 ...

  3. go的临时对象池--sync.Pool

    作者:bigtom链接:https://www.jianshu.com/p/2bd41a8f2254來源:简书   一个sync.Pool对象就是一组临时对象的集合.Pool是协程安全的. Pool用 ...

  4. Golang 临时对象池 sync.Pool

    Go 1.3 的sync包中加入一个新特性:Pool.官方文档可以看这里http://golang.org/pkg/sync/#Pool 这个类设计的目的是用来保存和复用临时对象,以减少内存分配,降低 ...

  5. Phaser3 对象池随机产生炸弹并销毁

    效果图 对象池 Object Pool scene.js /// <reference path="../../libs/phaser/phaser.min.js"/> ...

  6. Unity性能优化-对象池

    1.对象池Object Pool的原理: 有些GameObject是在游戏中需要频繁生成并销毁的(比如射击游戏中的子弹),以前的常规做法是:Instantiate不断生成预设件Prefab,然后采用碰 ...

  7. Unity对象池的实现

    对象池是一个单例类: using System.Collections; using System.Collections.Generic; using UnityEngine; public cla ...

  8. Java对象池技术的原理及其实现

    看到一片有关于java 对象基础知识,故转载一下,同时学习一下. 摘 要 本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式.还指出了使用对象池技术时所应注意的问题. 关键词 对象池 ...

  9. 【JVM】Java 8 中的常量池、字符串池、包装类对象池

    1 - 引言 2 - 常量池 2.1 你真的懂 Java的“字面量”和“常量”吗? 2.2 常量和静态/运行时常量池有什么关系?什么是常量池? 2.3 字节码下的常量池以及常量池的加载机制 2.4 是 ...

随机推荐

  1. [转]清除服务器IIS缓存的常用方法

    转自:http://www.rrzzw.com/jishu/IIS/39.html 转自:http://cqujsjcyj.iteye.com/blog/736624 使用IIS来开虚拟主机空间架设网 ...

  2. Mysql-binlog的移动和归档

    #!/bin/bash # To backup and archive binlogs. declare -i NUM=0 declare -i SUM=0 SUM=`/bin/ls -l mysql ...

  3. java 使用jxl poi 操作excel

    java操作excel  创建.修改 xls 文件 JAVA操作Excel文件 Java生成和操作Excel文件 java导出Excel通用方法 Java 实现导出excel表 POI Java PO ...

  4. 关于clearfix和clear的讨论

    本文摘自百度文库 还是提到了一个关于网页制作很古老的问题,浮动的清除. 虽然看过一些资料介绍说能不用浮动就尽量不要用,但对定位不是很熟的我来说,浮动就不能不用了:既然惹上这个麻烦,就得想个办法进行解决 ...

  5. centos7 设置系统时间与网络同步

    1.安装ntpdate工具 yum -y install ntp ntpdate 2.设置系统时间与网络时间同步 ntpdate cn.pool.ntp.org 3.将系统时间写入硬件时间 hwclo ...

  6. [datatable]关于在DataTable中执行DataTable.Select("条件")返回DataTable的解决方法

    -- :09关于在DataTable中执行DataTable.Select("条件")返回DataTable的解决方法 在实际编程工程中,常常遇到这样的情况:DataTable并不 ...

  7. Install hadoop on windows(non-virtual machine, such cygwin)

    DownloadBefore starting make sure you have this two softwares Hadoop 2.7.1 Java – Jdk 1.7+ Extract d ...

  8. Django中间件执行流程

    中间件函数是 django 框架为我们预留的函数接口, 让我们可以干预请求和应答的过程 1. 获取浏览器端的IP地址: 使用 request.META[‘REMOTE_ADDR’] 2. 使用中间件 ...

  9. python 9*9示例

    # 9*9 乘法表# def nine_nine():#     for i in range(1, 10):#         for j in range(1, i+1):#            ...

  10. sqlserver操作命令

    启动命令:Net Start MSSqlServer 暂停命令:Net Pause MSSqlServer 重新启动暂停的命令:Net Continue MSSqlServer 停止命令:Net st ...