转载:http://www.cocoachina.com/bbs/read.php?tid-302467.html
工程下载地址:http://download.youkuaiyun.com/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();
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π。
示例代码:
1
2
3
4
|
auto alien = SpriteWithHue::create(
"alien.png"
);
alien->setPosition(Vec2(100, 100));
alien->setHue(M_PI);
this
->addChild(alien);
|