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 的预计算,常规计算,主要分四个部分:

  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)

转载于:https://www.cnblogs.com/psklf/p/10774096.html

Android GL deadlock timeout error相关推荐

  1. Android Studio编译问题-Error:Could not find org.jetbrains.trove4j

    Android Studio编译问题-Error:Could not find org.jetbrains.trove4j 一般来说是AS加载各种包或者库时失败导致的,有可能是网络原因. 因此我们更换 ...

  2. oracle ipc message,【案例】Oracle RAC IPC send timeout error导致RAC的节点挂起解决办法

    天萃荷净 Oracle研究中心案例分析:运维DBA反映Oracle RAC环境数据库节点挂起,分享日志发现是由于IPC send timeout error导致RAC的节点挂起. 本站文章除注明转载外 ...

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

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

  4. golang http Specifically check for timeout error

    Specifically check for timeout error 特异性识别 golang http client 的超时错误 1 package main23 import (4 " ...

  5. Gradle ‘Android‘ project refresh failed Error:Connection timed out: connect

    Gradle 'Android' project refresh failed Error:Connection timed out: connect 解决办法: 工程下的gradle里面的jcent ...

  6. 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 ...

  7. 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 ...

  8. 【错误记录】Flutter / Android 报错 ( AAPT: error: attribute android:requestLegacyExternalStorage not found )

    文章目录 一. 报错信息 二. 问题分析 三. 解决方案 一. 报错信息 Flutter 使用 image_picker 时 , 需要进行 AndroidX 兼容 , 设置了 Android 编译 S ...

  9. 解决ionic3 android 运行出现Application Error - The connection to the server was unsuccessful

    在真机上启动ionic3打包成的android APK,启动了很久结果弹出这个问题: Application Error - The connection to the server was unsu ...

最新文章

  1. python常用命令汇总-Python爬虫框架Scrapy常用命令总结
  2. 主叫号码未显示怎么设置_微信未授权抖音,应该怎么设置?
  3. 网络上常用的一些网站
  4. [NOIP2018]铺设道路
  5. 下载丨Linux+Oracle 11g+RAC+12cc+adg国内业界最详细生产系统下实施文档
  6. WPF 中的Width 与 ActualWidth
  7. Java面试题之 static执行顺序
  8. Linux系统结构图
  9. 安装informatic过程中的错误
  10. 游戏开发中的沟通成本
  11. MSP430 MSP430单片机输入/输出模块 通用I/O端口GPIO
  12. 如何给页面添加背景音乐
  13. B样条曲线的公式推导及代码实现
  14. 所谓键位冲突和无冲突的各种原理
  15. iOS让屏幕保持常亮,不自动锁屏
  16. 2021 百度网盘网页版 倍速播放技巧(亲测有效)
  17. Sharding-Sphere的新一代Zookeeper注册中心实现剖析
  18. 在谷歌浏览器中自动翻译文本
  19. Zabbix怎么监控奇安信网神防火墙
  20. pythonset使用教程_set常见方法_清华尹成python入门教程_少儿编程视频-51CTO学院

热门文章

  1. node.js入门 - 9.api:http
  2. POJ1321 棋盘问题
  3. 网络操作系统与通常的操作系统的区别
  4. Spring使用Quartz配置调度事务
  5. IEnumerable是否应该实现IEnumerable接口
  6. CSS3中的transform变形
  7. HBase-scan API 通过scan读取表中数据
  8. golang中的Session支持
  9. Linux开启动过程详解
  10. 在QT的LineEdit框中输入特定字符(正则表达式的使用)