首页 > 其他分享 >Unity游戏框架设计之缓存池管理器

Unity游戏框架设计之缓存池管理器

时间:2024-04-30 16:46:09浏览次数:26  
标签:缓存 cachePoolName 对象 return instance Unity cachePoolSet 管理器

Unity游戏框架设计之缓存池管理器

简单介绍

在游戏运行的过程中,我们可能遇到这样的需求,即创建大量相同类型的敌人。在传统方法中,我们将对每一个敌人都重新创建,但这样是效率低且占据内存的。

为此我们可以这样做,所有敌人在创建时,都从敌人缓存池中取出敌人对象,当敌人死亡时,则将敌人放回到缓存池中。这样我们可以实现对敌人对象的复用,而不是频繁的创建和销毁敌人对象。

因此,我们可以基于享元模式,开发缓存池管理器来实现上述需求。缓存池管理器为所有相同类型的对象都创建一个缓存池,如果需要在游戏中创建对象,则从缓存池中取出对象,如果需要销毁一个对象,则将对象放回到缓存池中。利用缓存池管理器,我们避免频繁进行对象的创建和销毁,从而提高执行效率并降低内存占用。

代码设计

public class CachePoolManager : SingletonMono<CachePoolManager>
{
    private readonly Dictionary<string, ObjectPool<GameObject>> _cachePoolSet = new();
    private static int _defaultMaxCapacity;

    public static void Initialize(int defaultMaxCapacity)
    {
        _defaultMaxCapacity = defaultMaxCapacity;
    }

    public void AddCachePool(string cachePoolName, GameObject asset, Transform father, int maxCapacity = default)
    {
        if (maxCapacity == default)
        {
            maxCapacity = _defaultMaxCapacity;
        }
        if (_cachePoolSet.ContainsKey(cachePoolName))
        {
            return;
        }
        _cachePoolSet.Add(cachePoolName, new(() => Instantiate(asset, father),
            OnGetInstance, OnReleaseInstance, OnDestroyInstance, false, maxCapacity, maxCapacity)
        );
    }

    public void RemoveCachePool(string cachePoolName)
    {
        if (!_cachePoolSet.ContainsKey(cachePoolName))
        {
            return;
        }
        _cachePoolSet[cachePoolName].Clear();
        _cachePoolSet.Remove(cachePoolName);
    }

    public bool ContainsCachePool(string cachePoolName)
    {
        return _cachePoolSet.ContainsKey(cachePoolName);
    }

    public GameObject GetInstance(string cachePoolName)
    {
        if (!_cachePoolSet.ContainsKey(cachePoolName))
        {
            return default;
        }
        return _cachePoolSet[cachePoolName].Get();
    }

    public void PutInstance(string cachePoolName, GameObject instance)
    {
        if (!_cachePoolSet.ContainsKey(cachePoolName))
        {
            return;
        }
        _cachePoolSet[cachePoolName].Release(instance);
    }

    private void OnGetInstance(GameObject instance)
    {
        if (instance == null)
        {
            return;
        }
        instance.SetActive(true);
    }

    private void OnReleaseInstance(GameObject instance)
    {
        if (instance == null)
        {
            return;
        }
        instance.SetActive(false);
    }

    private void OnDestroyInstance(GameObject instance)
    {
        Destroy(instance);
    }
}

代码说明

(一)基于 Unity 官方 API ObjectPool 实现。

(二)实现缓存池的创建、删除、查询操作,以及从缓存池中获取实例和放回实例的操作。

(三)每次从缓存池中获取对象时,都必须重置当前对象。比如,从缓存池中获取游戏对象后,如果需要为游戏对象添加脚本,则必须先判断脚本是否存在,如果存在则先删除此脚本,然后才重新添加脚本。

(四)每次场景被销毁后,都必须删除在当前场景创建的所有缓存池。防止下次重新进入此场景,从缓存池中取出游戏对象时发生空指针异常问题。发生的原因是,从缓存池中获取的游戏对象属于上一次被销毁的场景中的游戏对象。

后记

