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

      前几天在跑游戏引擎的时候,遇到了一个比较奇怪的问题,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显然是影响缓冲区的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值