cocos2d-x关于CC_ASSERT断言BUG!

26 篇文章 0 订阅
15 篇文章 0 订阅

程序在debug模式下正常运行,而在release模式下却发生莫名的异常,异常非常诡异,弄的我甚至怀疑cocos2d-x的源代码。

晚上在公司比较闲,正好可以慢慢进行排查,最后发现在我自定义的action中出现问题。

这个action负责GLSL特效部分,部分代码如下:

void JEffectAction::startWithTarget(CCNode *pTarget)
{
    CCSprite * spr = dynamic_cast<CCSprite*>(pTarget);
    
    CC_ASSERT(spr);

    CCActionInterval::startWithTarget(pTarget);
    
    CCGLProgram* pProgram = new CCGLProgram();
    string source = jeffect_source(m_glslfile.c_str());
    CC_ASSERT(pProgram->initWithVertexShaderByteArray(ccPositionTextureColor_vert, source.c_str()))
    spr->setShaderProgram(pProgram);
    pProgram->release();
    
    CHECK_GL_ERROR_DEBUG();
    spr->getShaderProgram()->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position);
    spr->getShaderProgram()->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color);
    spr->getShaderProgram()->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords);
    CHECK_GL_ERROR_DEBUG();
    
    spr->getShaderProgram()->link();
    CHECK_GL_ERROR_DEBUG();
    
    spr->getShaderProgram()->updateUniforms();
    CHECK_GL_ERROR_DEBUG();
    
    // 生成u_time的地址
    m_progressUniformLocation = glGetUniformLocation(spr->getShaderProgram()->getProgram(), "u_time");
    //
    for(map<string,float>::iterator itr = m_uniforms.begin(); itr != m_uniforms.end(); ++itr){
        glUniform1f(glGetUniformLocation(pProgram->getProgram(), itr->first.c_str()), itr->second);
    }
}

通过一行行的排查,最终发现是
CC_ASSERT(pProgram->initWithVertexShaderByteArray(ccPositionTextureColor_vert, source.c_str()))

这一行没有执行,跟进CC_ASSERT代码发现这个宏最终是这样定义的:

#ifdef NDEBUG
#define	assert(e)	((void)0)
#else

也就是说,上面我写的那行代码为空,于是出现异常。

教训就是,在采用assert进行断言时,断言参数不要写逻辑,否则该逻辑在release模式下不能得到执行!


尼玛又要重新审核了。。╮(╯▽╰)╭



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值