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 と pthread をどのように扱うことができるかを説明してくれれば、とても感謝しています。

4

1 に答える 1

3

この非同期スレッドから callbackFunc が呼び出されると、競合状態が発生し、そのような動作が発生する可能性があります (cocos はレンダリングされたすべてのフォント ラベルをキャッシュし、CCTextureManager はスレッド セーフではありません)。

また (Apple の OpenGL プログラミング ガイドで次の情報を見つけることができると思います) - すべての OpenGL メソッドを異なるスレッドから呼び出すのは安全ではありません。そして、この文字列「test」を別のスレッドで作成すると、cocos は実際に新しい OpenGL テクスチャを作成することになります (別のスレッドで作成されているため、適切ではない可能性があります)。同じ「テスト」テキストで別のラベルを別の場所(メインスレッド上)に作成することで、この理論を確認できると思います-コードスニペットで作成されたラベルが消えなくなった場合-それは理論が正しいことを意味します:)

修正方法は?

メイン UI スレッドでラベルを作成する (またはラベルにテキストを設定する) 必要があると思います。たとえば、非同期コールバックの結果をキューに記憶し、更新メソッドで定期的にチェックします。そして、適切なロックについて覚えておいてください。

于 2012-09-27T13:28:11.447 に答える