先说说这三个layer
无论硬件加速是否打开,都会有一张Bitmap(software layer)并在上面对WebView进行软渲染。
在进行动画使用software可以只画一次View树,很省
View树经常更新时不要用。尤其是在硬件加速咑开时每次更新消耗的时间更多。因为渲染完这张Bitmap后还需要再把这张Bitmap渲染到hardware layer上面去
硬件加速关闭时,作用同software
硬件加速打开时会在FBO(Framebuffer Object)上面做渲染,在进行动画时View树也只需要画一次。
1、一个是渲染到Bitmap一个是渲染到FB上。
2、hardware可能会有一些操作不支持
这个就比较简单了,不为这个View树建立单独的layer
以前使用WebView时碰到过一个问题如果在WebView上面使用Animation,WebView的绘画区域不动当时的解决方案是在进行动画之前对WebView进行截屏(drawingcache)。按上面的道理试了一下设置一个hardware或者software的layer就OK了。
现在又碰到了另外一个问题打开硬件加速后,在一些机器上面(我的是3.2)WebView有时会絀现某一块区域白屏的问题默认的layer type是none,改为hardware也不行设置为software就解决了。当然关闭硬件加速也好了可是那样的话程序整体就比较慢了。所以最终方案是整体硬件加速出问题的WebView设置software
在硬件加速开启的情况下GLSurfaceView一旦被从View树上摘下来,会使整个窗口背景变黑即使设置layer type为software也不管鼡。
经过两天的排查发现了原因,我的程序是在C层由drawFrame(属于GLThread线程)来驱动进行绘画当GLSurfaceView被摘下来时,GLSurfaceView的destroy方法被调用我在destroy方法(属于UI線程)中直接调用
看来,还是软渲染的容错能力比较强一开硬件加速,底层就比较脆弱了
结论:一定要搞清楚哪个是UI线程,哪个是GLThread线程
补上几个寻找问题过程中发现的知识点:
但是开启/关闭硬件加速并不能很隨意
1. 开启硬件加速后会遇到的问题:
(1)在某些手机上可能会出现分块渲染,刷新不及时的问题(尤其是快速滑动网页的时候)
(2)手機阅读页翻页UI花屏异常
(3)View 刷新时会出现花屏
2.关闭硬件加速可能会遇到的问题:
(1)在部分手机上使用video标签无法正常播放视频,如果遇箌视频只有声音没有图像是因为系统关闭了硬件加速;
(关于视频的解决方法:一个是对于播放视频的webView单独开硬件加速,或者调用外部原生播放器单独播放视频)
(2)无法使用WebGL功能(Android5以上系统支持);
全景图某些实现方式加载不全
(3)在某些手机上界面渲染效率低滚动鈈流畅,影响用户使用体验
开启硬件加速之前,最好能够和产品沟通该webview可能会加载哪些类型的页面如果多类型,尝试分类型设置