Android GL deadlock timeout error
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 的预计算,常规计算,主要分四个部分:
- HDR texture load and render to a cubemap texture
- IBL Diffuse IrradianceMap: Use the cubemap of step 1 to calcualte the irradiance cubemap
- IBL Specular Part 1: PrefilterMap: Use cubemap of step 1 to calculate the prefilter cubemap(with mipmap)
- 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的更多相关文章
- MySQL - “Timeout error occurred trying to start MySQL Daemon”解决方法
前几天,网站出现Many connections的问题,进入mysql,show full processlist发现有154个进程,晕....直接service mysqld restart 但是不 ...
- [置顶] 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 ...
- 运行android模拟器,emulator: ERROR: x86 emulation currently requires hardware acceleration!
运行android模拟器,emulator: ERROR: x86 emulation currently requires hardware acceleration! 问题: 运行android模 ...
- Appium 连手机失败Error: Android bootstrap socket crashed: Error: getaddrinfo ENOTFOUND localhost undefined:4724
问题:Appium执行,连接手机报下面的错误 Error: Android bootstrap socket crashed: Error: getaddrinfo ENOTFOUND localho ...
- Android studio 编译失败Error:Could not read entry ':app:processDebugManifest' from cache taskArtifacts.b
Android studio 编译失败 Error:Could not read entry ':app:processDebugManifest' from cache taskArtifacts. ...
- Qt for android运行时出错 Error: Target id 'android--1' is not valid
[提问]windows7下Qt for android运行时出错 Error: Target id 'android--1' is not valid[复制链接] 上一主题下一主题 离线yijun ...
- 504 Gateway Timeout Error 502 Bad Gateway
总结 1. 502没有收到相应,或者收到了但不及时? cannot get a response in time 540收到了无效的响应 received an invalid response fr ...
- Mysql Solution - Timeout error occurred trying to stop MySQL Daemon. Stopping MySQL: [FAILED] -
错误例如以下: Timeout error occurred trying to stop MySQL Daemon. Stopping mysqld: ...
- 解决Android Studio运行时报Error:java.lang.NullPointerException (no error message)错误
原文:解决Android Studio运行时报Error:java.lang.NullPointerException (no error message)错误 ...
随机推荐
- 译MassTransit 快速入门
给我看代码! 下面是MassTransit的功能设置. public class YourMessage { public string Text { get; set; } } public cla ...
- SQL Server 2000安装教程图解
SQL Server 2000安装教程图解... ============= 下面网盘链接中的SQL2000数据库在Win7和Win10系统上安装都是可以正常使用的,只不过是Win10上安装的话,需要 ...
- Centos7下安装PHP5.5,5.6,7.0----(转载记录一下)
由于centOS7 默认的php版本是5.4的,偏低,所以收录了一下怎样安装5.5/5.6/7.0版本 默认的版本太低了,手动安装有一些麻烦,想采用Yum安装的可以使用下面的方案: 1.检查当前安装的 ...
- 学会这15点,让你分分钟拿下Redis数据库
1.Redis简介 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统.Redis是一个开源的使用ANSI ...
- (二)Web应用体系结构
容器 Servlet没有main()方法,它们受控于另一个Java应用,这个Java应用称为容器(Container).我们最常见的tomcat就是这样一个容器. Web服务器应用(如Apache)得 ...
- AJAX初步学习
AJAX(Asynchronous JavaScript and XML)即异步的JavaScript与XML技术,指的是一套综合了多项技术的浏览器端网页开发技术.其实就是为了解决传统页面同步刷新,消 ...
- 【Never Stop】联赛集训记录
始于10/01/2017. Day I: T2图论,没想到.T3谜一样DP(是从来没意识到还可以这样). rank10. 下午刷了点题,CDQ也只打出一个板子,感觉自己不在状态? ========== ...
- BZOJ_3689_异或之_可持久化Trie+堆
BZOJ_3689_异或之_可持久化Trie+堆 Description 给定n个非负整数A[1], A[2], ……, A[n]. 对于每对(i, j)满足1 <= i < j < ...
- AT89S52最小系统
NC是NOT CONNECTED的缩写,即空脚. 芯片中NC引脚没有任何用途,只是限于封装形式,该引脚必须存在.
- C语言文件 "w+"与"wb+"区别
这是我今天碰到的问题,现在已经解决, 希望我的整理能够帮助到你们! w+以纯文本方式读写,而wb+是以二进制方式进行读写. mode说明: w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会 ...