当资源加载很多的时候(498个资源),win32和手机上会出现Stack overflow,
之前数量少的时候还是好的!
搜了下,大概是-x代码递归深度的问题导致的。
求帮忙分析原因。。。。
控制台log:
frameworks/runtime-src/proj.win32/Debug.win32/script/jsb_boot.js:482:Error: Stack overflow,
这个是cc.log 打印输出的一个BUG 你可以不要打印东西就可以了
如果一定要打印就要修复下这个对象互相引用导致的BUG
你可以用我的这个打印方法代替cc.log
Utils.debug = true;
Utils.log = function (info, tag, type) {
if (Utils.debug == false) return;
if (info == null) info == "null";
var infoType = typeof (info);
if (infoType == "object" || infoType == "array") {
var seen = [];
info = JSON.stringify(info, function (key, val) {
if (typeof val == "object") {
if (seen.indexOf(val) >= 0) return;
seen.push(val)
}
return val;
});
} else if (infoType == "number") {
info = info + "";
} else if (infoType == "boolean") {
info = info + "";
} else if (infoType == "function") {
info = info.toString();
}
console.log(info+""); //这个输出正式版也能看到打印 根据需要切换使用 不需要就用cc.log
//cc.log(info);
};
多谢,
不过我也没用cc.log,Stack overflow是系统打印的bug
现在发现了一些错误规律,如果加载的数组中连续json文件太多,就会出现Stack overflow。
我将数组后面的png文件分散插入前面的json文件中,就不报错了。。
目前基本上可以确定,手机上,cocos2d-js底层加载资源代码有问题,连续多个json文件加载会报错。我这边超过180个肯定报错。
做个标记!
js_boot.js的482行是什么代码?(我们版本不一样 我不确定你跟我的是不是一个版本)
我觉得这个跟数量的多少应该没关系吧。。。
这个方法出的问题:482行:是else if (url.match(jsb.urlRegExp)) {
loadImg: function (url, option, cb){
var l = arguments.length;
if(l == 2) cb = option;
var cachedTex = cc.textureCache.getTextureForKey(url);
if (cachedTex) {
cb && cb(null, cachedTex);
}
else if (url.match(jsb.urlRegExp)) {
jsb.loadRemoteImg(url, function(succeed, tex) {
if (succeed) {
cb && cb(null, tex);
}
else {
cb && cb("Load image failed");
}
});
}
else {
cc.textureCache._addImageAsync(url, function (tex){
if (tex instanceof cc.Texture2D)
cb && cb(null, tex);
else cb && cb("Load image failed");
});
}
},
我猜想是不是官方js代码,同类型连续文件加载的时候递归调用,递归的层次太深了崩溃。
有可能 我以前也遇到过这个地方出问题。。 后来不记得怎么处理的了。。。
我目前解决方案是:把那个大数组分成多个小数组单独加载,每个数组不超过100个文件。现在已经ok了