声明:尊重原创,原文地址:《带你打造一套 APM 监控系统》。本文为根据原创文章整理所得,感谢浏览。

APM 是 Application Performance Monitoring 的缩写,监视和管理软件应用程序的性能和可用性。应用性能管理对一个应用的持续稳定运行至关重要。所以这篇文章就从一个 iOS App 的性能管理的纬度谈谈如何精确监控以及数据如何上报等技术点

App 的性能问题是影响用户体验的重要因素之一。性能问题主要包含:Crash、网络请求错误或者超时、UI 响应速度慢、主线程卡顿、CPU 和内存使用率高、耗电量大等等。大多数的问题原因在于开发者错误地使用了线程锁、系统函数、编程规范问题、数据结构等等。解决问题的关键在于尽早的发现和定位问题。

本篇文章着重总结了 APM 的原因以及如何收集数据。APM 数据收集后结合数据上报机制,按照一定策略上传数据到服务端。服务端消费这些信息并产出报告。请结合姊妹篇, 总结了如何打造一款灵活可配置、功能强大的数据上报组件。

一、卡顿监控

卡顿问题,就是在主线程上无法响应用户交互的问题。影响着用户的直接体验,所以针对 App 的卡顿监控是 APM 里面重要的一环。

FPS(frame per second)每秒钟的帧刷新次数,iPhone 手机以 60 为最佳,iPad 某些型号是 120,也是作为卡顿监控的一项参考参数,为什么说是参考参数?因为它不准确。先说说怎么获取到 FPS。CADisplayLink 是一个系统定时器,会以帧刷新频率一样的速率来刷新视图。 [CADisplayLink displayLinkWithTarget:self selector:@selector(###:)]。至于为什么不准我们来看看下面的示例代码

_displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(p_displayLinkTick:)];
[_displayLink setPaused:YES];
[_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

代码所示,CADisplayLink 对象是被添加到指定的 RunLoop 的某个 Mode 下。所以还是 CPU 层面的操作,卡顿的体验是整个图像渲染的结果:CPU + GPU。请继续往下看

1. 屏幕绘制原理

讲讲老式的 CRT 显示器的原理。 CRT 电子枪按照上面方式,从上到下一行行扫描,扫面完成后显示器就呈现一帧画面,随后电子枪回到初始位置继续下一次扫描。为了把显示器的显示过程和系统的视频控制器进行同步,显示器(或者其他硬件)会用硬件时钟产生一系列的定时信号。当电子枪换到新的一行,准备进行扫描时,显示器会发出一个水平同步信号(horizonal synchronization),简称 HSync;当一帧画面绘制完成后,电子枪恢复到原位,准备画下一帧前,显示器会发出一个垂直同步信号(Vertical synchronization),简称 VSync。显示器通常以固定的频率进行刷新,这个固定的刷新频率就是 VSync 信号产生的频率。虽然现在的显示器基本都是液晶显示屏,但是原理保持不变。

通常,屏幕上一张画面的显示是由 CPU、GPU 和显示器是按照上图的方式协同工作的。CPU 根据工程师写的代码计算好需要现实的内容(比如视图创建、布局计算、图片解码、文本绘制等),然后把计算结果提交到 GPU,GPU 负责图层合成、纹理渲染,随后 GPU 将渲染结果提交到帧缓冲区。随后视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据,经过数模转换传递给显示器显示。

在帧缓冲区只有一个的情况下,帧缓冲区的读取和刷新都存在效率问题,为了解决效率问题,显示系统会引入2个缓冲区,即双缓冲机制。在这种情况下,GPU 会预先渲染好一帧放入帧缓冲区,让视频控制器来读取,当下一帧渲染好后,GPU 直接把视频控制器的指针指向第二个缓冲区。提升了效率。

目前来看,双缓冲区提高了效率,但是带来了新的问题:当视频控制器还未读取完成时,即屏幕内容显示了部分,GPU 将新渲染好的一帧提交到另一个帧缓冲区并把视频控制器的指针指向新的帧缓冲区,视频控制器就会把新的一帧数据的下半段显示到屏幕上,造成画面撕裂的情况。

为了解决这个问题,GPU 通常有一个机制叫垂直同步信号(V-Sync),当开启垂直同步信号后,GPU 会等到视频控制器发送 V-Sync 信号后,才进行新的一帧的渲染和帧缓冲区的更新。这样的几个机制解决了画面撕裂的情况,也增加了画面流畅度。但需要更多的计算资源

答疑

可能有些人会看到「当开启垂直同步信号后,GPU 会等到视频控制器发送 V-Sync 信号后,才进行新的一帧的渲染和帧缓冲区的更新」这里会想,GPU 收到 V-Sync 才进行新的一帧渲染和帧缓冲区的更新,那是不是双缓冲区就失去意义了?

设想一个显示器显示第一帧图像和第二帧图像的过程。首先在双缓冲区的情况下,GPU 首先渲染好一帧图像存入到帧缓冲区,然后让视频控制器的指针直接直接这个缓冲区,显示第一帧图像。第一帧图像的内容显示完成后,视频控制器发送 V-Sync 信号,GPU 收到 V-Sync 信号后渲染第二帧图像并将视频控制器的指针指向第二个帧缓冲区。

看上去第二帧图像是在等第一帧显示后的视频控制器发送 V-Sync 信号。是吗?真是这样的吗?

带你打造一套 APM 监控系统(一)相关推荐

  1. 带你打造一套 APM 监控系统(四)

    声明:尊重原创,原文地址:<带你打造一套 APM 监控系统>.本文为根据原创文章整理所得,感谢浏览. 七. Crash 监控 1. 异常相关知识回顾 1.1 Mach 层对异常的处理 Ma ...

  2. 带你打造一套 APM 监控系统(二)

    声明:尊重原创,原文地址:<带你打造一套 APM 监控系统>.本文为根据原创文章整理所得,感谢浏览. 三. CPU 使用率监控 1. CPU 架构 CPU(Central Processi ...

  3. 带你打造一套 APM 监控系统 之 卡顿监控

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨杭城小刘 来源公众号丨知识小集(zsxjtip ...

  4. 带你打造一套APM系统

    APM 是 Application Performance Monitoring 的缩写,监视和管理软件应用程序的性能和可用性.应用性能管理对一个应用的持续稳定运行至关重要.所以这篇文章就从一个 iO ...

  5. 带你打造一套APM系统(二)

    2.1. Mach 层异常处理 大体思路是:先创建一个异常处理端口,为该端口申请权限,再设置异常端口.新建一个内核线程,在该线程内循环等待异常.但是为了防止自己注册的 Mach 层异常处理抢占了其他 ...

  6. 打造自己的树莓派监控系统1--CPU监控-matplotlib显示数据

    系列文章: 文章1:打造自己的树莓派监控系统1–CPU监控-matplotlib显示数据 文章2:打造自己的树莓派监控系统2–内存监控-matplotlib显示数据 文章3:打造自己的树莓派监控系统3 ...

  7. 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(一)开放源代码

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 开源倾情奉献系列链接 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(一)开放源代码 开源倾 ...

  8. 开源倾情奉献:基于.NET打造IP智能网络视频监控系统

    转载自 http://www.cnblogs.com/gaochundong/p/opensource_ip_video_surveillance_system_part_1_introduction ...

  9. 风电场数据库_带你近距离了解风电场SCADA监控系统

    原标题:带你近距离了解风电场SCADA监控系统 某风电集团拥有多个下属风电场,各风电场位置分散.独立运行,尚无统一完备的系统对各个风电场进行统一的管理,导致企业管理效率低下,风电设备工作效率低下. 为 ...

最新文章

  1. Selenium高亮页面对象
  2. 收藏:JavaScript
  3. java 面试题汇总
  4. 十分钟就能回顾Spring常问的知识点,带你突击面试没问题!
  5. emacs org mode 中的标签全参考
  6. 自定义Django的admin界面
  7. 在ubuntu下使用Eclipse搭建Hadoop开发环境
  8. RMSE均方根误差学习笔记
  9. Linux上压缩目录以及目录下的所有文件
  10. semget创建文件_linux信号灯操作
  11. java上课作业(第三次)
  12. bzoj 4880 [Lydsy1705月赛]排名的战争 贪心
  13. json vs obj
  14. ⚡如何在2分钟内将GraphQL服务器添加到RESTful Express.js API
  15. PL/SQL面向过程语言
  16. coreseek mysql_centos+php+coreseek+sphinx+mysql之一coreseek安装篇
  17. 【5G/4G】ZUC算法源码介绍
  18. 嵌入式linux指纹识别项目,基于嵌入式应用平台的指纹识别系统设计
  19. [数据库] MariaDB安装及使用
  20. luogu P1710 地铁涨价

热门文章

  1. pta-L3-008 喊山 BFS
  2. L3-008 喊山PTA(BFS)
  3. linux+sql面试常见基础八股文
  4. 将已写好页面的px转化为rem(px to rem)
  5. Arduino+NRF24L01制作遥控器
  6. sqli-labs通关攻略23-37[Advanced Injections]
  7. AMD锐龙Ryzen CPU系列安装黑苹果MacOS 10.14 Mojave安装教程
  8. 【华为OD机试真题2023 JAVA】网上商城优惠活动(一)
  9. pb数据窗口如何设置一列中连续相同数据的背景颜色_数据可视化 | 想轻松入门,必走这7步!...
  10. FPGA基本引脚知识