【福利】编译项目生成过多json文件加载慢的民间解决方案

请问这个事情,官方现在有解决方案了么

1赞

这个官方应该是在 1.1.2 就自动支持了,现在用户不需额外操作,HTML 上能合并的都会尽量合并

现在确实有pack json了,但我们的项目仍然有600多个json,可能原因是大量的prefab放在resource里面动态实例化,没有关联到场景上。
所以仍然需要手工合并。从合并json中读取json的方法在目前版本上(1.3)和之前稍有变化,主要是针对pack的情况:

1)修改text_downloader.js 这是最根上的修改,所有Json都会走到这儿下载,包括pack的和不pack的
module.exports = function (item, callback) {
//for load import json from one big json object, item need uuid or id to download
if(window.inner_downloadText!=null && window.inner_downloadText(item,callback)) {
return;
}
2)修改pack_downloader.js, 这儿是加载pack的json,修改处是给传入的item加上uuid
_loadNewPack: function (uuid, packUuid, callback) {
var packUrl = cc.AssetLibrary.getImportedDir(packUuid) + ‘/’ + packUuid + ‘.json’;

  •    downloadText({ url: packUrl }, function (err, packJson) {
    
  •    //add uuid:packUuid to {}, for load import json from one big json object
    
  •    downloadText({ url: packUrl, uuid:packUuid }, function (err, packJson) {
    
  1. 福利贴中的inner_downloadText也要做一些修改:

window.inner_downloadText = function (item, callback) {
if (jsonObj[item.uuid]) {
callback(null, jsonObj[item.uuid]);
return true;
}
if (jsonObj[item.id]) {
callback(null, jsonObj[item.id]);
return true;
}
return false;
};

resources 中不要存放任何 cc.loader.loadRes 用不到的 url 的资源。resources 中存放单个 prefab 可以,但是 prefab 依赖的其它资源全部放到别的目录下。这样能减少 json 的数量。

一开始是这么做的,但是prefab依赖的图片资源需要在运行时动态替换,这样就只能把plist和图片都放到resources中了。另外我们的prefab相当多。。。因为我们的使用方法是在代码中用prefab动态组建场景

目前 Creator 不会强制把这些零碎的 json 合并起来,因为担心会加大初次使用其中一个资源时需要下载的数据量。而且也担心游戏包体也会增大(资源同时被多个 prefab 或场景使用,就会重复存在多个包中)。实际上现在合并 json 时,可选择不同的策略,日后我们会考虑把策略开放给用户自己扩展。

现在开放了吗?@jare

开放了,现在构建时有几个选项

如果是native的话,加载部分是改哪边的代码?

想问一下,如果热更的时候,修改到已经合并的json呢?
是否支持增量?还是说又要完整的热更新一个大json

优化打包后,import文件夹的大小有减小么

这个方案在手机上能用吗

如果可以支持增量,就可以。

手机上没必要。因为加载是本地加载,很快的。而且这个写在main.js里了 没有热更新。

你们2016年讨论“官方已经在解决这个问题了”,现在是2019年,我依然在搜解决方案,找到了你们。:slightly_smiling:

请看 22 楼回复,现在 json 文件数量已经尽量合并了

我自己写了个插件。打包时以3个优化。
1.所有小于10k的json使用使用{[uuid:string]:data}的格式合并在一起,写死在main.js里 使用某个全局变量引用
2.所有大小10k的json使用同样的方式合并为一个大json,复制到res目录下
3.所有atlas文件合并为一个json,复制到res目录下。

使用cc.loader.addDownloadHandlers 来自定义json和atlas的加载。从上面3个里面找,有就直接返回,没有就调用原本默认的的loader(cc.loader.downloader.extMap.json/atlas)来处理。
另外上面提到的2和3,是进入游戏时使用xhr加载的,因为这2个会比较大,所以不好直接写死在main.js里。在加载成功前如果需要加载里面的json数据,就会使用原本默认的方法从网络加载,如果这里的2和3已经成功了,就会从这里读取。

1赞

请问对性能有多少帮助?

json文件合并后 如何修改源码来改变加载方式呢

求解答下,合并所有json方法,当前版本的cocos2d-js-min 已经无法按原教程设置了,因为代码已经发生了很大变化。