Android中的硬件加速
前言
从andoroid 3.0开始,Android的2D渲染管线可以更好的支持硬件加速。硬件加速是使用GPU进行View上的绘制操作。
硬件加速的级别
- application
- activity
- window
- view
为何有多级别的硬件加速
硬件加速可以带啦性能的提升,为什么android不直接全部使用硬件加速,而是区别出来多级硬件加速呢?因为并不是所有的2D图形操作都支持硬件加速的。例如在应用中使用了自定义的视图或者绘图调用,这时使用硬件加速,应用可能会错误运行。当然了,如果只是使用标准的视图和drawable那是不会有问题的。
代码解释
application和activity级别的硬件加速,可以直接在AndroidManifest.xml中进行相关的属性配置。
application级别<application android:hardwareAccelerated="true" >
activity级别
<activity android:hardwareAccelerated="true">
application & activity
<application android:hardwareAccelerated="true"> <activity android:hardwareAccelerated="false"/> </application>
window级别(java代码中)
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
view级别(关闭操作)
mTestView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
【注】view级别是无法打开硬件加速的,但是可以关闭,因为有很多自定义的view是不支持硬件加速的。
不支持硬件加速的绘图操作(摘录)
不支持的 |
---|
Canvas | Paint |
---|---|
clipPath() | setLinearText() |
clipRegion() | setMaskFilter() |
drawPicture() | setRasterizer() |
drawPosText() | |
drawTextOnPath() | |
drawVertices() |
开启后效果改变 |
---|
Canvas | |
---|---|
clipRect() | XOR, Difference和ReverseDifference裁剪模式被忽略,3D变换将不会应用在裁剪的矩形上。 |
drawBitmapMesh() | colors数组被忽略 |
drawLines() | 反锯齿不支持 |
setDrawFilter() | 可以设置,但无效果 |
Paint | |
setDither() | 忽略 |
setFilterBitmap() | 过滤永远开启 |
setShadowLayer() | 只能用在文本上 |
ComposeShader |
---|
ComposeShader只能包含不同类型的shader (比如一个BitmapShader和一个LinearGradient,但不能是两个BitmapShader实例) |
ComposeShader不能包含ComposeShader |
补充(Android绘制模型)
开启硬件加速后,android采用新的硬件绘制模型,这里,我简要写一下:基于软件的绘制模型和基于硬件的绘制模型有的不同
基于软件的绘制模型
在软件绘制模型下,视图按照如下两个步骤绘制:
1. Invalidate the hierarchy
2. Draw the hierarchy
应用程序调用invalidate()更新UI的某一部分,失效(invalidation)消息将会在整个视图层中传递,计算每个需要重绘的区域(脏区域)。然后Android系统将会重绘所有和脏区域有交集的view。
缺点:
1.每个绘制操作中会执行不必要的代码。比如如果应用程序调用invalidate()重绘button,而button又位于另一个view之上,即使该view没有变化,也会进行重绘。
2.可能会掩盖一些应用程序的bug。因为android系统会重绘与脏区域有交集的view,所以view的内容可能会在没有调用invalidate()的情况下重绘。这可能会导致一个view依赖于其它view的失效。
基于硬件的绘制模型
Android系统仍然使用invalidate()和draw()来绘制view,但在处理绘制上有所不同。Android系统会先记录绘制命令到显示列表,而不是立即执行绘制命令。另一个优化就是Android系统只需记录和更新标记为脏的view(invalidate())。新的绘制模型包含三个步骤:
1. Invalidate the hierarchy
2. 记录和更新显示列表
3. 绘制显示列表
转载请注明:http://blog.csdn.net/zifeng1203s/article/details/44004907