Graphic-----Android硬件加速与软件加速( Hardware acceleration)

参考官方文档

区别
  • 硬件加速

    1. 记录绘制的操作(RenderList)
    2. 使用GPU加速
    3. 部分绘制操作不支持
  • 软件加速

    1. 直接进行绘制
    2. 使用CPU

Hardware accelerate:
3.0,API 11开始引入,API14默认开启

HW level

APP《=== Activity 《=== window《=== View

<application android:hardwareAccelerated="true">
<activity android:hardwareAccelerated="false" />
getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

注意
view层次上只能通过 viewlayer来 关闭HWA(hardware acceleration),而view layer主要是别的功能: 关于view layer文章

查询是否HW
Canvas.isHardwareAccelerated()
View.isHardwareAccelerated()
Android绘制模型

Software drawing model

步骤:
1. Invalide hierarchy (使View的各个层级无效)
2. Draw hierarchy(绘制View的各个层级)

  • 当View的内容改变时,会call invalidate() (或该方法的变种)
  • invalidation的信息会传播到view hierarchy的整个层级,来计算需要重绘的区域(the dirty region脏区).
  • 系统绘制所有 与 脏区相交的View
弊端
  1. 绘制时执行很多冗余代码。例如,button在其他的View上,调用button.invalide(),绘制时会重绘制 其他View,即便其他的View都不曾改变
  2. 会隐藏一些bug。比如,某些View改变内容却没有invalide,而是依赖于 脏区与它相交的View invalide,就导致后者不断invalide(这算弊端吧。。。。)

Hardware drawing model

  1. Invalide hierarchy
  2. Record and update display list
  3. Draw ths display list
    • 系统仍旧使用invalidate() 和 draw(),去请求屏幕更新 和 绘制views
    • 但是真正的处理有所不同:不会立即绘制,而是将绘制记录 一个绘制列表(DisplayList,包含view hierarchy的绘制代码)中
    • 另一个优化:系统只更新记录被invalidate()标记为dirty的views.没有被invalide只需要用上次的display list就可以
注意

这个模型中,view不是依照脏区进行draw() 的调用,而是依赖于View的invalidate(相关demo示例)

display list好处

动画性能

因为设置特定的属性(如 透明度、旋转角度)不需要invalidating target View(动画的View)。

2.View
举例

垂直的LinearLayout中包含ListView和Button。
LinearLayou的DisplayList:

DrawDisplayList(ListView)
DrawDisplayList(Button)

假设要改变ListView的透明度(opacity),listView.setAlpha(0.5f)。
LinearLayout的DisplayList:

SaveLayerAlpha(0.5)
DrawDisplayList(ListView)
Restore
DrawDisplayList(Button)

这样ListView复杂的draw代码没有执行,而只是更新了LinearLayout的Display list。如果不允许硬件加速,ListView和LinearLayout的绘制代码都会再次执行。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值