Android——硬件加速(Hardware Acceleration)

View系列:硬件加速,从理论到实践 //开启 getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); View 目前在视图级别无法启用硬件加速 myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);// 关闭 确定是否经过硬件加速 如果 View 已附加到硬件加速窗口,则 **View 阅读详情

从Android3.0(API Level 11)开始,Android 2D渲染管道能够更好的支持硬件加速。硬件加速执行的所有的绘图操作都是使用GPU在View对象的画布上来进行的。因为启用硬件加速会增加资源的需求,因此这样的应用会占用更多的内存。

硬件加速在target api大于等于14的情况下,是默认开启的,但是我们也可以显示的开启硬件加速。如果应用程序只使用标准的View和Drawable,那么打开全局硬件加速不会导致任何不良的绘制影响。然而,由于硬件加速并不支持所有的2D图形绘制操作,因此对于那些使用定制的View和绘制调用来说,打开全局硬件加速,会造成影响。对于这个问题,通常是对那些不可见的元素进行了异常或错误的像素渲染。为了避免这种问题,Android提供了多个级别的硬件加速操作(开启或者关闭),具体可见控制硬件加速。

如果应用程序执行了定制化的绘图,并且开启了硬件加速,那么就要在带有硬件加速的真机上测试,以便发现问题。 不支持的绘制操作描述了硬件加速的问题,以及如何解决它们。

控制硬件加速(Controlling Hardware Acceleration)

android提供了以下四个个级别来控制硬件加速:
ApplicationActivityWindowView

Application级别

在应用的Android清单文件中,把下列属性添加到元素中,能够开启整个应用程序的硬件加速:

?
1
</application>

Activity级别

如果应用程序不能正确的使用被打开的全局硬件加速,那么也可以在Activity级别上进行控制。在元素中使用android:hardwareAccelerated属性,能够启用或禁止Activity级别的硬件加速。以下示例启用全局的硬件加速,但却禁止了一个Activity的硬件加速:

?
1
2
3
4
     
     
</activity></activity></application>

Window级别

如果需要更精细的控制,就可以使用下列代码来针对给定的Window来启用硬件加速:

?
1
2
3
getWindow().setFlags(
     WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
     WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

注意:当前情况,不能在Window级别禁止硬件加速。

View级别

在运行时,可以针对一个独立的View对象使用下列代码来禁止硬件加速:

?
1
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null );

注意:当前情况,不能在View级别开启硬件加速。View Layer除了禁止硬件加速以外,还有其他的功能,更多的相关信息请看本文的View layer。

判断一个View对象是否被硬件加速

有些时候,知道当前的View对象(尤其是那些定制的View对象)是否被硬件加速对应用程序来说是非常有用的。如果应用程序做了很多定制的绘图操作,并且不是所有的操作都会被新的渲染管道所支持,那么这种判断就特别有用。

有两种不同的方法来检查应用程序是否被硬件加速了:

View.isHardwareAccelerated():返回值为true,View对象跟一个被硬件加速的窗口绑定;反之,未加速Canvas.isHardwareAccelerated():返回值为true,Canvas对象被硬件加速;反之,未加速

Android的绘图模式(Android Drawing Models)

当硬件加速启用时,Android框架会采用一个新的绘图模式,这种模式利用显示列表把应用程序渲染在屏幕上。充分理解显示列表,以及它们是如何影响应用程序的,对于理解Android是如何绘制没有硬件加速的View对象也是有益的。下面分别介绍基于软件和硬件加速的绘图模式。

基于软件的绘图模式(Software-based drawing model)

在软件的绘图模式中,View对象是通过以下两个步骤来绘制的:

让View层次结构失效绘制View层次结构

无论何时,当应用程序需要更新它的UI部分时,它都会调用View#invalidate()(或者invalidate方法的相关变体)使UI内容改变。失效的消息请求会在View对象层次结构上进行一路传递,以便计算出需要重绘的屏幕区域(脏区)。然后,Android系统就会在View层次结构中绘制所有跟脏区相交的区域。不幸的是,这种绘图模式有两个缺点:

第一个问题,在每个绘图传递中,这种绘图模式都需要很多的代码执行。例如,如果应用程序调用了一个按钮的invalidate()方法,并且该按钮位于另一个View对象的上方,那么即使该View对象没有变化,那么Android系统也要重新绘制这个View对象。第二个问题,这个种绘图模式能够隐藏应用程序中的bug。由于Android系统会重新绘制其它跟脏区相交的View对象,所以即使没有调用View对象上的invalidate()方法,那么View对象内容的改变也可能会导致其它View被重绘。当发生这种情况时,就要依赖另一个被失效的View对象来获取适当的行为。这种行为能够改变每次你对应用程序的修改。因为这个原因,所以为了影响绘图代码,在修改定制View对象的数据和状态时,应该始终调用该定制View对象的invalidate()方法。

