Android中配件减速的基本概念及其如何经过不同的API和规划文件属性来优化绘制和动画性能

  • 电脑网络维修
  • 2024-11-15

配件减速

配件减速是指应用设施的配件资源来减速图形渲染和图像解决等操作,以提高运行程序的性能和用户体验。在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时要高的,所以要谨慎经常使用。

  • 关注微信

本网站的文章部分内容可能来源于网络和网友发布,仅供大家学习与参考,如有侵权,请联系站长进行删除处理,不代表本网站立场,转载联系作者并注明出处:https://duobeib.com/diannaowangluoweixiu/7427.html

猜你喜欢

热门标签

洗手盆如何疏浚梗塞 洗手盆为何梗塞 iPhone提价霸占4G市场等于原价8折 明码箱怎样设置明码锁 苏泊尔电饭锅保修多久 长城画龙G8253YN彩电输入指令画面变暗疑问检修 彩星彩电解除童锁方法大全 三星笔记本培修点上海 液晶显示器花屏培修视频 燃气热水器不热水要素 热水器不上班经常出现3种处置方法 无氟空调跟有氟空调有什么区别 norltz燃气热水器售后电话 大连站和大连北站哪个离周水子机场近 热水器显示屏亮显示温度不加热 铁猫牌保险箱高效开锁技巧 科技助力安保无忧 创维8R80 汽修 a1265和c3182是什么管 为什么电热水器不能即热 标致空调为什么不冷 神舟培修笔记本培修 dell1420内存更新 青岛自来水公司培修热线电话 包头美的洗衣机全国各市售后服务预定热线号码2024年修缮点降级 创维42k08rd更新 空调为什么运转异响 热水器为何会漏水 该如何处置 什么是可以自己处置的 重庆华帝售后电话 波轮洗衣机荡涤价格 鼎新热水器 留意了!不是水平疑问! 马桶产生了这5个现象 方便 极速 邢台空调移机电话上门服务 扬子空调缺点代码e4是什么疑问 宏基4736zG可以装置W11吗 奥克斯空调培修官方 为什么突然空调滴水很多 乐视s40air刷机包 未联络视的提高方向 官网培修 格力空调售后电话 皇明太阳能电话 看尚X55液晶电视进入工厂形式和软件更新方法 燃气热水器缺点代码

热门资讯

关注我们

微信公众号