初探PoolManager插件
本文主要聚焦于PoolManager插件的使用,旨在解决Unity游戏的卡顿问题。
缓存池的关键操作
在使用缓存池时,我们主要关注以下几个方面:
- 如何将游戏对象保存到缓存池中。
- 怎样从缓存池中取出游戏对象。
- 如何智能删除缓存池。
而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游戏的卡顿问题。