我是靠谱客的博主 单纯小馒头,最近开发中收集的这篇文章主要介绍对cocos2dx 2.0.4 的改造,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

声明:该改造未经过严格的测试,本文属于个人备忘。如参考本文引起的问题,本人概不负责。当然欢迎大家批评指导!

1. CCObject.h

加入类的名字,方便调试的时候在基类中识别派生类。

private:
char name_[16]; // 注意要初始化
public:
inline void set_name(constchar* _name){strncpy(name_, _name,16);}
inline const char* get_name(){ return name_; }

然后在ccplateformmacros.h中将CREATE_FUNC 加上一行代码

pRet->set_name(#__TYPE__); 


// release 方法源代码
// CCAssert(m_uReference > 0, "reference count should greater than 0");
// 现在的代码修改为
if (m_uReference <= 0)
{
CCLOG("release,%d,%p,%s,reference count should greater than 0!!!!",
m_uReference, this, this->get_name());
}

2. CCNode.cpp

cleanup(),removechild(),detachChild() 加入以下代码,避免对对象的过度释放引发crash

if(child->retainCount() <= 0)
{
CCLog("[%s:%d] retainCount(%d),classname(%s)",__FILE__,__LINE__, child->retainCount(),child->get_name()); return; }


3.CCNode.h 

将setZOrder该为public,只是为了方便。

4. CCDirector.cpp 

为了节省内存将sharedSpriteFrameCache也进行了释放。目前没有观察到问题

 void CCDirector::purgeCachedData(void)
{
CCLabelBMFont::purgeCachedData();
CCTextureCache::sharedTextureCache()->removeUnusedTextures();
CCFileUtils::sharedFileUtils()->purgeCachedEntries();
}

修改为

void CCDirector::purgeCachedData(void)
{
CCLabelBMFont::purgeCachedData();
CCSpriteFrameCache::sharedSpriteFrameCache()->removeUnusedSpriteFrames(); // add
CCTextureCache::sharedTextureCache()->removeUnusedTextures();
//CCFileUtils::sharedFileUtils()->purgeCachedEntries(); ?? memory leak?
}

5. CCArray.h 

arrayMakeObjectsPerformSelector加个容错,避免程序crash。

#define arrayMakeObjectsPerformSelector(pArray, func, elementType)

do {

if(pArray && pArray->data && pArray->count() > 0)

{

CCObject* child;

CCARRAY_FOREACH(pArray, child)

{

elementType pNode = (elementType) child;

if(pNode)

{

pNode->func();

}

}

}

}

while(false)

6.     CCPoolManager.cpp

void CCPoolManager::pop()
{
...
int nCount = m_pReleasePoolStack->count();
m_pCurReleasePool->clear();
if(nCount > 1)
{
m_pReleasePoolStack->removeObjectAtIndex(nCount-1);
m_pCurReleasePool = (CCAutoreleasePool*)m_pReleasePoolStack->objectAtIndex(nCount - 2);
}
}


修改为


m_pCurReleasePool->clear();
m_pCurReleasePool = NULL;
if(m_pReleasePoolStack->count() > 1)
m_pReleasePoolStack->removeObjectAtIndex(m_pReleasePoolStack->count()-1);
if(m_pReleasePoolStack->count() > 1)
m_pCurReleasePool = (CCAutoreleasePool*)m_pReleasePoolStack->objectAtIndex(m_pReleasePoolStack->count() - 1);


6. CCMenu.cpp
// 增加如下三个方法、可以手动的设置handler的优先级
void CCMenu::setHandlerPriorityNoError(int newPriority)
{
CCTouchHandler *handler = NULL;
handler = CCDirector::sharedDirector()->getTouchDispatcher()->findHandler(this);
if(handler == NULL)
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, newPriority, true);
else
this->setHandlerPriority(newPriority);
}
void CCMenu::setIsClarity(bool _isClarity)
{
isClarity = _isClarity;
}
bool CCMenu::getIsClarity()
{
return isClarity;
}
void CCMenu::registerWithTouchDispatcher()
{
CCTouchHandler *handler = CCDirector::sharedDirector()->getTouchDispatcher()->findHandler(this);
if(handler == NULL) // 这里加了容错
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, kCCMenuHandlerPriority, true);
}

7.CCPlateformMacros.h
// 修改容错
#define CC_SAFE_RELEASE(p)
do { if(p && p->retainCount() >= 1) { (p)->release(); } } while(0)
#define CC_SAFE_RELEASE_NULL(p)
do { if(p && p->retainCount() >= 1) { (p)->release(); (p) = 0; } } while(0)

8. 加入RGBA8888纹理的获取

if (hasAlpha && pixelFormat == kCCTexture2DPixelFormat_RGBA8888)
{
// Convert "RRRRRRRRRGGGGGGGGBBBBBBBBAAAAAAAA" to "RRRRRRRRGGGGGGGGBBBBBBBB"
inPixel32 = (unsigned int*)image->getData();
tempData = new unsigned char[width * height * 4];
unsigned char *outPixel8 = tempData;
for(unsigned int i = 0; i < length; ++i, ++inPixel32)
{
*outPixel8++ = (*inPixel32 >> 0) & 0xFF; // R
*outPixel8++ = (*inPixel32 >> 8) & 0xFF; // G
*outPixel8++ = (*inPixel32 >> 16) & 0xFF; // B
*outPixel8++ = (*inPixel32 >> 24) & 0xFF; // B
}
}

最后

以上就是单纯小馒头为你收集整理的对cocos2dx 2.0.4 的改造的全部内容,希望文章能够帮你解决对cocos2dx 2.0.4 的改造所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部