注意:在View对象的属性发生变化时,如背景色或TextView对象中的文本等,Android会自动的调用该View对象的invalidate()方法。

硬件加速绘图模式(Hardware accelerated drawing model)

这种模式下,Android系统依然会使用invalidate()和draw()来请求屏幕更新并且渲染View,但是实际的绘图操作与基于软件的绘图模式是不同的。它会立即执行绘图命令,Android系统把这些命令记录在内部的显示列表中,这个列表包含了View对象层次结构的绘图代码的输出。另一个优化是:Android系统只需要针对由invalidate()方法调用所标记的View对象的脏区进行记录和更新显示列表。没有失效的View对象能够通过重新发布先前被记录的显示列表来进行简单的重绘工作。这种新的绘图模式包含三个阶段:

让View的层次结构失效记录和更新显示列表绘制显示列表

使用这种模式,不能够依赖相交的脏区的View#draw()执行。要确保Android系统记录一个View对象的显示列表,就必须调用invalidate()方法,如果忘记调用该方法,那么在变化发生后,View对象看上去会跟变化之前相同。

使用显示列表对提升动画的性能也是有好处的,因为设置特殊属性,诸如透明度、旋转等属性时,不需要请求目标View对象失效(系统会自动做这件事)。这种优化还适用于带有显示列表的View对象(应用程序被硬件加速时的任意View对象)。例如,假设有一个包含了一个Button对象的ListView对象的LinearLayout布局,那么LinearLayout布局的显示列表如下:

DrawDisplayList(ListView)DrawDisplayList(Button)

假设现在要改变ListView对象的透明度,那么在调用ListView对象的setAlpha(0.5f)方法时,显示列表就包含了以下处理:

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

这里没有执行复杂的ListView对象的绘图代码。相反,系统只是比较简单的更新了LinearLayout对象的显示列表。在一个没有启用硬件加速的应用程序中,该列表(ListView)和它的父对象都会再次执行绘图代码。

不支持硬件加速的操作

在硬件加速的时候,2D渲染管道支持大多数的通常用于Canvas的绘图操作,以及一些很少使用的操作。被用于渲染应用程序的所有的绘图操作都有发送给Android系统,默认的Widget和布局,以及一些常用的可视效果,如反射和瓷砖的纹理效果都是被支持的。

下面给出一个链接——不同API级别上不支持的硬件加速的操作。

View Layers

在Android的所有版本中,通过使用View对象的绘图缓冲,或使用Canvas.saveLayer()方法,View都具有渲染到离屏(off-screen)缓冲区的能力。离屏缓冲区或层有多种用途,在呈现复杂的动画或使用组合效果时,能够获得更好的性能。例如,使用Canvas.saveLayer()可以实现淡入淡出的效果,先暂时把一个View对象渲染在一个层中,然后把它和不透明因子合成到屏幕上。

从Android3.0(API Level 11)开始,在如何和什么时候使用View.setLayerType()问题上,Android提供了更多的控制。这个API携带两个参数:一个是层的类型,另一个是可选的Paint对象,这个对象描述层应该如何被合成的。使用这个Paint对象能够进行颜色过滤、特殊的混合模式、或者层的透明度。View对象能够使用以下三种层类型:

LAYER_TYPE_NONE:View对象用普通的方式来渲染,并且不是由屏幕外缓存来返回的。这种类型是默认的行为。LAYER_TYPE_HARDWARE:如果应用程序是硬件加速的,那么该View对象被渲染在硬件的一个硬件纹理(texture)中。如果没有开启硬件加速,那么这种层类型的行为与LAYER_TYPE_SOFTWARE相同。LAYER_TYPE_SOFTWARE:View对象会被呈现在软件的一个位图中。根据以下目的,选择层类型:性能:使用硬件层类型,把View渲染到一个硬件纹理中。一旦该View对象被渲染到一个层中,那么它的绘图代码直到调用该View对象的invalidate()方法时才会被执行。对于某些动画,如alpha动画,就能够直接使用该层,这么做对于GPU来说是非常高效的。视觉效果:使用层类型(硬件或软件)和一个Paint对象,能够把一些特殊的视觉处理应用给一个View对象。例如,使用ColorMatrixColorFilter对象绘制一个黑白相间的View对象。兼容性:使用软件层类型会强制把一个View对象渲染在软件中。如果被硬件加速的View对象(例如,如果整个应用程序都被硬件加速)发生渲染问题,那么使用软件层类型来解决硬件渲染管道的限制是一个简单的方法。

