iOS卡顿原因与优化

iOS卡顿原因与优化

1. 卡顿简介

在这里插入图片描述

卡顿: 指用户在使用过程中出现了一段时间的阻塞,使得用户在这一段时间内无法进行操作,屏幕上的内容也没有任何的变化。

卡顿作为App的重要性能指标,不仅影响着用户体验,更关系到用户留存、DAU等重要产品数据。因此,需要关注APP的卡顿

2. 卡顿产生的原因

首先,屏幕上看到的所有内容都是计算机绘制出来的图像

帧率:Frames Per Second(fps),表示每秒渲染帧数,
通常用于衡量画面的流畅度,每秒帧数越多,则表示画面越流畅。

通常,60fps比较流畅,也就是60张/秒,每张图片需要的渲染时间大约是:
1s/60张 = 1000ms/60张 = 16.7ms/1张

也就是1张图像在16.7ms内出现一次,就不会造成卡顿现象。

在这里插入图片描述

在这里插入图片描述

  • CPU 中计算显示内容,比如视图的创建、布局计算、图片解码、文本绘制等
  • GPU 进行变换、合成、渲染,把渲染结果提交到帧缓冲区去,在下一次 VSync 信号到来时显示到屏幕上

在这里插入图片描述

卡顿产生的原因:当单位时间内,界面要刷新的时候,CPU或GPU由于计算量大,没有做好准备,
就会造成界面显示前一个时间段的界面,从而造成卡顿、掉帧现象

3. 如何避免卡顿

核心: 减少CPU、GPU的资源消耗

CPU

  1. 创建对象:对象的创建会分配内存、调整属性,因此,尽量使用轻量级的对象
  2. 布局计算:视图布局的计算是 App 中最为常见的消耗 CPU 资源的地方,不要频繁的调用UIView的相关属性;尽量提前计算好布局,在有需要时一次性调整到对应的属性,不要多次、频繁的计算和调整这些属性
  3. 线程处理:控制一下线程的最大并发数量;尽量把耗时的操作放到子线程,包括:文本计算、布局计算、图片的解码编码

GPU

  • 尽量避免短时间内大量图片的显示,尽可能将多张图片合成一张进行显示
  • GPU能处理的最大纹理尺寸是4096x4096,一旦超过这个尺寸,就会占用CPU的资源进行处理,所以纹理尺寸尽量不要超过这个尺寸
  • 尽量减少视图数量和层次
  • 减少透明的视图(alpha<1),不透明的就设置opaque为YES
  • 尽量避免出现离屏渲染

在OpenGL中,GPU有2种渲染方式:
1 当前屏幕渲染:在当前用于显示的屏幕缓冲区进行渲染操作
2 离屏渲染:在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作

离屏渲染消耗性能的原因?
  • 需要创建新的缓冲区
  • 离屏渲染的整个过程,需要多次切换上下文环境,先是从当前屏幕(On-Screen)切换到离屏(Off-Screen);等到离屏渲染结束以后,将离屏缓冲区的渲染结果显示到屏幕上,又需要将上下文环境从离屏切换到当前屏幕
哪些操作会触发离屏渲染?
  • 光栅化,layer.shouldRasterize = YES
  • 遮罩,layer.mask
  • 圆角,同时设置layer.masksToBounds = YES、layer.cornerRadius大于0考虑通过CoreGraphics绘制裁剪圆角,或者叫美工提供圆角图片
  • 阴影,layer.shadowXXX,如果设置了layer.shadowPath就不会产生离屏渲染

4. 卡顿检测

  • 监控FPS
  • 监控RunLoop
  • ping主线程

4.1 监控FPS

帧率:Frames Per Second(fps),表示每秒渲染帧数

在这里插入图片描述

使用系统CADisplayLink监控,CADisplayLink是一个与屏幕刷新率相同的定时器,大约1/60s调用一次。

将其注册到RunLoop里面,计算当前画面的帧数。

delta为时间差等于1

在这里插入图片描述

4.2 监控RunLoop

由于UI刷新只能在主线程操作,因此,平时所说的“卡顿”,主要是因为主线程执行了比较耗时的操作

因此,可以添加observer到主线程Runloop中,通过监听Runloop状态切换的耗时,以达到监控卡顿的目的

在这里插入图片描述

