• 7-FPS


    为啥会感觉卡?

         这个我们要从'帧率'说起了,帧率就是每秒显示的帧数.手机屏幕的帧率60,屏幕分辨率1024*768,那么手机各硬件之间每秒要处理的像素为1024*768*60=47185920,分辨率换成2080*1080,那么手机各硬件之间每秒要处理的像素为2080*1080*60=123710400.

    ( ̄□ ̄||)这还是理论数值,实际肯定比这大得多,光处理界面展示就够累了,还想要啥自行车?

      安卓对FPS的要求是:每16毫秒1帧,所以绝大多少安卓设备的屏幕帧率是60FPS.对这块感兴趣的可以自行查找资料看看,不感兴趣的记住这就是规定~

    不要觉得帧数详细到毫秒这事有点较真,毕竟使用者感觉卡顿,可能就是1秒内那么两三帧的事,实际上就是几十毫秒.

    到底为啥会卡看图

    这是正常情况下,每帧都在自己份内的时间段活动着,当某一帧时间超出了范围就会出现掉帧,我们就会感觉卡顿

    第一帧占用了32毫秒,导致第二帧没法正常显示,我们直接从第一帧跳到了第三帧

    脑补一下我们见过的卡顿,是不是停止在某一画面很久然后突然就跳到另一个画面?

     

    过度绘制

         前面叨叨那么多,就是想说感觉卡是因为当前帧占用时间太多,而占用时间太多是因为硬件处理的像素过多,硬件处理像素过多的一个原因是因为过度绘制,这个概念大意是:在屏幕上一个像素点的绘制次数超过 1 次。举个例子,我们要装修屋子,粉刷墙壁.现在想要把墙壁刷成50%白色和50%蓝色.

    正常绘制:我们会直接将一半墙刷白一半墙刷蓝,最省时省料.

    过度绘制:先把墙全部刷白,在找出50%刷蓝,有一半的墙白刷了,浪费了时间和资源~

    不要觉得好傻,没人会这么做,实际上每个app都或多或少的有这类问题.所以我说实际每秒钟处理的像素点,比理论值要大.我们如何查看这类问题呢?

    在开发者选项中,可以开启过度绘制的查看:"开发者选项"->"调试GPU过度绘制"->"开启"

    无颜色:无过度绘制/蓝色:过度绘制1次/绿色:过度绘制2次/粉色:过度绘制3次/红色:过度绘制4次及以上

    脑补一下,如果我们app的所有界面均为红色,会怎么样?会不会处理更多像素?会不会占用更多时间?比如16毫秒内处理不完某一帧,会不会卡?启动会不会很慢?超过8秒还无响应,会不会ANR?所以~测试的时候我们应该要求界面无红色~粉色少量(不大于20%)~其余是蓝绿.

    采集数据

      对于FPS这块,我们有了很好的采集数据的命令,在API21+,Android给我们提供了一个更加方便、准确的方式,在screenrecord中新增了一个参数——bugreport:

    adb shell screenrecord --bugreport /mnt/sdcard/mp4/test.mp4

    录制回放时会显示设备信息

     

    左上角显示录制信息中的帧数和掉帧数~注意是数~

     

    配个毫秒播放器回放录制,再结合前面的过度绘制,我们就能明显的对比出过度绘制界面的展示情况,以及图文并茂的数据采集~呃~最后吐个槽吧

      

    -----华丽的吐槽线-----

    ((╯‵□′)╯︵┻━┻  鬼知道程序猿们会写出什么BUG)

  • 相关阅读:
    Java设计模式
    一个接口多个实现类的Spring注入方式
    Mybatis 中的<![CDATA[ ]]>浅析
    方法内调另一个方法(事务)的探讨
    insertSql语句中的trim标签的使用
    Mybatis-plus的两种分页插件的配置方式
    Mybatis-plus的使用
    spring的IOC,DI及案例详解
    MySQL多表关联数据同时删除
    @Validated和@Valid区别
  • 原文地址:https://www.cnblogs.com/dianxiao2/p/6222717.html
Copyright © 2020-2023  润新知