未能加载程序集或它的一个依赖项_Unity游戏开发笔记-资源管理之资源加载

未能加载程序集或它的一个依赖项_Unity游戏开发笔记-资源管理之资源加载_第1张图片

资源加载是游戏中非常重要也非常繁琐的的一部分,不合理的资源管理,必定回给游戏的内存带来非常大的压力,尤其是一些重度游戏,不但资源特别多,引用关系特别复杂。维护一个不会内存泄漏而且加载效率高的资源加载框架,真的非常非常的不容易。项目前期不容易暴露问题,项目后期问题又难查,而且难改~以下内容是结合了自己参与的项目,还有网上很多大佬观点的一个总结。


编辑器下建立资源关系,并导出资源关系序列化文件

首先构建一个序列化文件存储类,大致如下:

未能加载程序集或它的一个依赖项_Unity游戏开发笔记-资源管理之资源加载_第2张图片

然后对项目资源进行分类,思考出来一套符合自己项目的打包策略,然后对资源文件建立资源引用关系,导出序列化二进制文件。

未能加载程序集或它的一个依赖项_Unity游戏开发笔记-资源管理之资源加载_第3张图片

打包策略,可以参考之前的一篇文章思路:

马鑫:Unity游戏开发笔记-资源管理之资源打包策略​zhuanlan.zhihu.com
未能加载程序集或它的一个依赖项_Unity游戏开发笔记-资源管理之资源加载_第4张图片

游戏运行,反序列化出资源关系文件,游戏中维护一份资源关系文件

首先建立资源类的基础Class,这个类非常重要,游戏中我们最终将核心管理这个类,资源加载实际上使用的也是这个类。大致如下:

未能加载程序集或它的一个依赖项_Unity游戏开发笔记-资源管理之资源加载_第5张图片

游戏中通常都会有ResourceManager和AssetBundleManager这里我们对职责做一个简单的划分,大致如下:

未能加载程序集或它的一个依赖项_Unity游戏开发笔记-资源管理之资源加载_第6张图片

维护资源池

首先,这里先思考以下资源管理的方法,我们这里使用双向链表,根据引用次数和使用时间做维护的标准,对回收的资源做资源池的管理,大体思路如下:

未能加载程序集或它的一个依赖项_Unity游戏开发笔记-资源管理之资源加载_第7张图片

整理清楚了以上思路,我们这里用一个简单的流程图来理一下整个流程:

未能加载程序集或它的一个依赖项_Unity游戏开发笔记-资源管理之资源加载_第8张图片

Emmm通过上面这张图,大家明显可以看出来

我 不 会 画 流 程 图

然后开始介绍几个核心的Manager的功能:

AssetBundleManager

  • 负责编辑器下生成的依赖数据的管理
  • 负责加载资源的时候资源Ab和依赖项的加载
  • 负责资源卸载的时候资源Ab和依赖Ab的卸载

划重点

  1. 加载资源Ab的时候,一定要先加载依赖项
  2. 卸载资源Ab的时候也要卸载引用计数为0的Ab,引用计数的管理比较重要。Emm

ResourceManager

  • 正如其名,负责资源文件的同步加载,异步加载,预加载。这里我们只负责把文件加载到内存中,实例化的操作由ObjectManager负责。
  • 负责对加载过的资源做资源缓存
  • 对卸载的资源做回收资源的管理
  • 对ObjectManager的分装类对象做二次处理赋值,因为从加载对象还是要用ResManager来加载。
  • 异步加载的管理,维护按照优先级排序的异步加载列表。
  • 异步加载的取消

划重点

  1. 设计到的中间传递类较多,不好管理
  2. 小心处理每一个函数,不恰当的管理很容易内存泄漏
  3. 类对象池和资源池对象回收的重置处理
  4. 异步分帧的尺度把握
  5. 池大小的尺度把握

ObjectManager

  • 主要负责需要实例化的Gamobject资源的同步加载,异步加载和预加载。
  • 负责对已经加载资源做池管理

代码不贴了~

资源管理相关的文章基本就到此结束了~

总而言之,不亲手写一套资源管理的代码,你永远不会知道,有多少坑在等着你。

预告:

下次更新游戏中必备的UIManager,我这里会对Cs和Lua都做一个封装。

嗯,该休息了。

你可能感兴趣的:(未能加载程序集或它的一个依赖项)