前文链接 请教 3.8 游戏bundle是打包成zip文件还是二进制文件那个比较好 - Creator 3.x - Cocos中文社区;
说下这几天我干了什么,
需求说明,我需要远程加载一下bundle,然后发现文件还是有点多,所以我想着,能不能把文件打包成一个文件,然后在引擎里解压出来,这样的话,请求就变少了,速度不就上去了,
我花了两天,在@我的小狗叫奶茶 大佬的压缩工具基础上,用node简单加了个功能,将所有资源文件打包成一个二进制文件,
大佬贴子:https://forum.cocos.org/t/topic/138234
大致的逻辑是
[描述文件长度,描述文件内容,资源文件内容]
前面固定4字节,保存后面描述文件的长度,
描述文件内容见下图,保存了资源文件的一些说明,包括路径,后缀名,内容长度,
对了,我用的引擎是 cocosCraete3.8
目前按照我定义的数据结构,已经将数据分离出来了,
然后就开始愉快的踩坑之路
尝试1
我看了引擎内部的资源加载管线,
首先创建bundle,直接调用 factory.create(…)就可以创建,记得往config的json里加一句base:assets/${bundleName}
,${bundleName}是你的bundle名字
;
接下来下其他文件,我就傻了
官方是通过这个管线下载资源,preprocess 预处理,load是下载
在load 处理函数里 有这么一段,他是将RequestItem 传入单个下载管道去下载资源,
然后 loadOneAssetPipeline 有两个部分
fetch函数里,有这么一个东西,
然后我睿智的想出了一个方法,我将管线复制出来一条,然后在插入一个函数,将file的值填入不就好了吗,这样就可以不经过下载方法,直接走后面的解析函数,大致应该是这么写
然后就gg,走不下去了,不知道为什么,对比直接加远程bundle,这里的RequestItem数量就是对不上,查不到原因,冷静一下之后,决定重新换个思路
尝试2
我开始思考为什么我要死磕加载管线呢,我只要不让引擎去下载,跳过下载过程,直接拿到数据,不也是成功嘛,然后我看到了这个,所有下载基本都是走这里,经过某个函数,改变请求头啥的,然后走http请求下载,
刚好我看到一个函数,能自定义处理方法
哦吼,那只要我重载一下这个方法,如果url在我外面定义的缓存里能找到,我就直接返回不就可以了嘛。
然后我就遇到了两个坑,出不来了,
1 提示我反序列化失败 Can not deserialize the same JSON data again.
不知道为什么会出现
2,另一个导致我放弃的原因是 音频 视频,字体文件,这几种资源,很多无法通过重载某个函数就是实现功能,所以我只能先放弃
尝试3
上面已经调试,看源码,搞了好几天,国庆都过完了,还没成功,懵归懵,我还是要继续弄的
在2的基础上继续改,原来的函数我不能重载,这个时候,我只能考虑函数替换一下
首先在引擎源码里加一个函数
我只想获取原来的处理函数,但是官方没有提供,所以只能自己加一个,
然后将我自己解析出来的数据,通过URL.createObjectURL(file.contentBlob);转为浏览器的资源映射地址,
再给丢给引擎去下载,这个方法经过我简单测试,能正常加载bundle了,
但是 只要下载就要时间呀,去下载blob的内容也是需要时间的
那我优化,优化了个寂寞啊,
写这文的时候,孩子已经哭晕在厕所。
论坛的大佬们,路过给个意见,官方大大,求指点啊,总不能看着孩子一直在撞南墙吧