尝试addChild,removeChild在硬件中断或JAVA回调中时,我遇到了很多崩溃。
我的游戏有一个软按钮来调用java,以便使用语音识别。
背景信息:
C++: btnRecord pressed -> JAVA: startVoiceRecognition -> C++: return;
JAVA: hasResult -> C++: resultHandler -> C++: addchild, removechild, etc.-> crashed randomly.
我发现它崩溃是因为当cocos在同一区域做同样的事情时我试图改变游戏数据。
Ex:当cocos渲染layerA时,JAVA也尝试删除layerA - >坠毁。
cocos是否有针对此背景的任何解决方案?
可能是一个回调队列,将在下一个游戏循环中处理?
我认为当您按下某个硬按钮时需要更改绘图场景:后退键,音量键或任何硬件中断事件是非常必要的。
答案 0 :(得分:0)
JNI回调在单独的线程中运行。这意味着当JNI发生回调时,它无法阻止cocos主线程。
我担心JNI回调会阻止cocos主线程。我应该先检查一下:(
确定!要解决此问题,请使用std::mutex
和scheduleOnce
。
void MyGame::update(float dt)
{
jniMutex.unlock();
// do something
jniMutex.lock();
}
JNI callback()
{
jniMutex.lock();
// scheduleOnce something
jniMutex.unlock();
}
我想确保JNI回调在MyGame::update(float)
内运行,因此我从开头就致电unlock()
,并在结束时致电lock()
。
除此之外,我们应该使用scheduleOnce
而不是尝试直接在更新函数中修改Node结构。