View layers and animations

当应用程序被硬件加速的时候,硬件层能够传递更快、更平滑的动画。当播放具有复杂的绘图操作的动画时,以每秒60帧的速度播放不总是可能的。但是,可以通过使用硬件层把View对象渲染在硬件纹理中,缓解这种情况。硬件纹理能够被用于动画视图,这样在该View对象呈现动画时,就可以消除View对象所需要的重绘操作。除非该View对象的属性发生变化时(invalidate()方法被调用),它才会被重绘。如果在应用程序运行一个动画,并且没有获得想要的平滑结果,就要考虑在动画View上启用硬件层。

当一个View从硬件层被返回时,通过层方法处理的某些属性会被合成到屏幕上。因为它们不需要让View对象失效和重绘,所以设置这些属性是非常高效的。下面列出了影响层被合成的方式。调用这些属性设置器,会导致失效处理的优化,并且不会对目标View对象进行重绘:

alpha:改变层(layer)的透明度;x,y,translation,translation:改变层的位置;scaleX,scaleY:改变层的尺寸;rotation,rotation,rotationY:改变3D空间中层的方向;pivotX,pivotY:改变层的变换起源。

这些属性是在用ObjectAnimator对象给View对象设置动画时所使用的名称。如果想要访问这些属性,就要调用相应的set或get方法。例如,要修改alpha属性,就要调用setAlpha()方法。下面的代码展示了在3D空间中围绕Y轴旋转View对象的最有效的方法:

?
1
2
view.setLayerType(View.LAYER_TYPE_HARDWARE, null );
ObjectAnimator.ofFloat(view, "rotationY" , 180 ).start();

因为硬件层会消耗显示内存,因此强烈推荐只在动画播放期间启用硬件层,并且在动画播放结束后就禁用该硬件层。能够使用动画监听器来完成这种操作:

?
1
2
3
4
5
6
7
8
9
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();

更多的属性动画的信息,请看Property Animation.

Tips and Tricks

选择硬件加速的2D图形能够有效改善性能,但是为了有效的使用GPU,应该按照以下建议设计应用程序:

减少应用程序中View对象的数量

系统绘制越多的View对象,就会越慢。这种情况也适用于软件渲染管道。减少View对象的有效方法之一就是优化UI。

避免过度绘图

在彼此的顶部不要绘制太多的层。移除那些完全被别的不透明View遮盖的View。对于当前硬件的一个好的原则是,每帧的像素数不要大于屏幕上像素数的2.5倍(以位图的透明点阵数来计算)。

不要在绘图方法中创建渲染对象

一个常见的错误是每次调用渲染方法时创建一个新的Paint对象或Path对象。这样就会强制频繁的运行垃圾回收,导致绕过硬件管道中的缓存和优化。

不要经常的编辑形状

对于复杂的形状,如路径和圆,是使用纹理掩码来呈现的。每次创建或修改路径,硬件通道都要创建一个新的纹理遮罩,这样会消耗大量的资源。

不要经常的编辑位图

每次改变位图内容,它都会被再次上传到GPU的纹理,以供下次绘制。

要小心的使用alpha相关的方法

当使用setAlpha()、 AlphaAnimation或ObjectAnimator,让一个View对象半透明时,需要双倍填充率来渲染到离屏缓存。当在一个大的View对象上应用透明效果时,要考虑把View对象的层类型设置为LAYER_TYPE_HARDWARE。

Android硬件加速原理与实现 一 概述 在手机客户端尤其是 Android 应用的开发过程中,我们经常会接触到“硬件加速”这个词。由于操作系统对底层软硬件封装非常完善,上层软件开发者往往对硬件加速的底层原理了解很少,也不清楚了解底层原理的意义,因此常会有一些误解,如硬件加速是不是通过特殊算法实现页面渲染加速,或是通过硬件提高 CPU/GPU 运算速率实现渲染加速。 本文尝试从底层硬件原理,一直到上层代码实现,对硬件加速技术进行简单介绍,其中上层实现基于Android 10.0。 二 了解硬件加速对App开发的意义 对于 App 开发者, 阅读详情

相关推荐

android进阶篇二 Android硬件加速详解 Hardware Acceleration

