手机软件测试时,通常会将手机帧率调出来,查看在进行相关操作时,手机帧率的情况,也有在测试APP时,长时间运行时,帧率会有大幅度的下降,这种问题怎么查看与解决呢? (当然不仅仅只是因为这一点原因,可能会有多个原因,这里仅分享我遇到的问题)
- 通过adb命令调取手机帧率,这个命令可以随机抓取帧数进行分析:
- adb shell dumpsys gfxinfo < package name >
- 运行结果:
(1)Graphics info for pid 2280 [package name] : 表明当前dump的为APP的帧信息,pid为2280
(2)Total frames rendered: 11083 本次dump搜集了11083帧的信息
(3)Janky frames: 4172 (37.64%) 11083帧中有4172帧的耗时超过了16ms,卡顿概率为37.64%
(4)Number Missed Vsync: 60 垂直同步失败的帧
(5)Number High input latency: 10663 处理input时间超时的帧数
(6)Number Slow UI thread: 125 因UI线程上的工作导致超时的帧数
(7)Number Slow bitmap uploads: 13 因bitmap的加载耗时的帧数
(8)Number Slow issue draw commands: 90 因绘制导致耗时的帧数
(9)HISTOGRAM: 5ms=50 6ms=118 7ms=235 … 直方图数据,表面耗时为0-5ms的帧数为50,耗时为5-6ms的帧数为118,同理类推。
-
通过调出来的情况来看,第一个问题是垂直同步失败的帧(Number Missed Vsync)。
-
垂直同步失败的帧指的是在游戏或视频中,由于垂直同步设置不匹配或未能正确处理,导致帧数超过了显示器能够显示的最高帧数,从而出现帧率不稳定的现象。
-
垂直同步是用于限制游戏帧数以匹配显示器的刷新率的技术。在大多数情况下,垂直同步可以提供更平滑的图像和更少的画面撕裂,但有时也可能会导致一些问题,如延迟和性能下降。
-
当垂直同步失败时,可能会遇到一些异常现象,如画面撕裂、卡顿、延迟和不稳定性等。这些问题通常是由于显示器与显示卡的帧率不匹配造成的。
-
要解决垂直同步失败的问题,可以考虑以下几种方法:
- 检查显示器和显示卡的刷新率和分辨率设置是否匹配。
- 尝试调整垂直同步的参数,确保游戏帧数与显示器刷新率匹配。
- 检查显卡驱动程序,确保它是最新的版本,并正确设置以匹配显示器和游戏的需求。
- 如果问题仍然存在,可能需要考虑使用其他显示器或显示卡,或者尝试在较低的分辨率下玩游戏。
- 总之,垂直同步失败的帧是一个常见的问题,但通过适当的调整和设置,可以解决这个问题并获得更好的游戏体验。
-
第二个问题是因UI线程上的工作导致超时的帧数(Number Slow UI thread)
-
UI线程上的工作导致超时的帧数过多通常是由于以下原因导致的:
-
大量计算任务:如果应用程序在主线程上执行大量的计算任务,例如复杂的数学运算、图像处理等,这会占用大量的CPU资源,导致主线程的执行速度变慢,进而影响应用程序的响应速度和帧率。
-
长时间运行的任务:如果一个任务需要花费很长时间才能完成,那么它可能会阻塞主线程,导致应用程序响应速度变慢。这种情况常见于网络请求、文件读写等操作。
-
UI更新频率过高:如果应用程序中的UI更新频率过高,那么就会频繁地触发重绘、重排等操作,这也会占用主线程的资源,影响应用程序的响应速度。
-
数据加载和解析:当从服务器获取大量数据并在UI线程上进行加载和解析时,可能会导致UI线程超时。
-
复杂的用户交互:某些复杂的用户交互可能会导致UI线程资源占用过多,例如大量的手势识别、动画等。
-
为了解决这个问题,可以考虑以下方法:
- 使用异步任务:将耗时的任务放在子线程中执行,避免阻塞主线程。
- 使用线程池:使用线程池来管理异步任务的执行,可以避免频繁创建和销毁线程带来的资源浪费。
- 优化算法和数据加载:对算法和数据加载进行优化,减少不必要的计算和请求,提高响应速度。
- 限制UI更新频率:合理控制UI的更新频率,避免频繁的重绘和重排。
- 使用动画框架:选择合适的动画框架,避免在UI线程中进行复杂的动画操作。
- 使用异步渲染库:对于游戏等对帧率要求较高的应用,可以使用异步渲染库来提高帧率,减少主线程的负载。
- 综上所述,UI线程上的工作导致超时的帧数过多通常是由于应用程序在主线程上执行了大量的计算任务、长时间运行的任务、频繁的UI更新、数据加载和解析以及复杂的用户交互等原因导致的。为了解决这个问题,可以采取使用异步任务、线程池、优化算法和数据加载、限制UI更新频率、使用动画框架以及异步渲染库等措施。