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中背景音乐和音效使用实例
- Cocos2d-x学习笔记之CCScene、CCLayer、CCSprite的默认坐标和默认锚点实验
- Cocos2d-x UI开发之CCControlPotentiometer控件类使用实例
- Cocos2d-x UI开发之文本类使用实例
- Cocos2d-x保存用户游戏数据之XML文件是否存在问题判断方法
- Cocos2d-x UI开发之菜单类使用实例
- Cocos2d-x UI开发之CCControlButton控件类实例
- Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系
- Cocos2d-x UI开发之CCControlColourPicker控件类使用实例
- Cocos2d-x学习笔记之CCLayerColor层的使用实例
- Cocos2d-x Schedule定时器的使用实例
- Cocos2d-x中使用CCScrollView来实现关卡选择实例
- Cocos2d-x中CCEditBox文本输入框的使用实例
- cocos2d-x学习笔记之CCLayer、CCLayerColor、CCLayerGradient、CCLayerMultiplex场景层介绍
- Cocos2d-x UI开发之CCControlSlider控件类使用实例
- Cocos2d-x学习笔记之开发环境搭建
- Cocos2d-x学习笔记之Hello World!
- Cocos2d-x的内存管理总结
- Cocos2d-x 3.0中集成社交分享ShareSDK的详细步骤和常见问题解决
- Cocos2d-x入门教程(详细的实例和讲解)