您的位置:首页 > 产品设计 > UI/UE

SpriteWithHue,通过修改色调实现资源复用

2015-05-30 19:15 489 查看
转载:http://www.cocoachina.com/bbs/read.php?tid-302467.html工程下载地址:http://download.csdn.net/my==================================================================================

另外使用过程中发现2个问题 :

1. 我的版本是cocos2dx3.3,,,,所以在SpriteWithHue.cpp 中的updateColorMatrix()方法报错,

改成这样:

void SpriteWithHue::updateColorMatrix(){//GLfloat mat[3][3];//hueMatrix(mat, _hue);//premultiplyAlpha(mat, getAlpha());//auto callback = [this, &mat](cocos2d::GLProgram *p, cocos2d::Uniform *u)//{// glUniformMatrix3fv(u->location, 1, GL_FALSE, (GLfloat*)&mat);//};//getGLProgramState()->setUniformCallback("u_hue", callback);getGLProgramState()->setUniformCallback("u_hue",[this](cocos2d::GLProgram *p, cocos2d::Uniform *u){GLfloat mat[3][3];hueMatrix(mat, _hue);premultiplyAlpha(mat, getAlpha());glUniformMatrix3fv(u->location, 1, GL_FALSE, (GLfloat*)&mat);});}

问题1,ok!!

2.通过这个类创建精灵后添加到界面上,然后调用移除精灵的方法,内存是不会下降的,反而添加一次增加一次,只增加不减少

添加精灵代码:Size visibleSize = Director::getInstance()->getVisibleSize();    if (!m_node) {        m_node = Node::create();        this->addChild(m_node);        m_node->setContentSize(Size(Vec2(visibleSize.width, visibleSize.height)));    }    for (int i = 0; i < 30; i++) {        auto spriteWithHue = SpriteWithHue::create("ball_red.png");        spriteWithHue->setPosition(Vec2(rand_0_1() * visibleSize.width, rand_0_1() * visibleSize.height));        spriteWithHue->setHue(M_PI * 2 * rand_0_1());        m_node->addChild(spriteWithHue);    }移除精灵方法:if (m_node) {        m_node->removeFromParent();4000        m_node = nullptr;    } 

问题2解决办法:

主要是2个问题导致内存没降下来。a.GLProgramStateCache每次都会缓存program state,这部分,直接调用void GLProgramStateCache::removeUnusedGLProgramState()即可。b.GLProgram创建后,即使析构了内存也降不下来。这部分不太清楚,先建了个issue给引擎。https://github.com/cocos2d/cocos2d-x/issues/12138这块得等引擎fix。==================================================================================

SpriteWithHue

这个类主要实现的功能是对cocos2d::Sprite色调的修改,从而达到一套纹理可以重复利用的目的,特别对于一些只需在颜色上换装的游戏来说,真是大大的福利。这是我从CCSpriteWithHue Github扒过来,从Cocos2d-iphone移植到Cocos2d-x,并进行了适当的修改(感谢原作者Alex314)。实现的效果如图:支持Sprite以及Animtion。使用的引擎版本是Cocos2d-x v3.5 Final。测试例如图:使用方式很简单,和cocos2d::Sprite一样,只是多了一个setHue(float hue)接口用于设置色调,范围处于0~2π。示例代码:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2d-x