cocos2d-x经验杂谈

来源:互联网 发布:淘宝刷收藏有什么用 编辑:程序博客网 时间:2024/06/06 10:07

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.csdn.net/playddt/article/details/11609679

下载路径:http://download.csdn.net/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^)/~



0 0
原创粉丝点击