cocos2d-x线程使用错误修正

来源:互联网 发布:ubuntu 安装php环境 编辑:程序博客网 时间:2024/06/06 12:43

cocos2d-x版本:3.2

1、TextureCache异步加载纹理加锁方式错误

先看源码:

这种加锁方式有小概率会出现执行顺序为1->2->3,造成的后果就是你发起一个异步加载请求,然而并没有什么卵用,代码在3位置等待,你迟迟加载不到需要的纹理,直到再次发起一个异步加载请求时才会解锁_sleepCondition.wait(lk); 看起来又正常了,而你不知道什么时候又会出现上述情况。

修正后代码如下:

void TextureCache::addImageAsync(const std::string &path, const std::function<void(Texture2D*)>& callback){    // ...    AsyncStruct *data = new AsyncStruct(fullpath, callback);    std::unique_lock<std::mutex> lk(_sleepMutex);    _asyncStructQueue->push(data);    _sleepCondition.notify_one();}
void TextureCache::loadImage(){    AsyncStruct *asyncStruct = nullptr;    while (true)    {        std::queue<AsyncStruct*> *pQueue = _asyncStructQueue;        {            std::unique_lock<std::mutex> lk(_sleepMutex);            if (_needQuit) {                break;            }            if (pQueue->empty())            {                _sleepCondition.wait(lk);                continue;            }            asyncStruct = pQueue->front();            pQueue->pop();        }        // ...    }}

2、Console异步回调问题

Console类提供了addCommand接口,可以外部插入自定义的命令,然而回调却是在异步线程回调的,例如在lua里调用此接口,异步线程回调lua有可能导致程序崩溃。

解决方法:通过addCommand插入的命令回调函数转回到主线程回调。部分代码如下:

bool Console::parseCommand(int fd)




3、HttpClient有和1同样的错误,解决方法也相同






0 0
原创粉丝点击