SRPG游戏开发(二十)第六章 基本框架 - 五 对象池(Object Pools)

本文介绍了SRPG游戏开发中的对象池技术,用于减少系统开销。主要内容包括对象池的设计原理、InstanceCollection和ObjectPool类的实现,以及对象池管理器PoolManager的功能。详细讨论了如何生成、再利用和回收对象,以及对象池在游戏中的应用策略。
摘要由CSDN通过智能技术生成

返回总目录

第六章 基本框架(Framework)



五 对象池(Object Pools)

对象池一般是减少系统开销的一种手段,包括创建、再利用与回收。

我们的对象池也同样是这样的,对象池也有多种回收方式。

比如,将GameObjectactiveSelf设置成false

再比如,将Layer设置成不渲染的层。

还比如,将transform.position移动到足够远,从而不显示。

等等,诸如此类多种方式。各有利弊,我们制作的游戏并没有那么多开销,需求的功能也不是特别多。

所以我们只使用最基本的activeSelf设置成false的方式。

只是,我把Instance都放在了一个自建的类InstanceCollection并继承了IList里,而创建Instance由它来管理。

我们来说说主要属性与逻辑。其它属性或方法,等上传源代码后,可以去下载源代码查看。


1 InstanceCollection

关于InstanceCollection,我们主要说一下创建Instance。

首先它需要一个Prefab,来告知到底生成的是谁的实例。

然后既然是个集合,至少应该能保存Instance的属性。这里把回收的Instance单独建立一个List

            [SerializeField, Tooltip("The prefab.")]
            private GameObject m_Prefab;
            private List<GameObject> m_Instances;

            /// <summary>
            /// 回收的Instances
            /// </summary>
            private List<GameObject> m_RecycledInstances;

我们从Pool中取得实例,而集合中存在可再利用的话,就不应该创建的,不存在才创建。

所以在创建方法中应该加以判断。

            /// <summary>
            /// 获取未使用Instance,如果没有,则创建一个Instance
            /// </summary>
            /// <returns></returns>
            internal GameObject GetOrCreateRecycledInstance()
            {
                GameObject instance;
                if (recycledCount > 0)
                {
                    instance = m_RecycledInstances[recycledCount - 1];
                    m_RecycledInstances.RemoveAt(recycledCount - 1);
                }
                else
                {
                    instance = GameObject.Instantiate(prefab);
                    RenameInstance(instance);
                    m_Instances.Add(instance);

                    ReusableObject reusable = GetOrAddReusableObject(instance);
                    reusable.isFromPool = true;
                    reusable.onDestroyed = ReusableObject_onDestroyed;
                    reusable.onDespawn = ReusableObject_onDespawn;

                    if (reparentOnCreated)
                    {
                        instance.transform.SetParent(m_Pool.transform, false);
                    }
                }

                return instance;
            }

其中,你会看到,我在生成Instance时,为它添加了一个脚本组建ReusableObject

它的作用是,标识我们的Instance是不是从Pool生成,还决定着,是否触发IReusableComponent接口的回调。

IReusableComponent里面有两个方法。分别在再利用和回收时触发。

namespace DR.Book.SRPG_Dev.Framework
{
    pu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值