SpriteWithHue,通過修改色調實現資源複用

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


實現的效果如圖:

QQ截圖20150529104556.jpg

支持Sprite以及Animtion。使用的引擎版本是Cocos2d-x v3.5 Final。


測試例如圖:

41_300874_04dd3779f85f8d0.jpg

41_300874_82afd19d36564ee500.gif

使用方式很簡單,和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);


發佈了34 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章