官方大大,请问怎么将二进制数据塞进引擎的资源管理里

前文链接 请教 3.8 游戏bundle是打包成zip文件还是二进制文件那个比较好 - Creator 3.x - Cocos中文社区

说下这几天我干了什么,
需求说明,我需要远程加载一下bundle,然后发现文件还是有点多,所以我想着,能不能把文件打包成一个文件,然后在引擎里解压出来,这样的话,请求就变少了,速度不就上去了,

我花了两天,在@我的小狗叫奶茶 大佬的压缩工具基础上,用node简单加了个功能,将所有资源文件打包成一个二进制文件,
大佬贴子:https://forum.cocos.org/t/topic/138234

image
大致的逻辑是
[描述文件长度,描述文件内容,资源文件内容]
前面固定4字节,保存后面描述文件的长度,
描述文件内容见下图,保存了资源文件的一些说明,包括路径,后缀名,内容长度,
image

对了,我用的引擎是 cocosCraete3.8
目前按照我定义的数据结构,已经将数据分离出来了,
然后就开始愉快的踩坑之路
尝试1
我看了引擎内部的资源加载管线,
首先创建bundle,直接调用 factory.create(…)就可以创建,记得往config的json里加一句base:assets/${bundleName},${bundleName}是你的bundle名字
image
接下来下其他文件,我就傻了
image
官方是通过这个管线下载资源,preprocess 预处理,load是下载
在load 处理函数里 有这么一段,他是将RequestItem 传入单个下载管道去下载资源,
image
然后 loadOneAssetPipeline 有两个部分
image
fetch函数里,有这么一个东西,
image
然后我睿智的想出了一个方法,我将管线复制出来一条,然后在插入一个函数,将file的值填入不就好了吗,这样就可以不经过下载方法,直接走后面的解析函数,大致应该是这么写
image
然后就gg,走不下去了,不知道为什么,对比直接加远程bundle,这里的RequestItem数量就是对不上,查不到原因,冷静一下之后,决定重新换个思路
尝试2
我开始思考为什么我要死磕加载管线呢,我只要不让引擎去下载,跳过下载过程,直接拿到数据,不也是成功嘛,然后我看到了这个,所有下载基本都是走这里,经过某个函数,改变请求头啥的,然后走http请求下载,
image
image
刚好我看到一个函数,能自定义处理方法
image
哦吼,那只要我重载一下这个方法,如果url在我外面定义的缓存里能找到,我就直接返回不就可以了嘛。
image
image

然后我就遇到了两个坑,出不来了,
1 提示我反序列化失败 Can not deserialize the same JSON data again.
image
不知道为什么会出现
2,另一个导致我放弃的原因是 音频 视频,字体文件,这几种资源,很多无法通过重载某个函数就是实现功能,所以我只能先放弃
image

尝试3
上面已经调试,看源码,搞了好几天,国庆都过完了,还没成功,懵归懵,我还是要继续弄的
在2的基础上继续改,原来的函数我不能重载,这个时候,我只能考虑函数替换一下
image
首先在引擎源码里加一个函数 image
我只想获取原来的处理函数,但是官方没有提供,所以只能自己加一个,
然后将我自己解析出来的数据,通过URL.createObjectURL(file.contentBlob);转为浏览器的资源映射地址,
再给丢给引擎去下载,这个方法经过我简单测试,能正常加载bundle了,

但是 只要下载就要时间呀,去下载blob的内容也是需要时间的 image
那我优化,优化了个寂寞啊,
写这文的时候,孩子已经哭晕在厕所。

论坛的大佬们,路过给个意见,官方大大,求指点啊,总不能看着孩子一直在撞南墙吧

1赞

我也有困难, 就是把 arraybuffer 转成 cocos 的audio 。 但是没有找到好办法,只能用原生播了。

万一你的 二进制数据能转了,我也用用

这几天痛并快乐着,不断错误不断改,但是结果毫无卵用的感觉真是令人着迷

二进制文件后缀要以.bin结尾,加载代码用:resources.load(path, BufferAsset, (err, buff: BufferAsset) => {
}

等大佬给意见,我好继续弄,不然就只能卡这了,技穷了

如果没有文件,就是一段 arraybuffer 呢。

我不是想下载bin文件,我二进制文件已经下载了,现在卡在,里面的二进制数据无法嵌入引擎里,变成官方自己的Asset对象。
不过我刚刚突然冒出一个想法,我们通过bundle去get资源,image
然后资源都存储在assets字典里,
我刚刚又大概看了一下 添加进这个字典的位置只有一个,
image
所以我要是想方法,直接吧数据转成对应的对象,然后塞进这里是不是也可以

那倒没有这方面的经验呢,等你研究成功了可以分享下

assetmange 可以加载自定义格式的文件啊认真看文档,然后再看看源码里面的download 和 parse这两个文件,把对应的方法替换成自己的就好了!

(帖子被作者删除,如无标记将在 24 小时后自动删除)