(cocos2d-x 3.1 + VS2012)TextureCache :: addImageAsync偶尔会导致崩溃

时间:2014-06-12 04:18:30

标签: cocos2d-x cocos2d-x-3.0

我在游戏开始时异步加载一些纹理,大约有40-50个。

vector<string> textureFileNames;
textureFileNames.push_back("textures/particle.png");
textureFileNames.push_back("textures/menu_title.png");
...
textureFileNames.push_back("textures/timer_bar.png");
for (auto fileName: textureFileNames)
{
    Director::getInstance()->getTextureCache()
            ->addImageAsync(fileName, CC_CALLBACK_1(LoadingLayer::textureLoadedCallback, this));
}

我的textureLoadedCallback方法没有任何问题;在这个阶段,它只是增加一个值并更新进度计时器。回调是通过cocos2d-x设计从主线程调用的,所以我不怀疑那里出现任何问题。

90%的时间这种方法很好。但有时它会在加载纹理的中途在VS2012中崩溃:

Debug Assertion Failed!

Program: C:\Windows\system32\MSVCP110D.dll
File: C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\vector
Line: 1140

Expression: vector subscript out of range

在这一点上突破,我可以看到它在vector的内部,特别是[]运算符中死亡,并追溯到_HashTextureCache::loadImage()方法:{{ 1)}在CCTextureCache.cpp的第174行。 auto it = _textures.find(asyncStruct->filename)定义为_textures,标准库无序映射。 std::unordered_map<std::string, Texture2D*> _textures解析为要加载的纹理的完整路径和文件名。

使用调试器,我可以看到文件名很好。我可以看到_textures已经包含了19个纹理,之前它处理得很好。

它似乎只是在标准库中死亡的事实并没有让我觉得正确......但我无法确定CCTextureCache出错的地方。只是它并不总是失败,并且它在异步线程中失败了。我的代码没有并发bollocks(据我所知)。

这是一个cocos2d-x错误,VS2012错误还是我粘贴在上面的代码的错误?

1 个答案:

答案 0 :(得分:2)

我认为潜在的原因可能是for循环问题像19异步图像一次加载,这种方法可能支持也可能不支持。只有在调用纹理回调后才尝试发出下一个异步加载。这样就不会同时执行两个异步加载。