Android GL deadlock timeout error

CRASH

在 PBR&IBL 的开发过程中,在 Linux 验证程序运行正常后,移植到 Android 平台,发现程序 crash. 程序的逻辑是,响应页面某按钮点击事件,在gl线程加载渲染模型以及做PBR和IBL的预计算工作,之后渲染模型以及场景。程序 crash 的地点在 IBL 的所有预计算结束后,在第一次渲染调用之前,而且与此同时没有任何的 OpenGL ERROR. 具体导致 crash 的函数是 SurfaceTexture.updateTexImage() 这个 SurfaceTexture 是从摄像头获取数据的,与主要的预计算以及渲染没有任何关系,看起来十分诡异。错误信息如下:

Adreno-GSL: <gsl_ldd_control:548>: ioctl fd 74 code  (IOCTL_KGSL_DEVICE_WAITTIMESTAMP_CTXTID) failed: errno 35 Resource deadlock would occur

ioctl fd 60 code 0xc040094a (IOCTL_KGSL_GPU_COMMAND) failed: errno 35 Resource deadlock would occur

syncForReleaseLocked: error creating EGL fence: 0x3003

at android.graphics.SurfaceTexture.nativeUpdateTexImage(Native Method)

错误信息看了一头雾水吧。

DEBUG

调试:首先,Android 程序在没有 PBR 时运行一切正常,肯定是新增的代码导致的问题,而出错之前做的事情就是 IBL 的预计算,常规计算,主要分四个部分:

  1. HDR texture load and render to a cubemap texture
  2. IBL Diffuse IrradianceMap: Use the cubemap of step 1 to calcualte the irradiance cubemap
  3. IBL Specular Part 1: PrefilterMap: Use cubemap of step 1 to calculate the prefilter cubemap(with mipmap)
  4. IBL Specular Part 2: BRDF LookUp Texture: Calculate the BRDF LookUp Texture

在调试中发现,如果只进行前面两个部分的计算,也就是天空盒纹理和 IBL irradiance map 的计算,后面的跳过,那么程序运行正常。(因为原先程序的出错是还没有走到 PBR 绘制的 shader 就退出了,所以不生成这几个纹理不影响,只是说后面的 shader 运行出错,产生 GL error, 最终屏幕显示的模型是黑色的)

另外,如果将预计算部分的调用时机改变,从gl渲染中间改到在onSurfaceChanged()函数里面调用,也就是说在初始的渲染之前就做完所有的准备工作,然后在绘制每一帧,这样同样没有出错。

FIX

根据上述两个表现,基本猜测出错的原因是预计算部分耗费了太长的时间(具体数据见下),导致渲染线程卡死,驱动程序认为此时是 Resource deadlock 状态,但是我认为这个实际上是一个 timeout 的状态。

解决问题的思路是缩短预计算的时间。根据具体数据,单就上面的第3点就花费了整体一半的时间,达到了惊人的2.3秒,主要原因还是此处计算量太大:5级的 mipmap 的 cubemap, 解决方案是将此处的纹理大小设小一些,最后我设置的是 64x64 的 cubemap, 程序运行正常不再崩溃,不过耗时还是很长,需要1.5秒左右。

Time Profile:

----------------------------------------------------------------------------
|
|||||||||||||||||||||||||||||||||||||||||| 4278 Total PBR pre-baker time |
|
||||||||||||||||||||||||||||||||||||||| 3905 Shader running process time |
|
||||||||||||||||||||||| 2368 Only IBL Part 1 PrefilterMap process time |
|
--------------------------------------------------------------------------- Time in ms
Running on Oppo R17 Pro
(CPU: Qualcomm Snapdragon 710, 64-bit, octa-core processor 2.2GHz, GPU: Adreno 616)

