View系列:硬件加速,全网首发,腾讯Android面试题

  • Android 允许在多个级别选择是启用还是停用硬件加速。
  • 启用硬件加速需要更多资源,因此应用会占用更多内存

控制硬件加速

App

<application android:hardwareAccelerated=“true” …>

Activity
Window

目前在窗口级别无法停用硬件加速

//开启
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

View

目前在视图级别无法启用硬件加速

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);// 关闭

确定是否经过硬件加速
  • 如果 View 已附加到硬件加速窗口,则 **View.isHardwareAccelerated() **会返回 true。
  • 如果 Canvas 经过硬件加速,则**Canvas.isHardwareAccelerated() **会返回 true
不受支持的绘制操作

绘制模型(原理)

  • 软件绘制:使用CPU绘制到Bitmap,然后把Bitmap渲染到屏幕
  • 硬件绘制:CPU把绘制内容转换成GPU操作,由GPU负责真正的绘制

在硬件加速关闭的时候:

Canvas绘制的工作方式是:把要绘制的内容写进一个 Bitmap,在之后的渲染过程中,这个 Bitmap的像素内容被直接渲染到屏幕。 这种绘制方式的主要计算工作在于把绘制操作转换为像素的过程,这个过程的计算是由 **CPU **来完成的。大致就像这样:

img

在硬件加速开启时:

Canvas的工作方式改变了:CPU只是把绘制的内容转换为GPU 的操作保存了下来,然后就把它交给 GPU,最终由 GPU 来完成实际的显示工作。大致是这样:

img

硬件加速更快的原因:

  • GPU分摊了工作,并且GPU计算效率更快
  • 绘制机制的改变,导致界面内容改变时的刷新效率极大提高。 (invalidate()时,其父View到顶层View不再都刷新)

硬件加速缺点:

兼容性问题 由于使用GPU(暂时)无法完成某些绘制,因此对于一些特定的API,需要关闭硬件加速,转回到使用CPU进行绘制

  • 自定义绘制时,参看api兼容性
  • 所有的原生自带控件,都没有用到 API 版本不兼容的绘制操作,可以放心使用

离屏缓冲

从 Android 3.0(API 级别 11)开始,可以通过 View.setLayerType()方法更好地控制如何及何时使用层。视图可以使用以下三种层类型之一:

  • LAYER_TYPE_NONE:视图正常渲染,不受屏幕外缓冲区支持。这是默认行为。
  • LAYER_TYPE_HARDWARE:如果应用经过硬件加速,视图在硬件中渲染为硬件纹理。如果应用未经过硬件加速,此层类型的行为方式与 LAYER_TYPE_SOFTWARE 相同。
  • LAYER_TYPE_SOFTWARE:使用软件来渲染视图,绘制到Bitmap。并顺便关闭硬件加速

所谓 View Layer,又称为离屏缓冲(Off-screen Buffer),它的作用是单独启用一块地方来绘制这个 View ,而不是使用软件绘制的 Bitmap 或者通过硬件加速的 GPU

这块「地方」可能是一块单独的 Bitmap,也可能是一块 OpenGL 的纹理(texture,OpenGL 的纹理可以简单理解为图像的意思),具体取决于硬件加速是否开启。采用什么来绘制 View 不是关键,关键在于当设置了 View Layer 的时候,它的绘制会被缓存下来,而且缓存的是最终的绘制结果,而不是像硬件加速那样只是把 GPU 的操作保存下来再交给 GPU 去计算。通过这样更进一步的缓存方式,View 的重绘效率进一步提高了:只要绘制的内容没有变,那么不论是 CPU 绘制还是 GPU 绘制,它们都不用重新计算,而只要只用之前缓存的绘制结果就可以了

基于这样的原理,在进行移动、旋转等**无需调用 invalidate()**的属性动画的时候,开启 Hardware Layer 将会极大地提升动画的效率,因为在动画过程中 View 本身并没有发生改变,只是它的位置或角度改变了,而这种改变是可以由 GPU 通过简单计算就完成的,并不需要重绘整个 View。所以在这种动画的过程中开启 Hardware Layer,可以让本来就依靠硬件加速而变流畅了的动画变得更加流畅

注意:只有在对 translationX 、translationY、 rotation、 alpha 等无需调用 invalidate() 的属性做动画的时候,这种方法才适用。因为这种方法本身利用的就是当界面不发生时,缓存未更新所带来的时间的节省。所以简单地说 这种方式不适用于基于自定义属性绘制的动画

总结

  • setLayerType(LAYER_TYPE_SOFTWARE), “顺带”关闭硬件加速
  • 关键点:translationX、 translationY 、rotation 、alpha 等无需调用 invalidate() 的属性做动画时,才适用
  • 不适用于基于自定义属性绘制的动画
使用
view.setLayerType

// 开启离屏缓存(软件渲染位图,并关闭硬件加速)
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
// 开启离屏缓存(硬件渲染位图,此时不一定正在硬件加速奥)
myView.setLayerType(View.LAYER_TYPE_HARDWARE, null);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

总结

最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司20年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

上述【高清技术脑图】以及【配套的面试真题PDF】可以点击我的GitHub免费获取

本文在开源项目:[https://github.com]中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

列技术文章等,资源持续更新中…

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值