【踩雷】android 中UI线程内调用gl指令的结果
2014-01-27 17:09
316 查看
采用新架构结果测试提了一个神奇的BUG:打开应用程序硬件加速功能后,开启XX功能以后,View上的button和view背景都变成黑色色块,如下图:
同事追查的结果哭笑不得:UI线程中调用调用了glDeleteTextures函数。
每个GLContext都是单独一个GL环境,互不影响,类似OS中的两个进程空间。当开启硬件加速以后,UIView的GLContext中,所有view的纹理随机分配。GLSurfaceView的GLContext中,所有纹理ID也随机分配。
android的GLSurfaceView继承UIView即为UI主线程,其内部单独管理一个GL绘制线程。 UI线程中错误地调用GLSurfaceView中的glDeleteTextures,调用者本意是删除GLSurfaceView的一批纹理,结果实际上是 删除了UIView的GLContext中的对应ID的纹理。
android 中暂不支持定义自定义GLContext,不支持多线程共享GLContext,所以gl指令只能在GL线程中调用。。。
同事追查的结果哭笑不得:UI线程中调用调用了glDeleteTextures函数。
每个GLContext都是单独一个GL环境,互不影响,类似OS中的两个进程空间。当开启硬件加速以后,UIView的GLContext中,所有view的纹理随机分配。GLSurfaceView的GLContext中,所有纹理ID也随机分配。
android的GLSurfaceView继承UIView即为UI主线程,其内部单独管理一个GL绘制线程。 UI线程中错误地调用GLSurfaceView中的glDeleteTextures,调用者本意是删除GLSurfaceView的一批纹理,结果实际上是 删除了UIView的GLContext中的对应ID的纹理。
android 中暂不支持定义自定义GLContext,不支持多线程共享GLContext,所以gl指令只能在GL线程中调用。。。
相关文章推荐
- Android错误(子线程调用Toast报Can't create handler inside ~~~ 错误)
- WebView Android 调用js且需要获取返回结果
- .Android用Handle调用线程与用Thread直接创建线程的区别?
- Android调用系统关机指令
- Android Priority Job Queue (Job Manager):后台线程任务结果传回前台(三)
- Android 调用系统相机拍照的返回结果
- Android中Toast如何在子线程中调用
- Webservice 封装为 Thread 在主线程进行调用--Android
- Android 系统调用实现函数功能--SVC指令的实现与检测
- Android Priority Job Queue (Job Manager):后台线程任务结果传回前台(三)
- android上子线程中调用GPS功能
- Android Handle调用线程和Thread直接创建线程的区别小结
- 调用android的Camera 执行结果没有回调onActivityResult()
- 为什么unity不能调用含有GL线程的dll库
- Android中Looper的实现原理,为什么调用Looper.prepare()就在当前线程关联了一个Looper对象,它是如何实现的。
- android 调用 su 指令
- 另开了一个线程,线程里面一个函数调用UpdateData(false),结果就出错,为什么?
- 调用android的Camera 执行结果没有回调onActivityResult()
- Android中Toast如何在子线程中调用
- Android消息机制之实现两个不同线程之间相互传递数据相互调用