由于个人能力有限,文中不免存在疏漏之处,恳求大家斧正,一起交流,共同进步。

标签:缓存,cachePoolName,对象,return,instance,Unity,cachePoolSet,管理器
From: https://www.cnblogs.com/kkelin/p/18168289

相关文章

  • 密码管理器---KaPass v1.0.3
    伴随的网龄的增加,密码也随之增加,简单的密又怕不安全,复杂的密码怕记不住。就是在这样的情况下,KaPass密码管理器应运而生。一个密码管理器---KaPass,简洁的界面,功能齐全,一起了解一下KaPass: 1、登陆窗口2、主界面3、新增群组,可自定义群组图标4、新增密码,可以储存各式各样......
  • 同源页面监听缓存改变页面
    onActivated(()=>{this.searchRecordList.value=localStorage.getItem('searchRecord')?JSON.parse(localStorage.getItem('searchRecord')asstring):[];this.getList();window.addEventListener('storage&#......
  • 当Surveymonkey报错Request Header Fields Too Large时需要清理Edge浏览器缓存
     第一步:点击浏览器左上角的...第二步:依次进入Cookie和网站权限---管理和删除Cookie和站点数据。第三步:点击查看所有Cookie和站点数据。第四步:点击全部删除。第五步:清除站点Cooke数据。......
  • Unity游戏框架设计之音频管理器
    Unity游戏框架设计之音频管理器简单介绍在游戏中,主要的音频分为两种类型。第一种类型是BGM(背景音乐),第二种类型是音效。BGM的特点是音频持续时间长,一般在游戏中的同一时间内只能播放一个BGM。音效的特点是音频持续时间短,一般在游戏中的同一时间内允许同时播放多个音效。在下......
  • Unity性能分析(一)流程与工具的使用
    性能分析工作流对于游戏开发是“必备”的,从基本的三方面开始:在修改之前分析:建立基准线在开发过程中分析:确保修改不会影响性能在修改后分析:证明修改产生了预期效果分析工具是开发者的实用工具之一,可以帮助开发者定位代码中的内存问题和性能瓶颈,也能帮助了解Unity引擎底层的运......
  • Unity性能分析(二)CPU/GPU分析
    设置每帧时间预算帧率(fps)并不是衡量游戏稳定体验的理想指标。考虑以下情况:在运行时的前0.75s内渲染了59帧。然后接下来的1帧需要0.25s才能渲染完毕。虽然是60fps,但实际上会让玩家感觉卡顿。这是需要设置帧时间预算的重要原因之一。这为您提供了一个目标,在对游戏进行分析和优化时......
  • Unity性能分析(三)内存分析
    Unity中有两种分析内存的方法:MemoryProfiler:内置的分析器,提供内存使用的基本信息。MemoryProfilerpackage:将package添加到项目中,更详细地分析内存使用情况。可以存储和比较快照查找内存泄漏,查看内存布局以查找内存碎片问题。确定物理RAM限制每个目标平台都有一个内存限......
  • Unity性能分析(四)Unity性能分析工具使用
    使用Profiler按照以下步骤开始使用UnityProfiler:在进行分析时,必须使用开发版本。File>BuildSettings>DevelopmentBuild。勾选AutoconnectProfile(可选)。注意:AutoconnectProfile会增加初始启动时间。如果不启用AutoconnectProfiler,可以随时手动连接正在运行的开发版......
  • Unity游戏框架设计之场景管理器
    Unity游戏框架设计之场景管理器简单介绍在游戏开发过程中,我们经常对Scene进行切换。为了不使场景切换时造成的游戏卡顿,可以Unity官方API利用协程的方式异步加载场景。同时,为提升Scene切换的玩家体验,我们经常会在场景切换的开始,先显示过渡UI,然后才对目标场景进行加载......
  • Mybatis二级缓存使用
     一、应用场景例如首页数据加载很慢,但是首页相关数据变动很小。即可以使用二级缓存 二、此处以springboot项目为例在yml配置文件新增 三、查询数据的类对象需要序列化不然会报错 四、在对应的xml文件中加入</cache>开启二级缓存 ......