zoukankan      html  css  js  c++  java
  • 解决"waitForCondition(LockCondition) timed out (identity=23, status=0). CPU may be pegged. trying again."问题

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

  • 相关阅读:
    在已经安装的nginx上,增加ssl模块
    apache ab压力测试报错(apr_socket_recv: Connection reset by peer (104))
    ab和jmeter进行GET/POST压力测试的使用心得和比较
    linux历史命令查找快捷方式
    HDFS的dfs.replication不同验证
    Set replication in Hadoop
    RVM 安装 Ruby
    Fluentd初探 简介与安装
    Flunetd 用于统一日志记录层的开源数据收集器
    Custom partition assignment and migration kafka集群扩充迁移指定partition
  • 原文地址:https://www.cnblogs.com/frydsh/p/3443133.html
Copyright © 2011-2022 走看看