现在的位置: 首页 > 综合 > 正文

android硬件加速以及渲染基础知识

2017年02月25日 ⁄ 综合 ⁄ 共 1883字 ⁄ 字号 评论关闭

目前,还不能在窗口级别禁用硬件加速功能,但是可以开启它。指定窗口开启硬件加速,使用如下代码:

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

View正好相反,在View级别不能启用硬件加速,但是可以view级别禁用硬件加速,禁用view硬件加速使用代码如下:

view.setLayerType(View.LAYER_TYPE_SOFTWARE,null);

如何确定硬件加速是否被开启了呢,可以使用view对象或其底层的canvas的isHardwareAccesslerated()方法、

在android 4.0(api14)以上版本中,默认对所有应用程序都开启了硬件加速。

view可以使用以下三种layer:

1、LAYER_TYPE_NONE:view被正常绘制,也就是不使用layer。这是默认情况

2、LAYER_TYPE_HARDWARE:启用了硬件加速,使用此layer可以使动画更为平滑,并提高画绘图类应用程序的性能,在动画过程中,view不再持续重绘,只是在属性变化时或者调用了invalidate()方法后才会重绘,因此此类layer将会让动画变得平滑。因为硬件layer需要占用占用显示器存储,仅在动画过程中使用,然后就被删除。如果应用程序没有启用硬件加速,此layer将与layer_type_software的表现一样。

3、LAYER_TYPE_SOFTWARE:layer中的view以软件方式绘制,为了禁用view的硬件加速,将会应用此layer;因此view将会以软件方式绘制。

setLayerType()方法来设定view layer的类型和时间,layer能使view避免调用invalidate()方法之前的重绘,所以能改善应用程序的性能。

在android中GUI线程不仅承担绘制所有view的任务,还负责处理与用户的交互。如果GUI线程忙于view的快速刷新,应用程序的效率将会降低,在游戏应用,3d图形应用,以及其他需要快速刷新view或执行资源密集性操作的应用中,GUI线程将会疲于应付繁重的任务,应用程序的性能将显著降低,为了解决这类应用的问题,可以使用SurfaceView。surfaceview在view的层次结构中拥有专用的绘图surface。他使用后台线程绘制并刷新view,因此能减轻GUI线程的负担,使之能腾出手来处理其他任务。surfaceview控制着surface的格式、大小和屏幕位置。surfaceview将创建一个surface,除GUI线程之外的任何线程都可以在此surface上绘制图形,改善应用程序性能的思路就是在单独线程中执行绘图任务。

TextureView与surfaceView一样,推荐使用textureView,应为它克服了surfaceView的一些缺点。通过在独立的线程完成绘制和更新任务,surfaceView改善了应用程序的性能,但他需要创建一个单独的窗口,并不能用于普通的view。因此,他无法实现图像变换,也就是说,surfaceview无法移动缩放或者旋转。textureview可以,但是依赖于硬件加速和sufaceTexture,仅能能用于硬件加速,否则绘制不出任何东西。textureview可以显示一个视频流(比如视频摄像头的预览画面)并对其进行变换。

为了能以最佳的方式进行图形处理,android设备使用了一个专用的GPU(图形处理单元),gpu减轻了cpu的负担,使其解脱出来执行其他的计算任务,为了能使GPU中渲染2d和3D图形,系统使用了强大的跨平台图形API-----OpenGL。ES表示嵌入式系统embedded System、

GLSurfaceView该类是利用opengl api绘制图形的View容器,更确切地说,glsurfaceview提供了一个surface来渲染2D和3D图形,它还提供显示图形的位置,要使用glsurfaceview类,需要创建一个实例并加入一个渲染器(renderer)。

GLSurfaceView.Renderer该类控制着OpenGL GLSurfaceView中的图形绘制。他是定义方法的接口,这些方法决定了要在glsurfaceview上画什么和怎么画。为了保证渲染的性能,要使用GUI以外的专用线程来进行渲染。

抱歉!评论已关闭.