cocos2d x-x3.2怎么两个精灵相交

cocos2d-x3.2 内存管理
时间: 06:48:46
&&&& 阅读:82
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&图片缓存没去掉,这游戏里面普遍的问题。TextureCache::removeUnusedTextures这个方法只有在纹理计数为1的时候才会移除内存中缓存的Texture。这里有一个问题要先说一下:当我们创建一个精灵的时候,这张精灵所使用的Texture是会加载到内存中缓存着的。一旦你再次创建一个使用相同纹理的精灵,这个时候如果内存中还存在这张纹理的缓存,就会直接取出,而不用重新创建。当一个精灵创建的时候,在其内部调用addImage方法的时候,把引用计数做了+1处理,此时引用计数为2.当移除这个精灵的时候,引用计数会-1,这个时候引用计数为1。若此时你调用了TextureCache::removeUnusedTextures的方法。那这张纹理将从内存中移除。但是若是像之前说的,有两个精灵同时使用了这张问题,那该纹理的引用计数为3,必须两个精灵都移除后,才能释放内存。
&&&&&&&&这边还有一点很重的是:只有在removeChild的时候,引用计数才会做-1处理,而cocos的removeChild是没有对其子节点进行remove处理的,也就是说,子节点中对于Texture的引用计数仍在,导致TextureCache::removeUnusedTextures的时候,纹理没办法有效的移除。
所以这里建议的方案是:
1.在移除一个节点之前,先遍历移除其子节点,释放引用计数
2.在层或者场景切换的时候,手动调用TextureCache::removeUnusedTextures方法
PS:在addChild的时候,会把对象放入容器中,而放入时会对其进行retain()的处理;在removeChild的时候,会把对象从容器中移除,会对其进行release()的处理标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!Cocos2d-x3.2中的动画系统_Linux编程_Linux公社-Linux系统门户网站
你好,游客
Cocos2d-x3.2中的动画系统
来源:Linux社区&
作者:酷酷小乔
Cocos2d-x3.2中的动画系统
auto sp=Sprite::create();/定义一个空的图片精灵
//定义图片的每一帧
vector&SpriteFrame *&allFrame
for(int i=1;i&7;i++)// i是图片
&SpriteFram *sf=SpriteFrame::cerate(StringUtils::format("放的图片地址",i).c_str(),Rect(0,0,100,100));
allFrame.pushBack(sf);
//创建动画
Animation *aniplayer=Animation::createWithSpriteFrames(allFrame);
aniplayer-&setDelayPerUnit(0.12f);
//创建一个动作
Animate * ani=Animate::create(aniplayer);
//让某个Node执行动作
Action *act=RepeatForever::create(ani);
//动作函数
sp-&runAction(act);
剖析cocos2d-x之Action实现
下cocos2d-x开发环境搭建及配置
Cocos2d-x3.2实现虚拟摇杆多点触摸
Ubuntu 14.04搭建Cocos2d-x2.2.5开发环境图文详解
Cocos2D-X 的详细介绍:Cocos2D-X 的下载地址:
本文永久更新链接地址:
相关资讯 & & &
& (08/21/:50)
& (01/05/:06)
& (05/22/:13)
& (12/26/:52)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款cocos2d-x_v3.2例程中的SpriteBlur-long568
SpriteBlur类是cocos2d-x例程中的一个类,用于将一个精灵模糊。
由于项目需要模糊场景中的精灵,于是笔者把该类提取出来,未做任何修改用到自己的工程中。
实际应用发现奇怪的现象:
cocos2d-x_v3.0中提供的SpriteBlur,精灵模糊后基本是正常的,边缘的地方偶尔会闪出黑边。
cocos2d-x_v3.2中提供的SpriteBlur,精灵模糊后原本是透明像素的部分变成了黑色,即便模糊半径设置为0(即不模糊)也一样。
左侧是v3.2的效果,采样数设置的是3,模糊半径10。右侧是v3.0的效果,采样数不能设置, 模糊半径10。
由于笔者有追逐新版本的癖好~~所以决定探寻一下v3.2到底是咋了。先看SpriteBlur类的代码:
SpriteBlur.h
#ifndef __prjHeads__SpriteBlur__
#define __prjHeads__SpriteBlur__
#include &cocos2d.h&
class SpriteBlur : public cocos2d::Sprite
& & ~SpriteBlur();
& & bool initWithTexture(cocos2d::Texture2D* texture, const cocos2d::Rect&& rect);
& & void initGLProgram();
& & static SpriteBlur* create(const char *pszFileName);
& & void setBlurRadius(float radius);
& & void setBlurSampleNum(float num);
protected:
& & float _blurR
& & float _blurSampleN
#endif /* defined(__prjHeads__SpriteBlur__) */SpriteBlur.cpp
#include &SpriteBlur.h&
USING_NS_CC;
SpriteBlur::~SpriteBlur()
SpriteBlur* SpriteBlur::create(const char *pszFileName)
& & SpriteBlur* pRet = new SpriteBlur();
& & if (pRet && pRet-&initWithFile(pszFileName))
& & & & pRet-&autorelease();
& & & & CC_SAFE_DELETE(pRet);
& & return pR
bool SpriteBlur::initWithTexture(Texture2D* texture, const Rect& rect)
& & _blurRadius = 0;
& & if( Sprite::initWithTexture(texture, rect) )
#if CC_ENABLE_CACHE_TEXTURE_DATA
& & & & auto listener = EventListenerCustom::create(EVENT_RENDERER_RECREATED, [this](EventCustom* event){
& & & & & & setGLProgram(nullptr);
& & & & & & initGLProgram();
& & & & });
& & & & _eventDispatcher-&addEventListenerWithSceneGraphPriority(listener, this);
& & & & initGLProgram();
void SpriteBlur::initGLProgram()
& & GLchar * fragSource = (GLchar*) String::createWithContentsOfFile(
& & & & & & & & & & & & & & & & & & & & & & FileUtils::getInstance()-&fullPathForFilename(&example_Blur.fsh&).c_str()
&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & )-&getCString();
& & auto program = GLProgram::createWithByteArrays(ccPositionTextureColor_noMVP_vert, fragSource);
& & auto glProgramState = GLProgramState::getOrCreateWithGLProgram(program);
& & setGLProgramState(glProgramState);
& & auto size = getTexture()-&getContentSizeInPixels();
& & getGLProgramState()-&setUniformVec2(&resolution&, size);
& & getGLProgramState()-&setUniformFloat(&blurRadius&, _blurRadius);
& & getGLProgramState()-&setUniformFloat(&sampleNum&, 7.0f);
void SpriteBlur::setBlurRadius(float radius)
& & _blurRadius =
& & getGLProgramState()-&setUniformFloat(&blurRadius&, _blurRadius);
void SpriteBlur::setBlurSampleNum(float num)
& & _blurSampleNum =
& & getGLProgramState()-&setUniformFloat(&sampleNum&, _blurSampleNum);
}代码中并没有关于像素控制的部分,再看example_Blur.fsh:
void main(void)
&vec3 col = blur(v_texCoord);
&gl_FragColor = vec4(col, 1.0) * v_fragmentC
......OK,问题就在给gl_FragColor赋值这一句,vec4(col, 1.0),强制把alpha值设置成了1,所以透明像素会&黑&。做如下修改:
gl_FragColor = vec4(col,&texture2D(CC_Texture0,&v_texCoord).a) * v_fragmentC即将alpha值设置为当前纹理坐标处的alpha值,运行得到下面的效果:
Oz,头像边缘出现了锯齿和白边,为啥会这样呢?修改:
gl_FragColor = v_fragmentC运行,头像的图片显示成了全白的长方形,白边也许就是因此而来。再看example_Blur.fsh中的blur函数,其中为每一个点的rgb值都进行了加权操作,于是笔者想,如果将alpha值也进行加权操作会怎么样呢?修改example_Blur.fsh:
#ifdef GL_ES
varying vec4 v_fragmentC
varying vec2 v_texC
uniform vec2
uniform float blurR
uniform float sampleN
vec4 blur(vec2);
void main(void)
& & vec4 col = blur(v_texCoord);
& & gl_FragColor = col * v_fragmentC
vec4 blur(vec2 p)
& & if (blurRadius & 0.0 && sampleNum & 1.0)
& & & & vec4 col = vec4(0);
& & & & vec2 unit = 1.0 / resolution.
& & & float r = blurR
& & & & float sampleStep = r / sampleN
& & & & float count = 0.0;
& & & & for(float x = -r; x & x += sampleStep)
& & & & & & for(float y = -r; y & y += sampleStep)
& & & & & & {
& & & & & & & & float weight = (r - abs(x)) * (r - abs(y));
& & & & & & & & col += texture2D(CC_Texture0, p + vec2(x * unit.x, y * unit.y)) *
& & & & & & & & count +=
& & & & & & }
& & & & return col /
& & return texture2D(CC_Texture0, p);
}运行,得到下面的结果:
可以看到,效果与3.0中的效果基本一致了。
但是,还是不太理解,两种修改方法的效果怎么会不一样?高斯模糊应该只是重新分布rga颜色值吧,怎么alpha也要进行加权操作才能正常?
另外,无论是3.2还是3.0,模糊以后,在任务头顶有一道明显的黑边,不知是何原因,有待探究。}

我要回帖

更多关于 cocos2d 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信