今天我遇到了在cocos2d-x框架中更新对象的问题。 我尝试在异步线程中下载一些文本,然后更新CCTextFieldTTF中的文本,然后文本字段消失。
void HelloWorld::callbackFunc(void *Layer, std::vector<promowall::CItem> Items) {
cocos2d::CCLayer *layer = static_cast<cocos2d::CCLayer *>(Layer);
cocos2d::CCLabelTTF *label = dynamic_cast<cocos2d::CCLabelTTF *>(layer->getChildByTag(10));
label->setString("test");
}
如果有人帮助我并解释我如何使用openGl和pthreads,我将非常感激。
答案 0 :(得分:3)
如果从此异步线程调用callbackFunc,则可能会导致可能导致此类行为的竞争条件(cocos缓存所有呈现的字体标签,并且CCTextureManager不是线程安全的)。
另外(我认为你可以在Apple的OpenGL编程指南中找到以下信息) - 从不同的线程调用所有OpenGL方法是不安全的。如果你在另一个线程中创建这个字符串“test”,cocos实际上最终会创建一个新的OpenGL纹理(由于在另一个线程中创建,它可能不合适)。我认为你可以通过在其他地方(在主线程上)创建一个具有相同“测试”文本的不同标签来检查这个理论 - 如果在你的代码片段中创建的那个不再消失 - 这意味着理论是正确的:)
如何解决?
我相信您必须在主UI线程中创建标签(或在其上设置文本) - 例如,记住队列中异步回调的结果,并在某处更新方法中定期检查它。并记住正确的锁定。