文档地址: http://developer.android.com/guide/topics/graphics/hardware-accel.html 工作太忙没时间翻译,贴出来方便不能翻墙的同学查阅 See also OpenGL with the Framework APIsRenderscript Beginning in Android 3.0 (A

xupenghuidianzi的专栏 5046

android图形系统详解四:控制硬加速

从Android3.0 (API level11)开始,Android的2D显示管道被被设计得更加支持硬加速了.硬加速使用GPU承担了所有在View的canvas上执行的绘制操作.   启用硬加速最简单的的方法是对整个应用启用硬件速.如果你的应用只使用标准的view和Drawable,全局启用硬加速将不会带来任何负面影响.然而,因为硬加速不是被所有的2D绘制所支持,所以启用它时可能对你的...

jingwenjingwen的专栏 569

Android硬件加速:优化应用性能的关键

在移动应用开发中,为了提供更好的用户体验和更高的性能,Android开发人员经常面临着一项重要任务:优化应用程序的性能。在本文中,我们介绍了如何在Android应用中实现硬件加速,并提供了相应的源代码示例。在Android中,可以通过使用硬件加速的View来实现图形硬件加速。通过利用图形硬件加速和多媒体硬件加速,开发人员可以提高应用程序的图形性能和多媒体性能,从而提供更好的用户体验。通过使用硬件加速的MediaCodec,我们可以实现高效的视频解码,并在应用程序中流畅地播放视频。,从而启用硬件加速。

HrqShell的博客 484

Android笔记-hardwareAccelerated 硬件加速详解

从Android3.0(API Level 11)开始,Android 2D渲染管道能够更好的支持硬件加速。硬件加速执行的所有的绘图操作都是使用GPU在View对象的画布上来进行的。因为启用硬件加速会增加资源的需求,因此这样的应用会占用更多的内存。  启用硬件加速的最容易的方法是给整个应用程序都打开全局硬件加速功能。如果应用程序只使用标准的View和Drawable,那么打开全局硬件加速不会导致

Hackill 曰:敏而好学 不耻下问 2万+

Dify 1.0+内网部署全攻略:模型插件离线安装与信创环境适配

本文详细介绍了Dify 1.0+版本在内网环境中的部署全攻略,重点解析了模型工具插件的离线安装方法与信创环境适配技巧。通过实战经验分享,帮助企业在严格的内网隔离条件下高效部署AI平台,解决插件依赖和安装难题,提升大语言模型的应用效率。

weixin_29224529的博客 274

【ESP32-IDF笔记】20-配置以太网网络(W5500)

基于ESP32IDF和官方的ethernet驱动,配置W5500以太网驱动芯片,实现ESP32的有线网络

别看了,就这些信息 3471

Android 硬件加速(Hardware acceleration)

原文出处:http://www.ccbu.cc/android/android-hardware-acceleration 硬件加速 Android 3.0 (API level 11), 开始支持 所有的View 的canvas都会使用GPU,但是硬件的加速会占有一定的RAM。 在API >= 14上,默认是开启的,如果你的应用只是标准的View和Drawable,全局都打开硬件加速,是不...

^_虫虫_^的专栏 357

单细胞分析(五)——使用Harmony进行数据整合和去批次

为了保证单细胞RNA测序数据的准确性和可靠性,需要对数据进行样本去批次处理。去批次的方法包括Harmony,SeuratV3等,这些方法可以有效地消除批次效应和技术噪声,并提高单细胞RNA测序数据的质量,为后续的数据分析提供更加可靠的基础。

阅读文献,记录学习笔记 3万+

Android Hardware Acceleration(硬件加速)详解

Android对于 Hardware Acceleration的官方说明:http://developer.android.com/guide/topics/graphics/hardware-accel.html     以下是对此博客较早版本的翻译: 从Android 3.0开始,Android的2D渲染管线可以更好的支持硬件加速。硬件加速使用GPU进行View上的绘制

2099

DSP复习笔记(5)——外部接口模块XINTF

【注意】 1. 芯片型号:TMS320F28335 2. 适用于NJUSTEO李彧晟老师课程 3. 参考资料:《TMS320F28335 DSP原理、开发及应用》 4. 对应PPT第二章 5. 本章内容较多而且较为重要,请结合PPT一起复习

BerenCamlost的博客 1万+

基于深度学习的Person Re-ID(综述)

一. 问题的提出        Person Re-ID 全称是 Person Re-Identification,又称为 行人重检测 or 行人再识别,直观上可以通过两种思路进行比对,一种是 通过 静态图像(still-image)进行特征比对,另一种是通过视频的时序特征(temporal)进行 Video Re-Id。        不管是采用 图像特征比对的方法 还是 结合时序特征比