RunLoop在BeforeSources和AfterWaiting后会进行任务的处理。可以在此时阻塞监控线程并设置超时时间,若超时后RunLoop的状态仍为RunLoopBeforeSources或AfterWaiting,表明此时RunLoop仍然在处理任务,主线程发生了卡顿

在这里插入图片描述

4.3 子线程Ping主线程

ping是常用的网络测试工具,用来测试数据包能否到达ip地址。
在这里插入图片描述

ping主线程的核心思想是向主线程发送一个信号,一定时间内收到了主线程的回复,即表示当前主线程流畅运行。
没有收到主线程的回复,即表示当前主线程在做耗时运算,发生了卡顿。

子线程Ping主线程的实现思路:

  1. 创建一个子线程进行循环检测,每次检测时设置标记位为YES
  2. 然后派发任务到主线程中将标记位设置为NO。
  3. 接着子线程休眠设定的阈值,判断标志位是否成功设置成NO,如果没有说明主线程发生了卡顿。

相当于:
子线程设置一个标识YES

如果发生了主线程的卡顿,那么到规定时间,主线程内的代码没有执行,则标识还是YES,这时候,代表卡顿
如果没有发生卡顿,那么到规定时间,主线程内的代码执行,则表示变为NO,这时候,代表没有发生卡顿

在这里插入图片描述

总结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/422068.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot+vue的社区养老服务平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

STC8H的PWM输出的寄存器配置

STC8H的PWM分为两组&#xff0c;第一组PWMA可以实现互补输出。第二组PWMB只能实现单端输出。 PWMA&#xff08;1~4&#xff09;&#xff0c;PWMB&#xff08;5~8&#xff09; 预分频&#xff1a; 输出极性和使能 CCER1配置PWMA的1~2&#xff0c;PWMB的5~6捕获比较输出 CCER2配…

Python3零基础教程之变量数据专题

在Python语言中&#xff0c;变量是用来存储数据的标识符。Python是一种动态类型语言&#xff0c;这意味着你不需要声明变量的类型。类型会在运行时自动确定&#xff0c;这使得Python在变量操作上非常灵活和强大。 以下是关于Python中变量和数据类型的详细介绍思维导图&#xff…

1907_Arm Cortex-M3的基本了解

1907_Arm Cortex-M3的基本了解 全部学习汇总&#xff1a; g_arm_cores: ARM内核的学习笔记 (gitee.com) 我发现Arm Coretex-M3有一个专门的DataSheet&#xff0c;看起来这个的确是被当做了一个设计的产品来对待的。正好&#xff0c;基于这个文件来看看M3具备哪些基本的特性&…

系统集成Prometheus+Grafana

根据产品需求在自己的系统中添加一个系统监控的页面&#xff0c;其中有主机信息的显示&#xff0c;也有一些业务信息的显示。调研后的方案是 主机信息通过Prometheus采集和存储&#xff0c;业务信息通过自己系统的调度任务统计后存储在Mysql中&#xff0c;使用Grafana对接Prome…

xsslabs第五关

