现在的位置: 首页 > 综合 > 正文

Android View和GLSurfaceView使用OpenGL绘制对比

2017年02月23日 ⁄ 综合 ⁄ 共 1494字 ⁄ 字号 评论关闭


OpenGL和View效率对比测试

 

1View OpenGL渲染速度对比

2OpenGL GLSurfaceView覆盖View效率对比

 

 

实验 小米盒子2:

1全屏绘制一张bitmapView用时和OpenGL用时相同,稳定20ms左右。

 

2GLSurfaceView覆盖到View上时,SurfaceViewView同时刷新(OpenGL线程不断循环刷新,View循环刷新)其分别刷新时间均为为28ms左右

 

3只让OpenGL线程刷新,OpenGL用时20ms左右,只让View刷,View用时24ms左右。

 

4、不覆盖GLSurfaceView,界面上多个View,让界面上的所有View都循环刷新,不稳定的跳动到23ms 25ms 27ms

 

androidView也是使用OpenGL硬件加速方式绘制的,Android 3.0以后全面支持,之前使用软实现

 

软实现方式

    界面有变动时会重新绘制变动区域,好处是其它不变动的区域不用重新绘制,坏处是会多出来绘制变动区域周边部分View的代价,而且绘制速度慢。

 

硬件加速实现方式:

    ViewOpengl实现是利用了OpenGL显示列表特性,显示列表就像指令一样存在哪里,是OpenGL里面绘制最快的方式,当一个View有变动时会去更新此View的显示列表,OpenGL重绘需要绘制界面上的所有。

好处是绘制速度快比软实现方式快,但其不能只重绘有变动的区域。

 

SurfaceView


此图不是自己绘制的哈,别人博客里面拿过来的,原谅我。

 

SurfaceView在SurfaceFlinger这边会有一个单独的Layer,这也是SurfaceView可以再非主线程操作的原因之一,在View之上叠加一个GLSurfaceView相当于整个应用多了一个OpenGL渲染线程。

 

当View有变动时,会触发绘制View的OpenGL线程刷新页面,而如果此时GLSurfaceView的线程也在run的话,可以理解为这两个线程竞争gpu资源。那么他们各自渲染一帧的时间会增多。

 

同时run时,时间不是两者之和,个人猜想是因为渲染一帧的时间为我们在onDraw方法里面写的代码执行时间+OpenGL绘制时间+surfaceFlinger合并surface到屏幕显示时间,后者大概用了16ms,一篇文章上写的大概是16ms为一个周期渲染到屏幕。

 

 

层级复杂渲染慢的原因分析:

当某个View有变化时,Android需要重新计算与它相关的一切,然后更新生成与它相关的一切View的显示列表,这是要花费时间的,所以可得出如果变动的View多,那么会减少其帧率。

 

 

Android的Animation方式

 

1、绑定一个Animation到触发Animation start会有一个时间间隔,根据情况,时间间隔不定,有时会多达1s。

2、如果Animation时主线程还在做一些其它事情,比如广播处理等方面内容,耗时太大时,阻塞ui绘制,导致Animation动画不流畅,我们还无法控制。Animation start到end的时间会增多,更加让用户觉得卡顿。

 

 

OpenGL的Animation 方式

1、Animation触发能做到即时触发

2、start到end的总时间可控制,可以不用受到帧率的影响,导致总时间不一样,时间到,位置到。

3、使用被动渲染,可做到只要表面无变化就停止渲染,不抢占gpu,不影响底层View的绘制。

4、需要尽量控制底层View和GLsurfaceView不同时有内容变化,底层动则上层动,底层不动上层才可动。

抱歉!评论已关闭.