1

今天我遇到了在 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,我将不胜感激。

4

1 回答 1

3

如果你的 callbackFunc 是从这个异步线程调用的,它可能会导致可能导致这种行为的竞争条件(cocos 缓存所有呈现的字体标签,并且 CCTextureManager 不是线程安全的)。

另外(我认为您可以在 Apple 的 OpenGL 编程指南中找到以下信息) - 从不同线程调用所有 OpenGL 方法是不安全的。如果你在不同的线程中创建这个字符串“test”,cocos 实际上最终会创建一个新的 OpenGL 纹理(这可能不合适,因为在不同的线程中创建)。我认为您可以通过在其他地方(在主线程上)创建具有相同“测试”文本的不同标签来检查该理论-如果在您的代码片段中创建的标签不再消失-这意味着该理论是正确的:)

如何解决?

我相信您必须在主 UI 线程中创建标签(或在其上设置文本) - 例如,记住队列中异步回调的结果,并在某处的更新方法中定期检查它。并记住正确的锁定。

于 2012-09-27T13:28:11.447 回答