对象池其他API
其他API我们给Object Pool Manager添加其他的API
是否正在加载123456789/// <summary>/// 是否正在异步加载/// </summary>/// <param name="guid"></param>public bool IsAsyncLoading(long guid){ return m_AsyncResObjs[guid] != null;}
此对象是否由对象池创建12345678910/// <summary>/// 该对象是否是由对象池创建的/// </summary>/// <returns></returns>public bool IsPoolManagerCreat(GameObject obj){ ResourceObj resObj = m_ResourceObjDic[obj.GetInstanceID()]; return resObj == null ...
对象池预加载及取消异步加载
预加载在ObjectPoolManager添加API
1234567891011121314151617181920212223/// <summary>/// 预加载GameObject/// </summary>/// <param name="path">路径</param>/// <param name="count">预加载个数</param>/// <param name="clear">跳场景是否清除</param>public void PreloadGameObject(string path,int count = 1,bool clear = false){ List<GameObject> tempGameObjectList = new List<GameObject>(count); for (int i = 0; i < count; i++) ...
对象池异步加载
ObjectPoolManager增加异步加载APIResourceObj类增加用于异步回调的参数12345678910111213141516171819202122public class ResourceObj{ //... //--------------------------------------------- //是否放到场景节点下 public bool m_SetSceneParent = false; //实例化资源完成的回调 public OnAsyncObjFinish m_DealFinish = null; //异步参数 public object m_Param1, m_Param2, m_Param3; public void Reset() { //... m_SetSceneParent = false; m_DealFinish = null; m_Param1 = null; m_Param2 = ...
对象池同步加载
ObjectPoolManager功能
同步加载
异步加载
预加载
取消异步加载
基于离线数据的回收处理
ObjectPoolManager管理的资源和ResouceManager不一样,它的资源都是实例化(Clone)出来的,在游戏里真正显示的。
对象池同步加载中间类ResouceObj123456789101112131415161718192021222324252627282930313233public class ResourceObj{ public uint m_Crc = 0; /// <summary> /// 对应的ResouceItem引用 /// </summary> public ResourceItem m_ResItem = null; /// <summary> /// 实例化(Clone)出来的GameObject /// </summary> public GameObject m_CloneObj = null; /// < ...
资源池清空及预加载
清空缓存链表如果我们有一个资源,第一次Release它时我们让它缓存在m_NoReferenceAssetMapList链表中,第二次Release时我们让它彻底清除,这时这个资源ResourceItem对应的Obj引用和AssetBundle引用都会清除,但是ResorceItem本身还是被缓存在m_NoReferenceAssetMapList链表中,我们需要添加清空缓存链表的方法。
首先给ResourceItem添加是否Clear的变量:
12345678910/// <summary>/// 用来读取AB配置信息和引用AB,还用来记录AB内部资源的引用信息/// </summary>public class ResourceItem{ //... //是否清除(跳场景时清除) public bool m_Clear = true;//++++++++++++++++++++++++++++++++++++++++ //...}
修改DestroyResourceItem方法,之前我们把AssetDic.Rem ...
基础资源异步加载
基础准备我们需要使用协程来开启异步加载
在ResourceManager中添加
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111public class ResourceManager : SingletonPattern<ResourceManager>{ //异步加载中间类的类对象池 protected ClassObjectPool<AsyncLoadResParam> m_AsyncLoadResParamPool = ObjectPoolManager.Instance.GetOrCreatClassPool<AsyncLoadR ...
基础资源同步加载
Resource Manager
以双向链表为基础的资源池
基础资源同步加载
基础资源异步加载
基本资源卸载
清空缓存
预加载
为ObjectPoolManager提供同步异步资源加载
基础资源同步加载在ResouceManager中有如下代码:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 ...
双向链表
为什么使用双向链表如果一个资源被频繁调用,我们希望它在链表的顶部,而不频繁调用的资源会慢慢地沉向底部,当我们想要释放资源时,位于底部的资源会被优先释放。
当然我们也可以在代码中指定当前资源是否常用,指定当前资源被卸载时是否是完全卸载。
双向链表类我们的双向链表类配合对象池进行优化
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142public class DoubleLinkedListNode<T> ...
资源管理对象池和管理类
对象池基本介绍
类对象池提前缓存一些基础类的对象,在其他管理类使用时直接从类对象池中取出。
类对象池需要自行实现还原的方法,因为每个具体的类不一样,所以每个类的变量修改后返回到对象池时需要自行重置
在下面的AssetBundle Manager中,AssetBundleItem这个由对象池管理的类就自己实现了一个Reset方法
需要重置的原因是我们的对象池使用Stack<T>,每一次Pop出来的对象都必须的是一样的
AssetBundle管理读取配置表和依赖加载的管理
资源池管理资源池管理(ResouceManager)是Asset Bundle管理的上层。
其中异步加载通过使用协程和循环来控制每一帧资源加载的容量来流畅加载。
资源池重点处理的是资源,图片、声音、视频、文字等,还包括未实例化的Prefab。
资源池为上层提供资源加载的接口。
对象池管理对象池管理(ObjectManager)是资源池管理的上层。
针对需要实例化的对象进行缓存,根据对象是否常用来决定是否放进对象池中。其中异步加载需要实现取消加载,对象池中的对象可能在加载中途不需要加载了。
类对象池新建Cl ...
打包策略和打包工具
打包策略
设置编辑器工具统一设置AB包名及路径管理
根据依赖关系(自定义依赖关系表)生成不冗余AB包
基于Asset的全路径生成自己的依赖关系表
根据自己的依赖关系加载AB包
优点:在编辑器环境下,不需要打包;不会产生冗余AB包;文件夹或文件AB包设置简单方便管理。
整个思路就是Unity自己的Addressable打包方式
缺点:长时间未打包的情况下,用于生成目录所需要的时间比较长。
为什么会产生冗余:
如果我们给一个资产文件打上一个AB包名,给包含此资产的文件夹打上另一个AB包名,那么此资产就会产生冗余
如果我们给一个图片打上一个AB包名,给依赖此图片的另一个Prefab打上另一个AB包名,又会产生冗余??
自定义打包配置SO基于Assets序列化生成编辑器打包配置SO,表里的设置主要分为两种:
基于文件夹下所有单个prefab文件进行打包
基于文件夹进行打包
ABConfig脚本在Editor文件夹内新建ABConfig脚本
123456789101112131415161718192021using System.Collections.Generic;using ...