auto it = _textures.find(asyncStruct->filename);就是这一行,使用多线程加载纹理时,偶尔崩溃到这一行,搜了网络和最新代码,都没有发现有人提及,但是看这行代码,应该存在多线程问题,unorder_map不是线程安全的,这样可能导致崩溃。
有人说用const_iterator是线程安全的,还没有尝试过,有人遇到过或者有解决办法吗?
没遇到崩溃 但是偶尔遇到异步加载卡住,始终加载不到资源
被卡住了有可能是那个资源被其他程序占用了,不然其他地方应该不会卡住的。
只能修改源码了啊,已经解决了,由于我的资源全是异步加载的,所以可以忽略同步加载的情况,只需要在TextureCache类中定义一个成员变量:std::mutex _textureMutex;
然后在TextureCache::loadImage函数用到textures的地方用这个锁锁住,TextureCache::addImageAsyncCallBack函数中对textures进行写操作的地方用这个锁锁住就可以啦。
还真没遇到这个问题,因为我的资源加载模块里纹理加载是一个个加载的,大概正好规避了这个问题吧。。
大神能不能贴代码出来啊,最近我也遇到了,急急急
后面想了想,最好不要同时加载,这样可能会造成瞬时内存爆发,一个一个的加载最好,加载完后隔一帧再加载更好,这样上一个纹理加载时用的内存就已经被释放了,而且这个也没有线程安全问题了。如果真的一定要这样做,就按我上面说的做就可以了。
每一帧一帧的加载
var LoadRes = {
_success: null,
_progress: null,
_total: null,
_curr: null,
_imgArry: null,
_bIsLoad: null,
loadResource: function (params) {
this._success = params.success;
this._progress = params.progress;
this._imgArry = params.resource;
this._total = this._imgArry.length;
this._curr = 0;
this._bIsLoad = false;
mm.schedule(this, this._update, 0, cc.REPEAT_FOREVER);
},
_loadingCallBack: function() {
++this._curr;
if (this._curr >= this._total) {
mm.unSchedule(this, this._update);
this._success();
return;
}
this._bIsLoad = false;
},
_update: function () {
if (this._bIsLoad == false) {
this._bIsLoad = true;
cc.log("load img: "+this._imgArry+ " curr: "+this._curr+ " total: "+ this._total);
var percentage = Math.floor(this._curr/this._total*100);
this._progress(percentage);
cc.textureCache.addImageAsync(this._imgArry, this._loadingCallBack, this);
}
}
}