安卓手机随机无任何点击响应,发生版本cocos2d-x3.15.1

出现的几率比较低,在小米手机出现的次数比较多。安卓手机,开启游戏,游戏不响应所有的点击事件和KeyPressed事件。游戏肯定没有crash,首页的动画播放和背景音效都正常。




经过排查发现问题出现在CCEventDispatcher.cpp文件中,_inDispatch计数,出现紊乱,变成2,所有的listener都无法进入队列,所以无法将事件传递下去。

出现这个问题是因为 EventDispatcher::dispatchEvent不应该在非Cocos线程中调用。经过全局搜索,发现在CCFileUtils-android.cpp中

FileUtils::Status FileUtilsAndroid::getContents(const std::string& filename, ResizableBuffer* buffer)

{

    Director::getInstance()->getEventDispatcher()->dispatchCustomEvent(EVENT_BEFORE_READ_FILE);


    static const std::string apkprefix("assets/");

    if (filename.empty())

        return FileUtils::Status::NotExists;


    string fullPath = fullPathForFilename(filename);


    if (fullPath[0] == '/')

        return FileUtils::getContents(fullPath, buffer);


    string relativePath = string();

    size_t position = fullPath.find(apkprefix);

    if (0 == position) {

        // "assets/" is at the beginning of the path and we don't want it

        relativePath += fullPath.substr(apkprefix.size());

    } else {

        relativePath = fullPath;

    }

    

    if (obbfile)

    {

        if (obbfile->getFileData(relativePath, buffer))

            return FileUtils::Status::OK;

    }


    if (nullptr == assetmanager) {

        LOGD("... FileUtilsAndroid::assetmanager is nullptr");

        return FileUtils::Status::NotInitialized;

    }


    AAsset* asset = AAssetManager_open(assetmanager, relativePath.data(), AASSET_MODE_UNKNOWN);

    if (nullptr == asset) {

        LOGD("asset is nullptr");

        return FileUtils::Status::OpenFailed;

    }


    auto size = AAsset_getLength(asset);

    buffer->resize(size);


    int readsize = AAsset_read(asset, buffer->buffer(), size);

    AAsset_close(asset);


    if (readsize < size) {

        if (readsize >= 0)

            buffer->resize(readsize);

        return FileUtils::Status::ReadFailed;

    }


    return FileUtils::Status::OK;

}


对方法 Director :: getInstance () ->getEventDispatcher()->dispatchCustomEvent(EVENT_BEFORE_READ_FILE) ;的调用产生的。3.16中此文件已经更新,大家可以把这个文件升级一下,就可以解决这个问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值