cocos2d-x经验杂谈

本文详细介绍了在Cocos2d-x游戏开发中遇到的常见问题及其解决方案,包括内存泄漏、多线程安全、文件夹数量限制、代码更新策略等,并提供了具体实例和优化建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、偶遇ReferenceTable overflow 

出现场景:因为频繁对socket的往返数据通过JNIHelper进行了decryptDES和encryptDES操作,导致java的垃圾回收出现异常,引用计数溢出。

解决方案:进行jni操作后记得释放

参考文档:http://www.ibm.com/developerworks/cn/java/j-lo-jnileak/index.html?ca=drs-

if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

    JniMethodInfo mInfo;
    bool hasMethod = JniHelper::getStaticMethodInfo(mInfo, ANDROID_HELPER_CLASS,
                                                    "encryptDES", "([B)[B");
    
    jbyte *by = (jbyte*)data;
    jbyteArray jbyteArr; //定义jbyte数组
    jbyteArr = mInfo.env->NewByteArray(len);
    mInfo.env->SetByteArrayRegion(jbyteArr, 0, len, by);
    
    jobject ret;
    if (hasMethod)
    {
        ret = mInfo.env->CallStaticObjectMethod(mInfo.classID, mInfo.methodID, jbyteArr);
        jbyteArray array = (jbyteArray)ret;
        jsize numBytesEncrypted = mInfo.env->GetArrayLength(array);
        
//        const void* data = (const void*)mInfo.env->GetByteArrayElements(array, 0);
        jbyte * jdata = (jbyte*)mInfo.env->GetByteArrayElements(array, 0);

        if(jdata)
        {
            DataBlock* dataBlock = new DataBlock((const void*)jdata, (unsigned int)numBytesEncrypted);
            mInfo.env->ReleaseByteArrayElements(array, jdata, 0);    //JNI释放
            return dataBlock;
        }
    }
            

#endif
2、使用多线程,应避免在非主线程中使用autorelease,这是非线程安全的操作,可能出现空指针。如果一定要使用,建议用建立消息队列机制,在主线程使用

3、碰到cocosbuilder too many directories

出现场景:cocosbuilder加文件夹后无法打开,出现上述提示。那是因为cocosbuilder定义了kCCBMaxTrackedDirectories 50,也就是你的文件夹上限为50,超过了就会出现错误提示。

解决方案:改源码

参考文档:http://blog.youkuaiyun.com/playddt/article/details/11609679

下载路径:http://download.youkuaiyun.com/download/wangting/6926059(用别人下载好的快点,不用配置很多东西)

4、cocosbuilder尽可能不使用ccb插件,在多个ccb文件同时在一个类中容易引发各种让你痛苦的事情

5、scrollView中的CCControlButton在滚动过程容易点到

解决方案:修改CCControlButton.cpp,在ccTouchMoved里面加上简单的判断标记,用于阻止sendActionsForControlEvents,为了保证点击灵敏度,手指的小距离移动还是运行存在的。

    if(ccpDistance(pTouch->getLocation(), pTouch->getStartLocation()) > MOVE_LIMIT)
    {
        mIsMove = true;
    }
最后改下ccTouchEnded,把button的状态改成CCControlStateNormal即可

void CCControlButton::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
    m_isPushed = false;
    setHighlighted(false);
    
    if (mIsMove) {
        m_eState = <span style="font-family: Arial, Helvetica, sans-serif;">CCControlStateNormal</span>;
        mIsMove = false;
        return;
    }
    if (isTouchInside(pTouch))
    {
        sendActionsForControlEvents(CCControlEventTouchUpInside);        
    }
    else
    {
        sendActionsForControlEvents(CCControlEventTouchUpOutside);        
    }
}

6、某些action并没有修改到目标对象的透明度

出现场景:一个CCLayer使用CCFadeIn,无任何效果

解决方案:看了一下源码注释有这么一句Fades In an object that implements the CCRGBAProtocol protocol. 

ps(原以为setOpacity能同时修改子节点,最后发现不行,只能重写setOpacity,通过递归遍历子节点)


7、关于cocos2dx游戏cpp在线更新,大多数人都采用lua脚本更新,不过即使用脚本,也有很多无法更新的地方,假如某些功能需求需要对cocos2dx做底层修改,这时候我们要更新的就必须是c++的代码。在2014年的苹果开发者大会,xcode下可以创建动态链接,这提供了c++的更新可能,至于android下的更新,其实更简单,把so文件存储替换到可执行目录下,然后system加载就行了。找时间再写份具体的博客。\(^o^)/~



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值