初探PoolManager插件

2015年08月04日 11:56 0 点赞 0 评论 更新于 2025-11-21 14:11

本文主要聚焦于PoolManager插件的使用,旨在解决Unity游戏的卡顿问题。

缓存池的关键操作

在使用缓存池时,我们主要关注以下几个方面:

  1. 如何将游戏对象保存到缓存池中。
  2. 怎样从缓存池中取出游戏对象。
  3. 如何智能删除缓存池。

而PoolManager插件恰好满足了这些需求。接下来,我们将详细介绍其使用方法和相关参数。

配置Spawn Pool脚本

首先,创建一个空的GameObject,然后将Spawn Pool脚本挂载到该对象上。Spawn Pool脚本有一系列重要的参数,下面为你详细解释:

  • PoolName:缓存池的唯一名称,用于标识不同的缓存池。
  • MatchPoolScale:勾选此选项后,实例化的游戏对象的缩放比例将统一为1;若不勾选,则使用Prefab的默认缩放比例。
  • MachPool Layer:勾选后,实例化的游戏对象的Layer将采用Prefab的默认设置。
  • Don’t Reparent:勾选此选项后,实例化的对象将没有父节点,会处于最上层。一般不建议勾选该选项。
  • Don’t Destroy On Load:表示在切换场景时,缓存池中的对象不会被释放。
  • Pre - Prefab Pool Options:这是一个缓存池列表,可用于存放各种类型的Prefab。点击右边的“+”按钮,即可添加不同类型的Prefab。后续会介绍如何通过脚本动态添加。
  • prefab:可以直接将工程里的Prefab拖入该字段。
  • preloadAmount:该Prefab在缓存池中的最大保存数量。
  • preloadTime:若选择此选项,表示缓存池中的所有GameObject可以“异步”加载。
  • preloadFrames:每几帧加载一个GameObject。
  • preloadDelay:延迟一段时间后开始加载。
  • limitInstance:是否开启实例的限制功能。
  • limit Amount:限制缓存池中该Prefab的最大数量。若同时开启此选项和preloadAmount,将以limitAmount为准。
  • limitFIFO:当限制缓存池中只能有10个Prefab时,若不勾选此选项,取第11个对象时将返回null;若勾选,取第11个对象时会返回前10个中最不常用的那个。
  • cullDespawend:是否开启缓存池智能自动清理模式。
  • cull Above:在缓存池自动清理时,始终保留指定数量的对象不被清理。
  • cull Delay:每隔指定的时间(单位:秒)执行一次自动清理操作。
  • cullMaxPerPass:每次自动清理的游戏对象数量。

这里所说的自动清理,是指当池子中的对象处于setActive(false)状态(即当前未使用)时,PoolManager会根据上述参数自动调用Destroy()方法清理这些对象。

动态初始化内存池

前面介绍的是在游戏运行前提前初始化已知游戏对象的方法,但在实际游戏中,我们常常需要动态载入一些无法提前预知的游戏对象。因此,建议在脚本中完成内存池的初始化操作。

具体步骤如下:在Hierarchy视图中创建一个PoolManager对象,并挂载SpawnPool脚本,将其标记为Don’tDestroyOnLoad状态。

通过脚本动态添加内容到内存池

以下是通过脚本动态操作内存池的示例代码:

using UnityEngine;
using System.Collections;
using PathologicalGames;

public class NewBehaviourScript : MonoBehaviour
{
SpawnPool spawnPool;
PrefabPool refabPool;

void Start()
{
spawnPool = PoolManager.Pools["Shapes"];
refabPool = new PrefabPool(Resources.Load<Transform>("momo"));
}

void OnGUI()
{
if (GUILayout.Button("初始化内存池"))
{
if (!spawnPool._perPrefabPoolOptions.Contains(refabPool))
{
refabPool = new PrefabPool(Resources.Load<Transform>("momo"));
// 默认初始化两个Prefab
refabPool.preloadAmount = 2;
// 开启限制
refabPool.limitInstances = true;
// 关闭无限取Prefab
refabPool.limitFIFO = false;
// 限制池子里最大的Prefab数量
refabPool.limitAmount = 5;
// 开启自动清理池子
refabPool.cullDespawned = true;
// 最终保留
refabPool.cullAbove = 10;
// 多久清理一次
refabPool.cullDelay = 5;
// 每次清理几个
refabPool.cullMaxPerPass = 5;
// 初始化内存池
spawnPool._perPrefabPoolOptions.Add(refabPool);
spawnPool.CreatePrefabPool(spawnPool._perPrefabPoolOptions[spawnPool._perPrefabPoolOptions.Count - 1]);
}
}

if (GUILayout.Button("从内存池里面取对象"))
{
// 从内存池里面取一个GameObject
Transform momo = spawnPool.Spawn("momo");
}

if (GUILayout.Button("清空内存池"))
{
// 清空池子
spawnPool.DespawnAll();
}
}
}

其他内存池操作方法

  • spawnPool.Despawn():可单独从池子中清空某一个Prefab。
  • spawnPool.Insert():可以将对象插入到池子中的指定序列位置。

通过以上介绍,你可以全面了解PoolManager插件的使用方法,包括静态配置和动态脚本操作,从而更好地利用缓存池解决Unity游戏的卡顿问题。

作者信息

洞悉

洞悉

共发布了 3994 篇文章