Cc.loader可以loadBinary吗?

creator的loader似乎没有这个方法?

1赞

目前没有这个方法,你的需求具体是什么样的?服务端存储 binary ?用什么格式呢?

完全自定义的格式。希望能返回一个ArrayBuffer.

ArrayBuffer 是可以通过 XMLHttpRequest 来传递的,我们的 loader 也可以定制

var arrayBufferHandler = function (item, callback) {
    var url = item.url;
    var xhr = cc.Pipeline.getXMLHttpRequest();
    xhr.open("GET", url, true);
    xhr.responseType = "arraybuffer";
    xhr.onload = function (oEvent) {
        var arrayBuffer = xhr.response;
        if (arrayBuffer) {
            var result = new Uint8Array(arrayBuffer);
            // 任何需要的处理
            callback(null, result);
        }
        else {
            callback(errorMessage); // 第一个参数需要传递错误信息
        }
    }
    // 错误处理
    xhr.onerror = ... // 同样需要调用 callback 返回错误信息

    xhr.send(null);
};

cc.loader.addDownloadHandlers({
    'ab': arrayBufferHandler
});

这样处理的话,如果你的服务端文件后缀名是 .ab 就可以匹配到 arrayBufferHandler。

参考文档: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data

3赞

如果文件是本地缓存的(jsb),也是通过XmlHttpRequest处理的吗?

JSB 的本地文件不行诶,jsb.fileUtils.getDataFromFile(url) 来获取 ArrayBuffer 对象,获取的是一个 Uint8Array

cocos creator中通过模拟器运行时,fileUtils读取不到资源,因为simulator目录里没有资源。

我不是很清楚cc.loader内部如何工作的,cocos creator中通过模拟器运行时,也算是jsb吧? download handler是如何读取到 assets/resources里的资源的呢?

看了一下text-downloader.js,里面有关于jsb的代码。我再试试。

这样的功能,强烈建议 build 出来再测试~ 在模拟器中,需要用正确的路径才可以,相对路径不行

那样是可以,但是调试起来就太麻烦了。而且没法在cocos creator里直接预览。

jsb 的效果在 creator 的编辑器里面肯定无法直接预览,其实你 build 出来以后,用 Xcode / VS 调试,更友好一些,log 看得也清楚。Creator 中更新了以后,点一下 build 很快,如果用 jsb-binary 模版,编译也非常快

确实有加载二进制文件的需求,请问引擎方面有计划把这个接口加上吗?
最方便的肯定还是能在浏览器里面跑。一边开发一边看效果,用chrome调试的便捷绝对是编译出来用Xcode/VS调试没法比的。
不要因为用的人少或者大神们觉得开发人员用不到就不提供嘛。

顶这个功能。现在我使用的是变通的方法,原因是我们需要压缩一下资源,但是cc.loader不能载入压缩后的二进制。我们解决的方法是将压缩文件存成文本格式,使用python的repr方法将二进制的内存表示转成文本,然后在js里面用eval去执行,就得到了二进制的内存数据。但是这样转出来的文本文本比二进制文件要大不少,压缩的作用聊胜于无了

请问这么设置之后 调用下载怎么用呢
cc.loader.load({url:“http://192.168.6.214/Test/test.ab",id:"ab”},function (err,data){
console.log(“errerrerrerrerr===”,err);
console.log(“datadatadatadata===”,data);
});
是这么调用么 我这边想用loader下载声音文件到本地 然后播放 这个应该怎么实现呀

1.6.2里面框架有个binary-downloader.js的实现,请问跟你这个实现哪个更好点呢?

这里改为 cc.loader.getXMLHttpRequest();

你好!这个方法在h5里面可以用了(当然1.8.1需要修改一下接口),但是导出native就不行了,本来资源应该导出到包里面的,使用这个方法后会试图去下载,并且下载失败,报错:
Starting to load res/raw-assets/resources/data/1.dat
NSURLConnection finished with error - code -1002

麻烦看一下,有没有可能在natvie里面从bundle或者sandbox载入自定义格式的二进制文件?万分感谢!!!

二进制文件的加载还是有必要支持的
另外 像图片这样的引擎内置资源类型最好支持下从内存创建
如果两者都支持的话,就可以自定义资源格式,对于资源保护有很重要的意义

这是引擎设计不合理的地方。
用户应该自行决定使用一种类型启动加载这一种(唯一一种)方式即可。
并不需要根据后缀自动判断类型后返回
只需要提供loadImage loadText loadBinary集中方法就足够了。

1赞

我觉得引擎需要提供几个层次的接口
首先 loadRes 最少要支持两种方式 fromFile和FromMemory 现在像H5这样的web环境 还需要一种FromUrl

然后加载文件 支持 LoadFile FromLocal 和FromUrl 支持文本和二进制两种

这样的 无论是使用方便性还是资源格式自定义都可以很好的满足

现在unity的那一套资源加载就完全实现上面说的各种