• cocos2dx android ui and gl threads

    环境 搞android SDK 的时候,因为接quickSDK没有lua版本,只好用android 原生版本,自己写 java跟lua的交互 问题 java 跟 lua 交互有概率性的会出现闪退 思路及解决 思路 这种概率性的闪退,一般都是线程不安全导致的,于是我就去找,看到cocos2dx 里面有很多用到 mActivity:runOnUiThread(new Runnable(){ public void run() { // xxoo xxoo } }) 然后我就认为这个是cocos2dx的主线程,然后就拼命的用它去调用lua,结果就是闪退不断, 这个时候我觉得是不对的,如果这个是主线程是不可能有这个问题,于是我再去找,发现一个方法长得跟它很像的 mActivity:runOnGLThread(new Runnable(){ public void run() { // xxoo xxoo } }) 这时候我才清楚,原来这个GL线程才是我们游戏线程,UI线程是UI框架的,如果调用高级UI或者SDK就需要用UI线程。 解决方案 cocos2dx的东西使用 GL线程 android高线UI使用 UI线程 结果 不闪退
  • cocos2dx etc 闪退问题

    环境 稳定性测试期 问题 部分机型和部分模拟器会因为ETC1资源导致闪退 07-13 21:59:43.727 E/szipinf (21935): Error reading asset data 07-13 21:59:43.727 E/szipinf (21935): Unable to access asset data: -1 思路及解决 问题分析 经过调试发现是因为只有部分ETC1资源没有办法正常加载,于是我就把没办法正常加载的资源取出来找规律, 然后我发现了它们都有一个相同的问题,就是有大部分的透明区域,就是没有用的区域,大概是因为ETC1格式压缩 的问题和这些闪退的机型协议不一致所导致的,我也不想去深究。 解决方案 我尝试在整张图片周围画一个距形的红框,目的让资源四周都有像素,果然闪退解决 结果 做图工具升级,完美解决
  • cocos2dx FileUtils 缓存机制

    背景 处理热lua更新功能 问题 有些文件没有没有获取最新下载的资源,依然是使用旧的 思路及解决 首先查看搜索路径 dump(cc.FileUtils:getInstance():getSearchPaths()) -- 结果是没有问题的 路径缓存起来 std::string FileUtils::fullPathForFilename(const std::string &filename) const { if (filename.empty()) { return ""; } if (isAbsolutePath(filename)) { return filename; } // Already Cached ? auto cacheIter = _fullPathCache.find(filename); if(cacheIter != _fullPathCache.end()) { return cacheIter->second; } // Get the new file name. const std::string newFilename( getNewFilename(filename) ); std::string fullpath; for (const auto& searchIt : _searchPathArray) { for (const auto& resolutionIt : _searchResolutionsOrderArray) { fullpath = this->getPathForFilename(newFilename, resolutionIt, searchIt); if (!
  • android etc1 黑块问题

    环境 接android SDK 问题 在SDK返回的时候,部分UI会出现黑块,LOG会提示Opengl GL 502等错误 解决思路 查找根源 一开始我的处理方案是把那些异常的资源重新加载,是可以解决大部分问题,但觉得这并不上策。于是我再继续找根源。。。 根源是因为SDK在初始化|登录|支付的回调中去可能去调用到我们的UI,这个回调的线程并不是*Cocos2dxUI线程*,这样子操作UI是不能保证先后顺序,这个时候android机子会触发重新加载资源的时机。 所以部分重载一半或者一些不预料的黑块就出现了。 function () xxx:runAction(cc.Sequence:create( cc.DelayTime:create(0.02), cc.CallFunc:create(function () -- ... do something end))) end 查找为什么会出现黑块 结果 完美解决黑块问题