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 occurioctl fd 60 code 0xc040094a (IOCTL_KGSL_GPU_COMMAND) failed: errno 35 Resource deadlock would occursyncForReleaseLocked: error creating EGL fence: 0x3003at 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)
转载于:https://www.cnblogs.com/psklf/p/10774096.html
Android GL deadlock timeout error相关推荐
- Android Studio编译问题-Error:Could not find org.jetbrains.trove4j
Android Studio编译问题-Error:Could not find org.jetbrains.trove4j 一般来说是AS加载各种包或者库时失败导致的,有可能是网络原因. 因此我们更换 ...
- oracle ipc message,【案例】Oracle RAC IPC send timeout error导致RAC的节点挂起解决办法
天萃荷净 Oracle研究中心案例分析:运维DBA反映Oracle RAC环境数据库节点挂起,分享日志发现是由于IPC send timeout error导致RAC的节点挂起. 本站文章除注明转载外 ...
- 运行android模拟器,emulator: ERROR: x86 emulation currently requires hardware acceleration!
运行android模拟器,emulator: ERROR: x86 emulation currently requires hardware acceleration! 问题: 运行android模 ...
- golang http Specifically check for timeout error
Specifically check for timeout error 特异性识别 golang http client 的超时错误 1 package main23 import (4 " ...
- Gradle ‘Android‘ project refresh failed Error:Connection timed out: connect
Gradle 'Android' project refresh failed Error:Connection timed out: connect 解决办法: 工程下的gradle里面的jcent ...
- android studio项目报:Error:Jack is required to support java 8 language features. Either enable Jack
1.问题描述: android studio项目报: Error:Jack is required to support java 8 language features. Either enable ...
- Android编译错误:error APT0000: Integer types not allowed (at 'layout_marginBottom' with value '150').
xamarin Android编译错误:error APT0000: Integer types not allowed (at 'layout_marginBottom' with value '1 ...
- 【错误记录】Flutter / Android 报错 ( AAPT: error: attribute android:requestLegacyExternalStorage not found )
文章目录 一. 报错信息 二. 问题分析 三. 解决方案 一. 报错信息 Flutter 使用 image_picker 时 , 需要进行 AndroidX 兼容 , 设置了 Android 编译 S ...
- 解决ionic3 android 运行出现Application Error - The connection to the server was unsuccessful
在真机上启动ionic3打包成的android APK,启动了很久结果弹出这个问题: Application Error - The connection to the server was unsu ...
最新文章
- python常用命令汇总-Python爬虫框架Scrapy常用命令总结
- 主叫号码未显示怎么设置_微信未授权抖音,应该怎么设置?
- 网络上常用的一些网站
- [NOIP2018]铺设道路
- 下载丨Linux+Oracle 11g+RAC+12cc+adg国内业界最详细生产系统下实施文档
- WPF 中的Width 与 ActualWidth
- Java面试题之 static执行顺序
- Linux系统结构图
- 安装informatic过程中的错误
- 游戏开发中的沟通成本
- MSP430 MSP430单片机输入/输出模块 通用I/O端口GPIO
- 如何给页面添加背景音乐
- B样条曲线的公式推导及代码实现
- 所谓键位冲突和无冲突的各种原理
- iOS让屏幕保持常亮,不自动锁屏
- 2021 百度网盘网页版 倍速播放技巧(亲测有效)
- Sharding-Sphere的新一代Zookeeper注册中心实现剖析
- 在谷歌浏览器中自动翻译文本
- Zabbix怎么监控奇安信网神防火墙
- pythonset使用教程_set常见方法_清华尹成python入门教程_少儿编程视频-51CTO学院