Android GL deadlock timeout error的更多相关文章

  1. MySQL - “Timeout error occurred trying to start MySQL Daemon”解决方法

    前几天,网站出现Many connections的问题,进入mysql,show full processlist发现有154个进程,晕....直接service mysqld restart 但是不 ...

  2. [置顶] Bug 11775332 - cluvfy fails with PRVF-5636 with DNS response timeout error [ID 11775332.8]

    Bug 11775332  cluvfy fails with PRVF-5636 withDNS response timeout error but error text is not clear ...

  3. 运行android模拟器,emulator: ERROR: x86 emulation currently requires hardware acceleration!

    运行android模拟器,emulator: ERROR: x86 emulation currently requires hardware acceleration! 问题: 运行android模 ...

  4. Appium 连手机失败Error: Android bootstrap socket crashed: Error: getaddrinfo ENOTFOUND localhost undefined:4724

    问题:Appium执行,连接手机报下面的错误 Error: Android bootstrap socket crashed: Error: getaddrinfo ENOTFOUND localho ...

  5. Android studio 编译失败Error:Could not read entry &#39;:app:processDebugManifest&#39; from cache taskArtifacts.b

    Android studio 编译失败 Error:Could not read entry ':app:processDebugManifest' from cache taskArtifacts. ...

  6. Qt for android运行时出错 Error: Target id 'android--1' is not valid

    [提问]windows7下Qt for android运行时出错 Error: Target id 'android--1' is not valid[复制链接] 上一主题下一主题   离线yijun ...

  7. 504 Gateway Timeout Error 502 Bad Gateway

    总结 1. 502没有收到相应,或者收到了但不及时? cannot get a response in time 540收到了无效的响应 received an invalid response fr ...

  8. Mysql Solution - Timeout error occurred trying to stop MySQL Daemon. Stopping MySQL: [FAILED] -

    错误例如以下: Timeout error occurred trying to stop MySQL Daemon. Stopping mysqld:                         ...

  9. 解决Android Studio运行时报Error:java.lang.NullPointerException (no error message)错误

    原文:解决Android Studio运行时报Error:java.lang.NullPointerException (no error message)错误                    ...

随机推荐

  1. XSS(笔记1)

    概念 跨站脚本(Cross-Site Scripting,XSS) 发生在目标网站中目标用户的浏览器层面上,当用户浏览器渲染整个HTML文档的过程中出现了不被预期的脚本指令并执行时,XSS就会发生.为 ...

  2. 系列博文-LowPoly风格的图像生成器

    https://github.com/Ovilia/Polyvia http://www.zhihu.com/question/29856775/answer/57668656 http://zhan ...

  3. 数据结构的javascript实现

    栈 栈(stack)又名堆栈,是一种遵循后进先出(LIFO)原则的有序集合.新添加或待删除的元素都保存在栈的末尾,称作栈顶,另一端称作栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底. functio ...

  4. websocket(一)--握手

    最近在琢磨怎么实现服务端的消息推送,因为以前都是通过客户端请求来获取信息的,如果需要实时信息就得轮询,比如通过ajax不停的请求. websocket相当于对HTTP协议进行了升级,客户端和服务端通过 ...

  5. Python分词模块推荐:jieba中文分词

    一.结巴中文分词采用的算法 基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合对于未登录词,采 ...

  6. TestNG失败用例自动截图

    参考:https://blog.csdn.net/wangxin1982314/article/details/50247245 1. 首先写一个截屏方法 public class ScreenSho ...

  7. C++中将整型数与字符串型之间的类型转换

    整数转换成字符串类型: 方法一: 这里用到了char *itoa(int value, char *string, int radix); 函数当中参数为:int value 被转换的整数,char ...

  8. PCB设计检查

    一.资料输入阶段1.在流程上接收到的资料是否齐全(包括:原理图.*.brd文件.料单.PCB设计说明以及PCB设计或更改要求.标准化要求说明.工艺设计说明文件)2.确认PCB模板是最新的3. 确认模板 ...

  9. 前端学习笔记之CSS选择器

    阅读目录 一 基本选择器 二 后代选择器.子元素选择器 三 兄弟选择器 四 交集选择器与并集选择器 五 序列选择器 六 属性选择器 七 伪类选择器 八 伪元素选择器 九 CSS三大特性 一 基本选择器 ...

  10. WebGL three.js学习笔记 阴影与实现物体的动画

    实现物体的旋转.跳动以及场景阴影的开启与优化 本程序将创建一个场景,并实现物体的动画效果 运行的结果如图: 完整代码如下: <!DOCTYPE html> <html lang=&q ...