0

尝试在硬件中断或 JAVA 回调中添加、删除Child 时,我面临很多崩溃。

我的游戏有一个调用 java 的软按钮,以便使用语音识别。

上下文:

C++: btnRecord pressed -> JAVA: startVoiceRecognition -> C++: return;
JAVA: hasResult -> C++: resultHandler -> C++: addchild, removechild, etc.-> crashed randomly.

我发现它崩溃了,因为我试图在 cocos 在同一区域做同样的事情时更改游戏数据。

例如:当 cocos 在渲染 layerA 时,JAVA 也尝试移除 layerA -> crashed。

cocos 有针对这种情况的解决方案吗?

可能是一个回调队列,将在下一个游戏循环中处理?

我认为当你按下一些硬按钮时需要改变绘图场景:返回键、音量键或任何硬件中断事件是非常必要的。

4

1 回答 1

0

是的,我终于解决了这个问题。

JNI 回调在单独的线程中运行。这意味着当 JNI 发生回调时,它不能阻塞 cocos 主线程。

我担心 JNI 回调会阻塞 cocos 主线程。我应该先检查一下:(

好的!要解决这个问题,只需使用std::mutexand 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而不是尝试直接在更新函数中修改节点结构。

于 2016-03-03T16:25:57.253 回答