您的位置:首页 > 大数据 > 人工智能

解决"waitForCondition(LockCondition) timed out (identity=23, status=0). CPU may be pegged. trying again."问题

2013-11-26 13:35 417 查看
前几天在跑游戏引擎的时候,遇到了一个比较奇怪的问题,logcat不断地打印下面的错误:

waitForCondition(LockCondition) timed out (identity=23, status=0). CPU may be pegged. trying again.

更为奇怪的是,机器完全不能响应,最终重启,而且是可以100%重现的。

测试的机器是Moto ME525(MIUI 2.3.7)。

经过排查,发现与FBO的使用有关,引擎中对FBO使用的大概逻辑是:

@Override
public void onDrawFrame(GL10 gl) {
gl.glBindFramebuffer(GL10.GL_FRAMEBUFFER, 0);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

// here is some code that use fbo
//gl.glBindFramebuffer(GL10.GL_FRAMEBUFFER, fbo);
return;
}


问题就出在,在return之前没有恢复到默认的FBO,解决起来也比较简单:

@Override
public void onDrawFrame(GL10 gl) {
gl.glBindFramebuffer(GL10.GL_FRAMEBUFFER, 0);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

// here is some code that use fbo
//gl.glBindFramebuffer(GL10.GL_FRAMEBUFFER, fbo);

// restore to the default fbo
gl.glBindFramebuffer(GL10.GL_FRAMEBUFFER, 0);
return;
}


网上也有一些关于此问题的讨论,一部分人说是FBO的问题,一部分人说并非是FBO的问题;但我更相信是FBO的问题,理由如下:

先来看看GLSurfaceView中的一个代码片段

GLSurfaceView view = mGLSurfaceViewWeakRef.get();
if (view != null) {
view.mRenderer.onDrawFrame(gl);
}
int swapError = mEglHelper.swap();


报出错误日志的地方正是上面对swap的调用之处,而swap的功能正是交换前后缓冲区,而FBO显然是影响缓冲区的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