iOS应用除了闪退问题会造成用户流失外,还有一个卡顿问题也会惹来许多差评。应用卡顿不像闪退一样直观明了,可以直接通过异常信号或调用栈分析得到,常常让人无处下手。好的用户体验需要我们把细节做到位,画面掉帧会导致卡顿感,造成不好的印象。最近我专门研究了应用卡顿问题,并利用Bugly和友盟+U-APM中集成卡顿监控上报功能,分析卡顿是如何造成的。一番使用下来,还是友盟+U-APM更加顺畅,友盟+U-APM添加了启动耗时统计这个功能,还是蛮不错的。下面是我的详细讲述。
一、 认识卡顿
概念
FPS:Frames Per Second,表示每秒渲染的帧数,通过用于衡量画面的流畅度,数值越高则表示画面越流畅。
CPU:负责对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制(Core Graphics)。
GPU: 负责纹理的渲染(将数据渲染到屏幕)。
垂直同步技术: 让CPU和GPU在收到vSync信号后再开始准备数据,防止撕裂感和跳帧,通俗来讲就是保证每秒输出的帧数不高于屏幕显示的帧数。
双缓冲技术:iOS是双缓冲机制,前帧缓存和后帧缓存,CPU计算完GPU渲染后放入缓冲区中,当GPU下一帧已经渲染完放入缓冲区,且视频控制器已经读完前帧,GPU会等待vSync(垂直同步信号)信号发出后,瞬间切换前后帧缓存,并让CPU开始准备下一帧数据,安卓4.0后采用三重缓冲,多了一个后帧缓冲,可降低连续丢帧的可能性,但会占用更多的CPU和GPU 。
卡顿原因
从最初的电子q显示器说起,电子q逐行读取像素点,逐行发射到屏幕上,每当一行扫描完成,显示器会发出水平同步信号HSync;然后继续下一行,直到最后一行完成一帧的绘制,电子q恢复到起点继续下一帧的绘制,显示器会发出一个垂直同步信号VSync。对于iOS设备,VSync信号的间隔是16.7ms,也就是1秒60帧。
实际绘制过程中:
由CPU 计算好显示的内容:如视图的创建,布局的计算,图片的解码,文本的绘制,
然后GPU完成渲染,得到最终的像素,像素会输出到帧缓存(Frame Buffer)中
Video Controller (视频控制器)发出垂直信号(每16.67ms读取一次)进行读取Frame Buffer,最终输出到Monitor(显示器)上面。
假设只有一个Frame Buffer,意味着GPU和CPU必须在VSync发出的瞬间完成前面所有的工作,否则在视频控制器显示的过程中修改Frame Buffer,那么显示器就会在这一帧的前半部分显示上一帧的内容,下半部分显示当前帧的内容,造成画面断层的怪异现象。为了解决这个问题,大多数平台都引入了多缓存机制,比如iOS平台的双缓存, Android平台的三缓存机制;因为苹果使用双缓冲区,当垂直信号过来之后,但是GPU还没有渲染完成,就会出现卡顿现象。
大家在定位ios卡顿的时候,友盟+U-APM是很好的工具,可以帮你检测卡顿数据,找到原因,修复卡顿。友盟+U-APM还提供云真机测试能力,助力开发者从研发测试质量验收到线上问题复现排查,保障应用品质,提升测试效率。在云真机测试期间自动采集崩溃信息,提供详尽的崩溃报告协助筛查,真正实现监控测试全流程深度打通。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)