轉載: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();
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);
|