跟随技术的脚步-linolzhang的专栏 2万+

Android图形---硬件加速(Hardware Acceleration)(一)

从Android3.0(API Level 11)开始,Android 2D渲染管道能够更好的支持硬件加速。硬件加速执行的所有的绘图操作都是使用GPU在View对象的画布上来进行的。因为启用硬件加速会增加资源的需求,因此这样的应用会占用更多的内存。 启用硬件加速的最容易的方法是给整个应用程序都打开全局硬件加速功能。如果应用程序只使用标准的View和Drawable,那么打开全局硬件加速不会导

小邓(Java) 794

Zemax实现微透镜阵列光束整形(原理+仿真)

通过Zemax实现微透镜阵列的光场整形仿真。

VJCP_90909Bu0的博客 1万+

Android图形---硬件加速(Hardware Acceleration)(三)

不被硬件加速所支持的绘图操作 在硬件加速的时候,2D渲染管道支持大多数的通常用于Canvas的绘图操作,以及一些很少使用的操作。被用于渲染应用程序的所有的绘图操作都有发送给Android系统,默认的Widget和布局,以及一些常用的可视效果,如反射和瓷砖的纹理效果都是被支持的。以下列出了已知的不支持硬件加速的操作: 1. Canvas chipPath() chipRegion() dr

FireOfStar的专栏 3556

开关电源环路学习笔记(1)-为啥要知道传递函数?

做硬件都会接触到开关电源,或多或少会接触到环路补偿。很多兄弟们也提出来让我说说这个,说明大家也都很关心,也说明这个好像有点难。 就我个人而言,我也想搞明白环路这一块,也查了一些资料,视频,不过说实话,一直都还是懵的,感觉很困难。 具体感觉就是,看资料或视频的时候,感觉好像是那么回事。但是撇开之后,就又云里雾里的感觉,总有一些想法没有找到答案。 问题 比如下面我想过的问题: 开关电源有开关,根本就不是一个线性系统,传递函数是咋弄出来的? 系统环路框图的输入量为什么不是Vin,而是参考电压V

weixin_42005993的博客 1万+

【Burp入门第二十二篇】BurpSuite配置Hea插件教程+添加配置项

HaE是一个基于BurpSuite Java插件API开发的辅助型框架式插件,旨在实现对HTTP消息的高亮标记和信息提取。该插件通过自定义正则表达式匹配响应报文或请求报文,并对匹配成功的报文进行标记和提取。

等风来 9629

Android图形---硬件加速(Hardware Acceleration)(五)

本文译自:http://developer.android.com/guide/topics/graphics/hardware-accel.html View层和动画 当应用程序被硬件加速的时候,硬件层能够传递更快、更平滑的动画。当播放具有复杂的绘图操作的动画时,以每秒60帧的速度播放不总是可能。这样能够通过使用硬件层把View对象呈现在硬件纹理中,可以缓解这种情况。硬件纹理能够被用于动画视

FireOfStar的专栏 3776

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Android图形---硬件加速(Hardware Acceleration)(四)

本文译自:http://developer.android.com/guide/topics/graphics/hardware-accel.html View层 在Android的所有版本中,通过使用View对象的绘图缓冲,或使用Canvas.saveLayer()方法,View对象都具有在屏幕外缓冲区呈现的能力。屏幕外缓冲区或层由多种用途。在呈现复杂的动画或使用组合效果时,它们能够获得更好

FireOfStar的专栏 4220

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Android图形---硬件加速(Hardware Acceleration)(二)

本文译自:http://developer.android.com/guide/topics/graphics/hardware-accel.html 判断一个View对象是否被硬件加速 有些时候,尤其是对于那些定制的View对象,应用程序知道当前的View对象是否被硬件加速是十分有益的。如果应用程序做了很多定制的绘图操作,并且不是所有的操作都会被新的渲染管道所支持,那么这种判断就特别有用。

FireOfStar的专栏 4443

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

参考官方文档 区别 硬件加速 记录绘制的操作(RenderList) 使用GPU加速 部分绘制操作不支持 软件加速 直接进行绘制 使用CPU Hardware accelerate: 3.0,API 11开始引入,API14默认开启 HW level APP《=== Activity 《=== window《=== View getWindow().set...

zhjali123的专栏 2260
上一篇: Android 3.1 r1 API中文文档(6)——ImageView 结构
下一篇: 继承ViewGroup:重写onMeasure方法和onLayout方法
xiaoxiandroid
博客等级 码龄12年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值