美文网首页
谷歌官网之硬件加速 【译】

谷歌官网之硬件加速 【译】

作者: 北疆_ | 来源:发表于2016-06-04 23:17 被阅读529次

硬件加速


Android 3.0 (API level 11)开始,Android 2D渲染管道支持硬件加速。API level >=14的Android系统默认开启硬件加速。由于硬件加速并不支持所有的2D绘制操作,所以开启硬件加速,可能会导致自定义view中部分元素看不到,程序抛出异常,或者错误的像素渲染等问题。

开启/关闭硬件加速

  • Application
    <application android:hardwareAccelerated="true" ...>
  • Activity
<application android:hardwareAccelerated="true">    
  <activity ... />    
  <activity android:hardwareAccelerated="false" />
</application>
  • Window 级别只能开启硬件加速
getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
  • View 关闭硬件加速
    myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

View硬件加速的判断

两个方法:

你必须在你绘制代码(drawing code)内检测,使用前者而不是后者,因为有可能View虽然依附于一个硬件加速的窗口,但它依然可以在一个没有硬件加速的Canvas上绘制,列如:为了缓存的目的把view绘制到一个bitmap上。

Android 软加速/硬加速 绘制模式

基于软件的绘制模式
绘制步骤:无效从下到上的View,然后重新绘制。
问题:

  1. 没有改变的大量上层的View需要重新绘制。
  2. Android重绘view的过程,有可能没有绘制发生改变的view,此时你只能依赖其他view包含恰好的重绘行为。

硬件加速的绘制模式
绘制步骤:

  1. 无效从下到上的View
  2. 记录和更新显示列表(display lists)
  3. 绘制显示列表

优点: 使用display lists能有针对性的更新改变的View

不支持的绘制操作


Canvas Scaling

View Layers

Off-screen buffers

所有的Android版本都支持对Off-screen buffers进行渲染。

你会获得更好的性能,当做复杂view的动画或者应用合成效果时。列如,当你实现淡出效果时,你可以使用Canvas.saveLayer(),暂存渲染的view到layer中,然后用透明度合成,使它返回屏幕达到淡出效果。

[View.setLayerType()](https://developer.android.com/reference/android/view/View.html#setLayerType(int, android.graphics.Paint))

选择技巧

  • Performance: 使用硬件加速时,一旦一个view渲染进如layer中,只有调用invalidate()是绘制的代码才会被执行。一些动画,列如透明度动画,可以直接用于layer中,这使用GPU去执行是非常高效的。
  • Compatibility: Use a software layer type to force a view to be rendered in software.

View layers and animations

如果你在你的应用中跑的动画没有达到,你想要的流程结果,你可以考虑启动硬件加速。 以下的属性,使用合成来作用于layer,使用的是优化的invalidation及不需要重绘目标view,过程更高效。

  • alpha: Changes the layer's opacity
  • x, y, translationX, translationY: Changes the layer's position
  • scaleX, scaleY: Changes the layer's size
  • rotation, rotationX, rotationY: Changes the layer's orientation in 3D space
  • pivotX, pivotY: Changes the layer's transformations origin

demo:

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();

提示和技巧

  • 减少view的数量
  • 避免过度绘制
    A good rule of thumb with current hardware is to not draw more than 2.5 times the number of pixels on screen per frame (transparent pixels in a bitmap count!).
  • 不创建渲染类在绘制代码中:如在onDraw中 new Paint 或者 Path。
  • 不频繁的改变形状
    Complex shapes, paths, and circles for instance, are rendered using texture masks. Every time you create or modify a path, the hardware pipeline creates a new mask, which can be expensive.
  • 不频繁的修改bitmap
  • 谨慎使用alpha,当应用alpha属性到很大的views时,考虑使用 LAYER_TYPE_HARDWARE。
    .

相关文章

网友评论

      本文标题:谷歌官网之硬件加速 【译】

      本文链接:https://www.haomeiwen.com/subject/oowldttx.html