[开发者心得] 对象池其实不难懂

[复制链接]
1035 |0
浅巷 发表于 2023-12-25 18:40:15 | 显示全部楼层 |阅读模式

本帖最后由 浅巷 于 2023-12-25 18:55 编辑

 什么是对象池?

  想象一下,你有一个玩具盒子,里面放着一些玩具。每次你需要玩具时,就从盒子里拿一个,玩完后再放回去。这样,你就不用每次都买新玩具了。对象池就像这个盒子,但里面放的是程序里的“对象”,而不是玩具。

 为什么要用对象池?

  1. 节省资源:创建和销毁对象像买和扔玩具,会浪费时间和资源。使用对象池,就像重复使用玩具,更有效率。
  2. 减少垃圾:在编程中,频繁创建和销毁对象会产生很多“垃圾”,影响程序运行。对象池帮助减少这种垃圾。
  3. 提高速度:从对象池拿一个现成的对象,比新建一个快多了。

 核心概念:

  • 池化对象:对象池管理的对象,通常是重量级对象,其创建和销毁成本较高。
  • :一个容器,用于存储可重用的对象。

 对象池是怎么工作的?

  1. 找对象:需要一个对象时,先从池中查找是否有可用的对象。
  2. 用对象:找到后,就像拿玩具出来玩一样,用这个对象做需要的事。
  3. 放回对象:用完后,不是丢掉,而是放回池子,以便下次再用。

在口袋方舟编辑器里可以通过 ObjPool 来实现。ObjPool<T> | API

 对象池回收时执行的操作:

  1. 清理状态:将对象恢复到初始状态,确保不会对下一次使用产生影响。
  2. 返回池中:将对象放回对象池,等待下次重用。

 对象池是否能回收物体?

  对象池通常能够回收那些它创建或管理的对象。有时候,如果对象“坏了”(状态不对),或者还有别的程序在用(外部引用),就不能放回池子了。所以如果池子满了,也放不进去:

  1. 对象状态不匹配:如果对象在使用后未正确重置,可能不适合重用。
  2. 外部引用:如果对象仍被外部代码引用,可能无法返回到池中。
  3. 池容量限制:对象池可能有最大容量限制,超过限制的对象可能无法回收。

 对象池是否能克隆现有对象?

  通常不会。对象池的设计通常是为了重用相同类型的对象,而不是克隆对象(制造新的复制品)。就像玩具盒子里不会突然多出新玩具一样。  

  所以对象池就像是一个用于存放和重复使用程序中工具(对象)的盒子。对象池主要用于重用对象,以提高性能和减少内存消耗。它通过池化对象来实现这一目的,但通常不涉及对象的克隆。如果对象无法被回收,可能是因为对象状态不适合重用、外部引用未释放,或超出了池的容量限制。

更多关于在口袋方舟中开发游戏时如何使用 ObjPool 的信息可以访问官方 API 网站 ObjPool<T> | API

里面通过 DEMO 详细介绍了如何使用口袋方舟中封装好的通用对象池 API。

回复

使用道具 举报

热门版块
快速回复 返回顶部 返回列表