используя pthread в cocos2d-x

Сегодня я столкнулся с проблемой обновления объектов в фреймворке 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.

1

Решение

Если ваш callbackFunc вызывается из этого асинхронного потока, это может вызвать условия гонки, которые могут вызвать такое поведение (cocos кэширует все визуализированные метки шрифта, а CCTextureManager не является потокобезопасным).

Также (я думаю, что вы можете найти следующую информацию в руководстве по программированию Apple OpenGL) — небезопасно вызывать все методы OpenGL из разных потоков. И если вы создаете эту строку «test» в другом потоке, cocos фактически заканчивает тем, что создает новую текстуру OpenGL (которая может быть неправильной, так как создана в другом потоке). Я думаю, что вы можете проверить эту теорию, создав другую метку с тем же «тестовым» текстом где-то еще (в основном потоке) — если тот, который создан в вашем фрагменте кода, больше не исчезает — это означает, что теория верна 🙂

Как это исправить?

Я полагаю, что вы должны создать метку (или установить текст на ней) в своем основном потоке пользовательского интерфейса — например, запомнить результат вашего асинхронного обратного вызова в очереди и периодически проверять его где-нибудь в вашем методе обновления. И помните о правильной блокировке.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]