【 Android官方文档读书笔记】硬件加速

为了让应用在Android系统运行起来更加流畅,从3.0开始,Android 2D的绘制流程就设计为能够更好地支持硬件加速。所谓硬件加速就是使用GPU进行View上的绘制操作,从而是渲染速度更快,应用体验更加流畅。

1,启动硬件加速的方法

启用硬件加速的最简单方法就是为整个系统打开硬件加速的全局设置,然而硬件加速并不支持所有2D画的操作,所以开启硬件加速可能会对使用自定义组件的应用程序造成影响,问题常常表现在不可见的元素异常和错误的像素渲染。为了解决这个问题Android可以选择启动或者禁用以下级别的硬件加速: Application 、 Activity 、Window 和 View 。

Application级:在Android Manifest文件中的<application/> 方法中添加属性android:hardwareAccelerated="true" 。

Activity级:在Android Manifest文件中,找到特定的Activity的<activity/> 方法中添加属性android:hardwareAccelerated="true" 。

Window级:通过代码实现,如下。在Window级,只能开启不能禁用硬件加速。

getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

View级:通过代码实现,如下。在View级,只能禁用无法开启硬件加速。

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)。

2,Android绘制模型

Android 4.0之后,提供了两种绘制模型,一种是基于软件的绘制模型,另一种是基于硬件的绘制模型。开启硬件加速之后,会使用基于硬件的绘制模型。

基于软件的绘制模型:当一个View的invalidate被调用后,系统会马上重新绘制view hierarchy中与更新区域相交的View。

基于硬件的绘制模型:当一个View的invalidate被调用后,系统不会马上去绘制,而是将其记录在显示列表中,在绘制时只更新调用了invalidate的View,其他则与之前显示列表一样显示出来。

3,Android View的层及其分类

所有的Android版本都有能力对离屏缓冲进行渲染,或者是使用View的绘制缓冲,或者是使用Canvas.saveLayer()函数。由Android 3.0开始就能够通过View.setLayerType()方法对何时以及如何使用层有了更多的控制。一个View可以使用如下的三种layer类型之一:

LAYER_TYPE_NONE: 这个View将被按普通的方式进行渲染,但是不会返回一个离屏的缓冲,这个是默认的行为。

LAYER_TYPE_HARDWARE:如果这个应用被硬件加速的话,这个View将会在硬件中渲染为硬件纹理,如果应用程序并没有被硬件加速,则其效果和LAYER_TYPE_SOFTWARE是相同的。

LAYER_TYPE_SOFTWARE: 此View 通过软件渲染为一个bitmap。

4,硬件加速的优势以及问题

对Android通用的应用来说,开启硬件加速会带来以下好处:

(1)更快的渲染速度,基于硬件的绘制模型使得应用在更新View的时候,能少做一些重绘动作。

(2)更流畅的操作体验,滑屏动作、动画会更平滑。当对一个复杂的View进行动画操作时,因为要进行很多的画操作,所以并不可能总是能达到60帧每秒。在这种情况下可以通过硬件层来渲染为硬件纹理来提高性能。硬件纹理操作可以用作对一个view进行动画操作,当进行动画的时候可以减少对View自身频繁的重绘。

(3)对视频的支持更好。

但是开启硬件加速也会带来一些问题:

(1)占用内存更多。

(2)固件支持不统一,3.0以上的固件才支持,且后续版本支持的标准也不一样。

(3)不支持一些特定的渲染。

时间: 2024-12-21 23:02:10

【 Android官方文档读书笔记】硬件加速的相关文章

【 Android官方文档读书笔记】保存数据

Android提供了3种数据保存方式:SharePreference.文件与数据库. 1,SharePreference 如果想保存一个相对较小的key-values集合,可以使用 SharedPreferences API. SharedPreferences对象指向包含key-value对的文件,并且提供简单的读写方式.每个SharedPreferences文件均由框架管理,私人或共享均可使用.其本质是一个xml文件. 数据读入: SharedPreferences sharedPref =

【 Android官方文档读书笔记】连接网络

网络连接时应用的最基本的功能之一,Android系统对网络连接进行了封装,使得开发者能够更快的给应用增加网络功能.大多数网络连接的Android应用使用HTTP发送和接受数据,Android包括两个HTTP客户端:HttpURLConnection和Apache HttpClient.开发者可以使用这两个客户端中的任意一个去完成网络连接. 1, 网络连接的基本步骤: (1)增加权限:manifest文件中必须包含以下权限 <uses-permission android:name="and

django官方文档读书笔记

写在前面:这算是第二次读英文原文文档,第一次是读scrapy,感觉还是要做笔记,好记性不如烂笔头,现在已经忘了scrapy文档讲了什么了,心疼.以后要多读多写 经过半年的基础学习(懒,拖延)终于来到web开发这一步,当时买了董大的web实战,准备是用flask来实现的,但是后面在逼乎上找到某培训班的django视频资源,所以最终还是决定用django. 看过各种对django的评价之后,个人总结django是一个已经高度框架化的框架了(笑),他的每一部分M,V,T都已经帮用户分好了,用户可自主选

【android官方文档】与其他App交互

发送用户到另外一个App YOU SHOULD ALSO READ 内容分享 One of Android's most important features is an app's ability to send the user to another app based on an "action" it would like to perform. For example, if your app has the address of a business that you'd

Android官方文档之App Components(Common Intents)

Intent的真正强大之处在于它的隐式Intent,隐式Intent需要配合Intent-filters使用,有关这方面的概念和知识,您可以参考我翻译的官方文档:<Android官方文档之App Components(Intents and Intent Filters)>. 隐式Intent足够强大,以至于系统提供了大量的Intent方便开发者启动系统应用程序,本文将介绍一些常用的隐式Intent.以及如何自定义intent-filters以匹配隐式intent. 如需阅读官方原文,您可以点

Effective Go(官方文档)笔记

Effective Go(官方文档)笔记 自己主动局部变量提升(编译期完毕?):return &...; 内置函数: new/make copy, append delete range(这是keyword吧?由于后面没有()) array是值对象 slice:引用array 2维切片(略) map if seconds, ok := timezone[tz]; ok { ... func (f *File) Read(buf []byte) (n int, err error) { ... 注

Android官方文档之App Resources(中)

本文将继续介绍App Resources中的资源类型(Animation.Color State List.String.Style). 如果需要了解Android中的资源规范,您可以访问我翻译的这篇官方文档:<Android官方文档之App Resources(上)>. 如需访问官方原文,您可以点击这个链接:<Resource Types>. 在下一篇文章中(Android官方文档之App Resources(下)),将介绍App Resources中其余的资源类型(Layout

Android 官方文档:(二)应用清单 —— 2.26 &amp;lt;uses-permission&amp;gt;标签

syntax: <uses-permission android:name="string"         android:maxSdkVersion="integer" /> contained in: <manifest> description: Requests a permission that the application must be granted inorder for it to operate correctly.

Android 官方文档:(一)动画和图像 —— 1.5 画布和画图

The Android framework APIs provides a set 2D drawing APIs that allow you to render your owncustom graphics onto a canvas or to modify existing Views to customize their look and feel.When drawing 2D graphics, you'll typically do so in one of two ways: