配件减速
配件减速是指应用设施的配件资源来减速图形渲染和图像解决等操作,以提高运行程序的性能和用户体验。在Android系统中,配件减速重要经过以下几种方式成功:
配件减速可以经过应用设施的配件资源来减速图形渲染和图像解决等操作,提高运行程序的性能和用户体验。
经常使用配件减速优势:
在Android里,配件减速专指把View中绘制的计算上班交给GPU来解决,这个绘制的计算上班通常指的是把绘制方法中的那些Canvas.drawXXX()变成实践的像素操作。
减速原理
在配件减速封锁的时刻,Canvas绘制的上班方式是把要绘制的内容写进一个Bitmap,而后在之后的渲染环节中,这个Bitmap的像素内容被间接用于渲染到屏幕。这种绘制方式的重要计算上班在于把绘制操作转换为像素的环节(例如由一句 Canvas.drawCircle() 来取得一个详细的圆的像素消息),这个环节的计算是由CPU来成功的。大抵就像这样:
开启配件减速后,Canvas的上班方式扭转了,先把绘制的内容转为GPU的操作保留上去,而后交给GPU来成功显示上班。大抵环节:
从上图可以看出,开启配件减速后,绘制的计算上班由CPU交给GPU,不过这怎样就能起到减速作用,让绘制变快了呢?配件减速能够让绘制变快,重要有三个要素:
封锁配件减速时,绘制内容会被CPU转为实践的像素间接渲染到屏幕,这个·[实践的像素]·是由Bitmap承载的,在界面的某个View由于内容出现扭转而调用invalidate()方法时,假设没有开启配件减速,为了正确计算Bitmap的像素,这个View的父View、父View的父View乃至不时向上知道最顶级的View,以及一切和它相交的View,都须要被调用invalidate()来重绘,一个View的扭转使得大半个界面甚至整个界面重绘一遍,这个上班量是十分大的。
开启配件减速时,绘制的内容会被转换成GPU的操作保留上去(承载的方式成为DisplayList,对应的类也叫作DisplayList)转交给GPU。由于一切绘制的内容都没有变成最终的像素,所以它们之间是相互独立的,那么在界面内容出现扭转时,只需把出现了扭转的View调用invalidate()方法以降级它所对应的GPU就好,至于它的父View和兄弟View,只须要坚持原样,那么这个上班量就很小了。
正是由于上方的要素,配件减速不只是由于GPU的引入提高效率,而且由于绘制机制的扭转,而极大的提高了界面内容扭转时的刷新效率。
配件减速不止无好处,也会遭到GPU绘制方式的限度,Canvas有些方法在配件减速开启时会失效或许无法反常上班,比如:开启配件减速,clipPath()在API18及以上系统中才有效,详细的API限度和API版本的相关如下图:
在开发Android运行时,须要思考到设施的兼容性和性能差异,正当经常使用配件减速性能。
配件减速开启
android:hardwareAccelerated
这将启用运行程序的配件减速性能。
android:hardwareAccelerated
或许在代码中经常使用以下方法来启用配件减速:
getWindowsetFlagsWindowManagerLayoutParamsFLAG_HARDWARE_ACCELERATED WindowManagerLayoutParamsFLAG_HARDWARE_ACCELERATED
//View开启配件减速view.setLayerType(LAYER_TYPE_HARDWARE, null);
view.setLayerType(LAYER_TYPE_SOFTWARE, null)方法的作用并不是封锁配件减速,当它的参数为LAYER_TYPE_SOFTWARE的时刻,可以顺便把配件减速关掉而已;并且除了这个方法外,Android并没有提供专门的View级别的配件减速开关,所以顺便成了一个开关配件减速的方法。
setLayerType()方法的作用就是设置View Layer的类型。ViewLayer又称为离屏缓冲(off-screen Buffer),作用就是独自启用一块中央来绘制View,而不是经常使用绘制软件的Bitmap或许经过配件减速的GPU,这块中央或许是一块独自的Bitmap,也或许是一块OpenGL的纹理(texture,OpenGL的纹理可以繁难了解为图像的意思),详细取决于配件减速能否开启。采取什么来绘制View不是关键,关键在于当设置了View Layer的时刻,它的绘制会被缓存上去,而且缓存的是最终的绘制结果,而不是像配件减速那样只是把GPU的操作保留上去再交给GPU去计算。经过这样更进一步的缓存方式,View的重绘效率进一步提高了:只需绘制的内容没变,那么不论是CPU绘制还是GPU绘制,都不用从新计算,只需用之前缓存的结果就可以了。
在启动移动、旋转等(无需调用 invalidate())的属性动画的时刻开启Hardware Layer 将会极大地优化动画的效率,在动画环节中View自身并没有出现扭转,只是位置或角度扭转了,这种扭转是可以由GPU经过繁难计算就成功的,并不须要重绘整个View。所以在动画的环节中开启Hardware Layer,可以让原本就依托配件减速而变流利了的动画变得愈加流利。成功方式大略是这样:
setLayerTypeLAYER_TYPE_HARDWARE ObjectAnimator animator ObjectAnimatorofFloat animatoraddListenernew AnimatorListenerAdapter { void onAnimationEndAnimator animation {setLayerTypeLAYER_TYPE_NONE }}animator
在对translationX translationY rotation alpha等无需调用invalidate()的属性做动画的时刻方法才实用,由于方法自身应用的就是当界面不出现时,缓存未降级所带来的期间的节俭。「不实用于基于自定义属性绘制的动画。」
总结
配件减速支经常使用GPU来成功绘制的计算上班,从上班摊派和绘制机制优化两个角度优化了绘制速度。
配件减速可以经常使用setLayerType()来封锁配件减速,但这个方法其实是用来设置View Layer的:
View Layer可以减速无invalidate()时的刷新效率,但关于须要调用invalidate()的刷新无法减速。绘制所消耗的实践期间是比不经常使用View Layer时要高的,所以要谨慎经常使用。