Cocos Creator3.8.7开源引擎解析(一)

资源下载与依赖管理

关键的类AssetManager,重要的两条管线

1.pipeline管线:正常的加载与解析管线

2.fetchpipeline管线:只有加载管线

本篇就资源下载的流程,以及对资源资源依赖加载,还有序列化的流程进行解析。

如有不对,请大家海涵,多多交流

重要的加载方法入口:

这个入口就是大家经常用到的资源加载入口,可以看到最后的流程就是:pipeline.async(task);

pipeline核心思想:将一个任务的输出,当做下一个任务的输入进行管道的处理

1.开始pipeline的异步执行流程

2.preprocess:预处理流程

2.1.transformPipeline:转换

parse:解析输入的请求为requestItem的格式

replaceOverrideAsset:资产替换,这里可以实现热更新bunlde中的一些定死的资源,比如我们在bundle里面有一个资产,但是下载时,需要获取最新的,而不是bundle里面先打包出来的那个旧的,就会用到这里的流程

combine:将上面的产物,组装拼接成真正的地址,这才是最终需要用到的资源下载地址

3.load流程

3.1loadOneAssetPipeline流程

分为:fetch流程与parse流程

3.1.1 fetch流程:调用packManager.load

最终调用到downloader方法

原始的native资源,走直接下载的方式

下面是引擎自己定义的资源下载:

packmanger主要负责拆包,creator打包的时候,会将一些数据合并到一个包文件中,比如很多spriteFrame资源都放到一个bundle内的一个json里面,这样可以大幅度减少请求数量,这个时候如果下载资源,就要将整个这个包下载下来,然后通过这个拆成对应的打包前的资源。

3.2 downloader的流程

3.2.1 process流程
  • 主要功能根据类型调用具体的handler,handler为每种类型的资源对应的下载器
  • 根据限制与否,塞到handlerQueue中等待回调handler,这里就是控制并发下载数量的地方
3.2.2 finale流程

资源下载好后的回调流程,比较简单

3.2.3 不同资源的不同下载器

核心都是通过XMLHttpRequest下载对应的资源,然后不同下载器,对下载好的资源有不同的后处理方式;如果有些特殊资源,可以自定义下载器实现下载与封装

3.3 回到fetch流程

3.3.1 回到packManager.done中来,进行资源的解包操作
3.3.2 回到loadOneAssetPipeline流程,设置好RequestItem的file对应的资源
3.3.3 回到loadOneAssetPipeline的pare流程
  • native资源,直接加载并且通过parser进行下一步处理
  • 非native资源,会进行:循环依赖检测、命中缓存等相关处理,特殊要关注循环引用时,addRef的情况,也就是A->B->A时的情况
  • 下载这个资源的依赖资源

3.4 真正的parse流程

根据各个资源的类型,进行真正的解析处理;

  1. 注意json资源是在下载后直接成为了js对象不用这里处理,会直接返回
  2. import对象是资产描述文件对象(区分native对象),比如一些spriteFrame等对象会走到反序列化直接成为Asset对象
  3. 其他对象都有对原始文件的数据封装

3.5 回到load流程之后

将task中下载且加载好的Asset集中起来返回,因为在AssetManager中可以一次性下载多个对象,比如加载一个dir文件下所有资源这种。

3.5.1 回到assetManager的loadAny函数

asyncify代码很简单,但是意义比较模糊,特殊说明一下:

调用时,1.将真正的回调延时到下一帧执行;2.强制会增加一下每个资源的ref,3;下一帧调用时恢复ref的计数;

目的:1.防止pipeline加载完成时到onComp调用这个窗口期内,资源被释放,2.防止在回调里面立即调用了assetManager.release方法移除资源,但是pipleline还没走完(回调移到下一帧了)

具体加载一个spriteFrame资源(import资源),及其依赖的Texture2D(import资源)、以及imageAsset资源(native资源)的时序如下

相关推荐
song_hui_xiang3 个月前
Bingo 可玩广告构建工具
cocos·creator·playable·可玩
0zien03 个月前
【AI编程 - 第一弹】2048小游戏
ai编程·claude·creator·trae·vibe
Flyjun-android3 年前
cocos creator-碰撞检测
javascript·ecmascript·cocos·creator