看一下源码 <!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> <script> window.alert function() { confirm("完成的不错&#xff01…

UWB定位系统源码

自主研发的一套UWB定位系统源码&#xff0c;技术架构&#xff1a;java spring boot vue mysql单体服务 硬件&#xff08;UWB定位基站、卡牌&#xff09; UWB定义&#xff1a; UWB(Ultra Wideband)是一种无载波通信技术&#xff0c;利用纳秒至微秒级的非正弦波窄脉冲传输数据。…

ssm703学生考勤管理系统的设计与实现

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一 、设计说明 1.1课题背…

[SUCTF 2019]EasyWeb --不会编程的崽

个人认为&#xff0c;这题还算有些东西。先来看源码 <?php function get_the_flag(){// webadmin will remove your upload file every 20 min!!!! $userdir "upload/tmp_".md5($_SERVER[REMOTE_ADDR]);if(!file_exists($userdir)){mkdir($userdir);}if(!empty…

网络协议栈和os的关系(网络协议栈和计算机体系结构图相结合),用户如何从网络获取数据+本质,简述网络通信的本质

目录 网络协议栈和os的关系 思考联系 实际 用户从网络获取数据的过程 本质 如何获取 -- 系统调用 图示 不同的os 网络通信的本质 两台主机通信流程 网络协议栈和os的关系 思考联系 网络协议栈涵盖了硬件和软件,而os正是管理软硬件资源的中枢 os是计算机体系结构的一…

Centos 7 用户密码忘记解决办法

Centos 7 修改用户密码 重置密码 1、开机进入GRUB界面&#xff0c;在引导程序菜单上进行选择开机后进入以下界面&#xff0c;然后按Esc或者E键编辑选项&#xff1a; 2.用上下箭头翻到最后&#xff0c;编辑修改两处&#xff1a;ro改为rw,在LANGen_US.UFT-8后面添加init/bin/sh…

CleanMyMac X4.16.4介绍及下载安装图文详细步骤教程

一、简介 近年来&#xff0c;随着电脑使用的广泛&#xff0c;我们也越来越依赖电脑来完成日常工作、学习和娱乐。然而&#xff0c;使用电脑长时间后&#xff0c;我们会发现电脑运行缓慢&#xff0c;存储空间不足等问题。这时候&#xff0c;清理电脑就变得非常必要。 CleanMyMac…

基于Python3的数据结构与算法 - 09 希尔排序

一、引入 希尔排序是一种分组插入排序的算法。 二、排序思路 首先取一个整数d1 n/2&#xff0c;将元素分为d1个组&#xff0c;每组相邻量取元素距离为d1&#xff0c;在各组内直接进行插入排序&#xff1b;取第二个整数d2 d1/2&#xff0c; 重复上述分组排序过程&#xff0…

本地快速部署谷歌开放模型Gemma教程(基于WasmEdge)

本地快速部署谷歌开放模型Gemma教程&#xff08;基于WasmEdge&#xff09; 一、介绍 Gemma二、部署 Gemma2.1 部署工具2.1 部署步骤 三、构建超轻量级 AI 代理四、总结 一、介绍 Gemma Gemma是一系列轻量级、最先进的开放式模型&#xff0c;采用与创建Gemini模型相同的研究和技…

用node或者vscode开启一个简单的本地server服务器,加载html网页

使用Live Server 想要加载本地html页面可以快速能让它在你本地浏览器中打开&#xff0c;可以有好多种方式&#xff0c;如果你有使用vscode&#xff0c;可以安装一个插件&#xff1a;Live Server&#xff0c;然后直接在vscode中直接右键就可以开启这个服务&#xff1a; 安装好之…

Redis持久化+Redis内存管理和优化+Redis三大缓存问题

Redis持久化Redis内存管理和优化Redis三大缓存问题一、Redis高可用二、Redis持久化1、RDB持久化1.1 触发条件(1) 手动触发(2) 自动触发(3) 其他自动触发机制 1.2 执行流程1.3 启动时加载 2、AOF持久化2.1 开启AOF2.2 执行流程(1) 命令追加(append)(2) 文件写入(write)和文件同步…

Tomcat部署及多实例

一、Tomcat简介 1、简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。 当在一台机器上配置好Apache 服务器&#xff0c…

ARK:《BIG IDEAS 2024》

Cathie Wood所带领的方舟投资&#xff08;ARK&#xff09;发布了年度重磅研究报告《BIG IDEAS 2024》&#xff0c;该报告指出人工智能、公共区块链、多组学测序、能源存储和机器人技术这五大板块的融合将带来全球经济活动的改变。 这五个创新平台正在融合并定义这个技术时代&am…

全部免费!抖音,牛逼了!

相比于百度文心、清华智谱和讯飞星火这些在国内有一定市场知名度的AI工具&#xff0c;字节跳动多少显得有点低调了。 国内的AI工具用了不少&#xff0c;但要是说哪家最有前景&#xff0c;那最看好的还是字节跳动。 倒不是说字节的云雀大模型比上面这几个更牛逼&#xff0c;而…

【计算机网络】TCP 如何实现可靠传输

TCP通过三次握手建立连接&#xff0c;四次挥手释放连接&#xff0c;确保连接建立和连接释放的可靠。 序列号、检验和、确认应答信号、重发机制、连接管理、窗口控制、流量控制、拥塞控制 标准回答 可靠传输就是通过TCP连接传送的数据是没有差错、不会丢失、不重复并且按序到达的…
最新文章