cocos2dx纹理加载的一点东东

来源:互联网 发布:阿兴网络项目 编辑:程序博客网 时间:2024/05/16 06:45

做了很长事件的cocos2dx,在移植到android的过程中居然被android系统的图片纹理加载给纠结到了。


我们都知道从2.0.3开始,普遍在网上流传的一个解决android的home键,和锁屏键的纹理处理问题;我总结两消一改法,但是这个能真的解决问题吗,

至少没有解决我的问题,因为我的纹理丢了。

可能没看透cocos2dx的源码,我目前的项目中必须要在webview和cocos2dx之间反复切换,cocos2dx设置了一个时间,专门处理长时间没有用到的问题,

所以,如果通过两消一改法的话,玩家在webview玩久了再回来会出现黑屏或者只是加载了部分纹理,例如,动态的头像,和我们的TTF。


根据两消一改给我的提示,找到VolatileTextured的reloadAllTextures方法,你会发现,真正耗时间的地方在我注释“加载纹理的地方”。

case kImageFile:

            {

                CCImage image;

                std::string lowerCase(vt->m_strFileName.c_str());

               for (unsignedint i = 0; i < lowerCase.length(); ++i)

                {

                    lowerCase[i] = tolower(lowerCase[i]);

                }


               if (std::string::npos != lowerCase.find(".pvr")) 

                {

                    CCTexture2DPixelFormat oldPixelFormat = CCTexture2D::defaultAlphaPixelFormat();

                    CCTexture2D::setDefaultAlphaPixelFormat(vt->m_PixelFormat);


                    vt->texture->initWithPVRFile(vt->m_strFileName.c_str());

                    CCTexture2D::setDefaultAlphaPixelFormat(oldPixelFormat);

                } 

               else 

                {

                   unsignedlong nSize = 0;

                   unsignedchar* pBuffer = CCFileUtils::sharedFileUtils()->getFileData(vt->m_strFileName.c_str(),"rb", &nSize);

                    CCLog("载的纹理的名字是%s",vt->m_strFileName.c_str());

                   if (image.initWithImageData((void*)pBuffer, nSize, vt->m_FmtImage))

                    {

                        CCTexture2DPixelFormat oldPixelFormat = CCTexture2D::defaultAlphaPixelFormat();

                        CCTexture2D::setDefaultAlphaPixelFormat(vt->m_PixelFormat);

                        vt->texture->initWithImage(&image);

                        CCTexture2D::setDefaultAlphaPixelFormat(oldPixelFormat);

                    }

CCLog("这块位子导致黑屏的结束");

                    CC_SAFE_DELETE_ARRAY(pBuffer);

                }

            }


为什么会进入这个地方呢,原因在于CCTextureCache类里的addImage方法:

#if CC_ENABLE_CACHE_TEXTURE_DATA

              VolatileTexture::addImageTexture(texture, fullpath.c_str(), eImageFormat);  

#endif


这个宏是在两消一改里面提到的在android下面起效的一个纹理缓存,没错,就是这里,在你create你的sprite或者任何addimage的地方,
都会把你的图片名字放在他的重新加载的列表里,自然而然,当你,进入main的else方法的时候会自动去遍历这个dictionary,
dictionary键值对越长,画的时间越多,黑屏就出来了。

好,找到原因了,我们就来解决,我采取的是这个VolatileTexture中最开始,或者结尾,加入我的loading层的资源,如果是图片,
就按照那上面的方法,加载完,立马显示出来,然后在那个layer层里面通过action或者其他的函数调用方法,继续加载其他的图片资源,
这样,loading层在很快的时间内就出来了,完全没有黑屏,并且时间得到充分利用,不用担心home和黑屏键的时候资源加载问题,
用户体验也不差。



原创粉丝点击