引擎版本:cocos2d-x 2.2.2
使用中发现,Widget的initRenderer()方法,会生成一些空的sprite,如:
void Button::initRenderer()
{
_buttonNormalRenderer = CCSprite::create();
_buttonClickedRenderer = CCSprite::create();
_buttonDisableRenderer = CCSprite::create();
_titleRenderer = CCLabelTTF::create();
CCNodeRGBA::addChild(_buttonNormalRenderer, NORMAL_RENDERER_Z, -1);
CCNodeRGBA::addChild(_buttonClickedRenderer,PRESSED_RENDERER_Z, -1);
CCNodeRGBA::addChild(_buttonDisableRenderer,DISABLED_RENDERER_Z, -1);
CCNodeRGBA::addChild(_titleRenderer,TITLE_RENDERER_Z, -1);
}
这里会调用:
CCSprite* CCSprite::create()
{
CCSprite *pSprite = new CCSprite();
if (pSprite && pSprite->init())
{
pSprite->autorelease();
return pSprite;
}
CC_SAFE_DELETE(pSprite);
return NULL;
}
如果texture为NULL,会使用cc_2x2_white_image,在void CCSprite::setTexture(CCTexture2D *texture)中,
if (NULL == texture)
{
// Gets the texture by key firstly.
texture = CCTextureCache::sharedTextureCache()->textureForKey(CC_2x2_WHITE_IMAGE_KEY);
// If texture wasn’t in cache, create it from RAW data.
if (NULL == texture)
{
CCImage* image = new CCImage();
bool isOK = image->initWithImageData(cc_2x2_white_image, sizeof(cc_2x2_white_image), CCImage::kFmtRawData, 2, 2, 8);
CCAssert(isOK, “The 2x2 empty texture was created unsuccessfully.”);
texture = CCTextureCache::sharedTextureCache()->addUIImage(image, CC_2x2_WHITE_IMAGE_KEY);
CC_SAFE_RELEASE(image);
}
}
接下来:
CCTexture2D* CCTextureCache::textureForKey(const char* key)
{
return (CCTexture2D*)m_pTextures->objectForKey(CCFileUtils::sharedFileUtils()->fullPathForFilename(key));
}
CC_2x2_WHITE_IMAGE_KEY是一个不存在的文件,这里会耗费大量的时间。