人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然连贯(帧率为24fps),用手机当然也需要感知屏幕操作的连贯性(尤其是动画过度),所以Android索性就把达到这种流畅的帧率规定为60fps。
有了上面的背景,我们开发App的帧率性能目标就是保持在60fps,也就是说我们在进行App性能优化时心中要有如下准则:
换算关系:60帧/秒-----------16ms/帧;
准则:尽量保证每次在16ms内处理完所有的CPU与GPU计算、绘制、渲染等操作,否则会造成丢帧卡顿问题。
当然了,针对Android系统的设计我们还需要知道另一个常识;虚拟机在执行GC垃圾回收操作时所有线程(包括UI线程)都需要暂停,当GC垃圾回收完成之后所有线程才能够继续执行(这个细节下面小节会有详细介绍)。也就是说当在16ms内进行渲染等操作时如果刚好遇上大量GC操作则会导致渲染时间明显不足,也就从而导致了丢帧卡顿问题。
有了上面这两个简单的理论基础之后我们下面就会探讨一些UI卡顿的原因分析及解决方案。
应用UI卡顿常见原因
1.1我们在使用App时会发现有些界面启动卡顿、动画不流畅、列表等滑动时也会卡顿,究其原因,很多都是丢帧导致的;通过上面卡顿原理的简单说明我们从应用开发的角度往回推理可以得出常见卡顿原因,如下:
-
人为在UI线程中做轻微耗时操作,导致UI线程卡顿;
-
布局Layout过于复杂,无法在16ms内完成渲染;
-
同一时间动画执行的次数过多,导致CPU或GPU负载过重;
-
View过度绘制,导致某些像素在同一帧时间内被绘制多次,从而使CPU或GPU负载过重;
-
View频繁的触发measure、layout,导致measure、layout累计耗时过多及整个View频繁的重新渲染;
-
内存频繁触发GC过多(同一帧中频繁创建内存),导致暂时阻塞渲染操作;
-
冗余资源及逻辑等导致加载和执行缓慢;
-
臭名昭著的ANR;
可以看见,上面这些导致卡顿的原因都是我们平时开发中非常常见的。有些人可能会觉得自己的应用用着还蛮OK的,其实那是因为你没进行一些瞬时测试和压力测试,一旦在这种环境下运行你的App你就会发现很多性能问题。
1.2大面积打印GC导致所有线程暂停的操作必定会导致UI视觉的卡顿,所以我们要避免此类问题的出现,具体的常见优化方式如下:
- 检查代码,尽量避免有些频繁触发的逻辑方法中存在大量对象分配;
- 尽量避免在多次for循环中频繁分配对象;
- 避免在自定义View的onDraw()方法中执行复杂的操作及创建对象(譬如Paint的实例化操作不要写在onDraw()方法中等);
- 对于并发下载等类似逻辑的实现尽量避免多次创建线程对象,而是交给线程池处理。
大面积打印GC导致所有线程暂停的操作必定会导致UI视觉的卡顿,所以我们要避免此类问题的出现,具体的常见优化方式如下:
- 检查代码,尽量避免有些频繁触发的逻辑方法中存在大量对象分配;
- 尽量避免在多次for循环中频繁分配对象;
- 避免在自定义View的onDraw()方法中执行复杂的操作及创建对象(譬如Paint的实例化操作不要写在onDraw()方法中等);
- 对于并发下载等类似逻辑的实现尽量避免多次创建线程对象,而是交给线程池处理。
转载于:https://my.oschina.net/u/3637221/blog/1512123
分享到:
相关推荐
在Android应用开发中,UI卡顿是一个常见的性能问题,它会严重影响用户体验。为了优化和调试这类问题,开发者需要有一种高效的方式来监控和分析UI线程的行为。"Android-Ui卡顿监视工具高频采集堆栈信息方便定位问题...
在Android应用开发中,性能优化是一项至关重要的任务,特别是对于用户体验而言,避免应用出现卡顿是提高用户满意度的关键。"Android-卡顿检测工具for android" 提供了一种有效的方法来监测并分析Android应用程序中的...
通过以上知识点的学习,开发者能更好地理解Android UI线程的工作原理,避免阻塞并优化用户界面的响应速度,提升应用的性能和用户体验。视频教程“010_android 之UI线程阻塞及其优化”将更深入地通过实例来展示这些...
本文将探讨uni-app的运行原理,以及如何从这些原理出发解决性能优化问题。 首先,uni-app的运行机制涉及到逻辑层和视图层的分离。逻辑层负责业务逻辑和数据管理,而视图层则处理页面的渲染。在非H5端,逻辑层与视...
本文主要讲解了UI相关的面试题,涵盖了UIView和CALayer、事件传递与视图响应链、图像显示原理、UI卡顿掉帧原因、滑动优化方案、UI绘制原理和离屏渲染等知识点。 一、UIView与CALayer UIView和CALayer是iOS UI编程...
【Android 系统中的屏幕刷新与卡顿原理】 在 Android 系统中,用户界面的流畅性至关重要,而"卡顿"是影响用户体验的主要因素之一。卡顿通常由主线程中的耗时操作引起,导致视图无法在规定时间内完成绘制,从而影响...
总结来说,Android UI界面绘制原理涵盖了视图和视图组的概念、布局管理、绘制流程、硬件加速、渲染流水线以及事件处理等多个方面。理解这些原理对于优化UI性能、创建流畅的用户体验至关重要。开发者需要深入学习并...
Android UI 界面绘制原理是Android开发中的核心概念,它涉及到Android系统如何将应用程序的界面元素展示在用户界面上。Android UI系统基于一种称为“View”和“ViewGroup”的组件模型,这些组件共同构建了用户界面。...
4. **多线程UI更新**:DirectUI支持多线程UI更新,这在现代多核处理器环境下尤其重要,能够避免因界面更新阻塞主线程导致的应用卡顿。 5. **布局管理**:DirectUI提供强大的布局管理机制,允许开发者定义控件的相对...
下面我们将深入探讨UI线程的工作原理、它的重要性以及如何在实际编程中有效地使用它。 UI线程的主要职责是管理与用户界面相关的所有操作,包括绘制窗口、响应用户的点击事件、更新控件状态等。由于这些操作通常涉及...
Android UI 界面绘制原理是Android应用开发中的核心部分,它涉及到系统如何将代码转换为用户可见的图形界面。在Android系统中,UI组件的绘制和交互是通过一系列的步骤和机制来完成的,这些机制包括视图(View)、视图...
9. **异步处理与线程管理**:由于Android UI线程不能执行耗时操作,因此需要通过AsyncTask、Handler、Thread或IntentService等机制进行异步处理,避免应用卡顿。 10. **依赖注入框架**:如Dagger、Jetpack Hilt等,...
5. **性能优化**:该库经过优化,能够在大量窗口和面板的情况下保持流畅的性能,避免因UI更新导致的卡顿。 6. **事件驱动**:丰富的事件系统使得开发者能够轻松地响应用户的操作,如窗口的拖放、关闭、最大化和最小...
《Android应用框架原理与程序设计》是一本深入探讨Android应用开发技术的专业资料,它涵盖了Android应用框架的基础到高级概念,旨在帮助开发者理解Android系统的工作机制,从而更好地进行应用程序的设计和优化。...
同时,理解`ChoreographerHelper`和`BlockCanary`的工作原理,有助于我们更好地理解和优化Android应用的主线程执行效率。在`ChatAppWithOverDraw`这样的项目中,这些工具的应用可以帮助我们提升聊天界面的流畅度,...
9. **异步编程与多线程**:Android应用的主线程负责UI更新,因此需要通过AsyncTask、Handler、Thread、Executor等机制进行异步处理,防止UI卡顿。 10. **Gradle构建系统**:Android Studio采用Gradle作为默认构建...
8. **性能优化**:加载广告可能会影响应用的性能,因此开发者需要优化代码,减少对主线程的影响,防止广告加载导致应用卡顿。 通过分析并实践这个源码,开发者不仅可以学习到如何在iOS应用中集成广告,还能提升对...