关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » 安卓开发 »通过 Hardware Layer 提升 Android 动画性能

    通过 Hardware Layer 提升 Android 动画性能

    2015-11-01 00:00:00 出处:秋楓
    分享

    当有人问我关于动画性能表现不佳问题的时候,我首先会询问他们是否使用了Hardware Layer层。

    你的view可能在执行动画期间的每一帧都进行重绘,假如使用View Layer,可以避免重绘每一帧,因为View的渲染一旦进入离屏缓冲区就能够被复用。

    另外,Hardware Layer缓存在GPU上(译者注: Hardware Layer使用GPU内存),它能够使动画中的某些操作变得更顺畅。通过使用这个View Layer能够迅速渲染简单的变换(如,移动,旋转,缩放,透明度)。因为许多动画都是多种变换的组合,所以使用View Layer能够显著提高动画性能。

    用法

    Layer的API十分简单:只需使用View.setLayerType( ) 。你应该只是暂时设置Hardware Layer,因为它们无法自动释放(稍后介绍)。基本使用步骤如下:

    动画运行期间,在每个想要缓存的View上调用View.setLayerType(View.LAYER_TYPE_HARDWARE, null)。 运行动画。 动画结束时,调用View.setLayerType(View.LAYER_TYPE_NONE, null)进行清理操作。

    代码实现如下:

    // Set the layer type to hardware 
    myView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    
    // Setup the animation
    ObjectAnimator animator = ObjectAnimator.ofFloat(myView, View.TRANSLATION_X, 150);
    
    // Add a listener that does cleanup 
    animator.addListener(new AnimatorListenerAdapter() {  
      @Override
      public void onAnimationEnd(Animator animation) {
        myView.setLayerType(View.LAYER_TYPE_NONE, null);
      }
    });
    
    // Start the animation
    animator.start();

    假如你基于minSdkVersion 16+,并且使用ViewPropertyAnimator ,那么可以通过withLayer( ) 方法代替上面操作。

    myView.animate()  
    .translationX(150)
    .withLayer()
    .start();

    这样做,你的动画就能变得顺畅平滑。

    注意事项

    你可能已经想到了,事情并不会这么简单。

    Hardware Layer在提升动画性能的能力上表现的十分神奇,假如滥用,将是弊大于利的。切记,不要盲目使用View Layer。

    第一,在某些情况下,实际上Hardware Layer可能要做非常多的工作,而不仅仅是渲染视图。缓存一个层需要花费时间,因为这一步要划分为两个过程:首先,视图渲染入GPU上的一个层中,然后,GPU再渲染那个层到窗口,假如View的渲染十分简单(比如一个纯色),那么在初始化的时候可能增加Hardware Layer不必要的开销。

    第二,对所有缓存来讲,存在一个缓存失效的可能性。动画运行时,假如某个地方调用了View.invalidate( ),那么Layer就不得不重新渲染一遍。倘若不断地失效,你的Hardware Layer实际上要比不添加任何Layer性能更差,因为(如上所述)Hardware Layer在设置缓存的时候增加了开销。假如你不断的重缓存Layer,会对性能造成极大地负担。

    这种问题很容易遇到,因为动画通常有多个移动部件。假设你设置了一个拥有三个移动部件的动画。

    Parent ViewGroup  
    --> Child View 1 (translates left)  
    --> Child View 2 (translates right)  
    --> Child View 3 (translates up)

    假如你仅在父布局ViewGroup上设置一个Layer,实际上会不断地缓存失效,因为(作为一个整体)ViewGroup会随着子View不断地改变。然而,每个单独的View,仅仅是移动罢了。这种情况下,最好的办法就是在每一个子View上设置Hardware Layer(而不是在父布局上)。

    再次重申,起初因为我不懂这个:经常在多个View上适当的设置Hardware Layer,以为这样他们就不会在动画运行时失效了。

    “显示硬件层更新”(Show hardware layers updates) 是追踪这个问题的开发利器。当View渲染Hardware Layer的时候闪烁绿色,它应该在动画开始的时候闪烁一次(也就是Layer渲染初始化的时候),然而,假如你的View在整个动画期间保持绿色不变,这就是持续的缓存失效问题了。

    第三,Hardware Layer使用GPU内存,很明显你不想看到内存泄露。因此,你应该只在必要的时候使用Hardware Layer,比如,动画运行期间。

    所有这一切表明:这里没有硬性规则。Android渲染系统是复杂的,并且常常令我感到惊讶。如同所有性能问题一样,测试才是关键。“GPU呈现模式分析”和“显示硬件层更新”等开发者选项非常适合确定图层正在帮助还是正在损害你的性能。

    举例

    我写了一个简单的app,示范Hardware Layer的基本用法。 从这里获取代码.

    这是运行在我的Galaxy Nexus(一款又老又慢的设备),通过开启开发者选项中的“GPU呈现模式分析”:

    通过Hardware Layer提升Android动画性能

    在不使用Hardware Layer的情况下,这个简单的动画烂透了。它不断地越过绿线,这就意味着它看起来很糟糕。相比之下,使用Hardware Layer的版本一直保持在绿线之下,这非常棒!

    第三个例子展示了,在使用Hardware Layer的情况下,动画运行时存在缓存失效的风险。由于错误的Hardware Layer用法,许多性能收益被干掉了。

    (这里有一些奇怪,假如它正处在invalidating,应该至少与不使用Hardware Layer一样迟钝。我不能理解透彻,但是,很显然,即使它们在每一步都必须进行重绘,优化的Hardware Layer还是发挥了一些提升性能的作用。所以,最好正确的使用它们。)

    该文的寓意是:Hardware Layer可以让动画变得很棒,但是前提是把握好它们的使用契机。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    SQL汉字转换为拼音的函数

    windows 7系统无法运行Photoshop CS3的解决方法

    巧用MySQL加密函数对Web网站敏感数据进行保护

    MySQL基础知识简介

    Windows7和WinXP下如何实现不输密码自动登录系统的设置方法介绍

    windows 7系统ip地址冲突怎么办?windows 7系统IP地址冲突问题的

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。