Android进阶

Android 硬件加速简介

2017-08-22  本文已影响129人  wanderingGuy

硬件加速的原理

将view的绘制函数转化成OpenGL中的函数来完成绘制。

软件绘制与硬件绘制的区别

  1. 无效化View层次结构
  2. 绘制View的层次结构

绘制的特点:
当应用需要更新它的一部分UI,它会调用view的invalidate方法,无效化消息就会通过各种途径传递到View的层次结构,然后计算屏幕中需要重绘的区域(脏区域),android系统还会对View层次结构中脏区域相交的所有view进行绘制。

不足:
1. 这个模式在每一次绘制都需要执行大量的代码,比如,如果你的应用对一个button调用invalidate,而这个button坐标在其他view的上方,那么android系统就会重绘这些view,即使他们没有发生改变,仅仅因为它们处于和button相交的区域。
2. 由于一个view的绘制可能导致另一个view重绘,因此会引起一些不被注意到的bug。

  1. 无效化View的层次结构
  2. 记录和更新显示列表
  3. 绘制显示列表

android系统依然使用invalidate和draw函数来请求屏幕刷新渲染界面,但实际上绘制的时候是有区别的,不同于立即执行绘制命令,android系统会先把它们记录在display list上,这个display lists包含view的层次结构的绘制代码。其他的优化是android系统只需要记录和更新display lists,通过调用invalidate函数来标记那些脏view,那些没有被标记为invalidate的view可以简单的进行重绘通过事先记录在display list上的记录。

举个栗子:
例如,假设有一个LinearLayout在Button上面有一个ListView,那么对于LinearLayout的display list就会像这样的:
DrawDisplayList(ListView)
DrawDisplayList(Button)
假设现在你通过调用setAlpha(0.5)来修改ListView的透明度,那么display list就变成这样了:
SaveLayerAlpha(0.5)
DrawDisplayList(ListView)
Restore
DrawDisplayList(Button)

关于ListView的复杂的绘制代码并没有被执行,系统只是更新了LinearLayout的display list,如果应用没有启用硬件加速,那么listview以及它的父容器LinearLayout的绘制代码都会再次执行。

硬件加速的优势

硬件加速的弊端

tips

View.setLayerType(View.LAYER_TYPE_HARDWARE, null);
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "rotationY", 180);
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
      view.setLayerType(View.LAYER_TYPE_NONE, null);
  }
});
animator.start();
上一篇 下一篇

猜你喜欢

热点阅读