iOS中卡顿产生的主要原因及优化思路

news2024/11/19 19:35:50
        卡顿本质上是一个UI体验上的问题,而UI的渲染及显示,主要涉及CPU和GPU两个层面。若 CPU+GPU渲染耗时超过16.7ms,就会在屏幕vsync信号到来时无法更新屏幕内容,进而导致卡顿。
       iOS中UI渲染主要包含Layout->Draw->Prepare->Commit四个阶段。其中前三个阶段主要是CPU在处理, 第四个阶段主要是GPU处理。可行的优化手段,在不同阶段也会有所不同。

       1. Layout阶段的优化:

        在Layout阶段,主要操作都是在主线程,可能的性能瓶颈是页面布局复杂,数据频繁更新或页面滚动过程中频繁计算、更新子视图的大小和位置可能会有性能瓶颈。
        优化思路:
      (1)预处理:收到数据后,提前在子线程计算涉及到子视图的布局信息ViewLayoutModel,处理完后再切换到主线程更新布局数据,避免在主线程进行复杂的布局计算。
      (2)缓存页面布局信甚至直接缓存布局好的视图。这种方案对数据变化不大,但需要快速滚动浏览历史数据的场景十分有效。
      (3)避免全局进行视图更新,只更新数据有变化的子视图。
      (4)批处理。如果数据变化过于频繁,没必要每次数据由变化时都立刻刷新UI,可以缓存变化的数据,批量进行处理。

       2. Draw阶段的优化

        Draw阶段默认也是在主线程中实现, 但实际这并非必须的。因此,这一阶段最可行的优化就是将绘制改为在子线程中完成,然后将生成的位图切换到主线程提交到Layer的content字段,这就是异步绘制。
        具体 骤:

       (1)实现CALayer的代理方法displayLayer:

       (2)在代理方法中切到子线程执行绘制任务

       (3)将绘制出的位图在主线程设置到CAlayer的contents属性

        

       3. Prepare阶段的优化

        Prepare阶段主要的耗时是图片的解码,优化手段主要是预处理和缓存。现在主流的图片加载框架,如SDWebImage、TTURLCache,都会将图片将图片提前进行解码,缓存的UIImage都是解码后的图片对象。

          Prepare另外一个优化的思路是避免缓存过大的图片,在收到图片后,根据实际显示场景需要的图片尺寸,生成不同大小的图片副本,既可以降低内存占用,也可以降低图片加载过程中的耗时。

       4. Commit阶段的优化

        Commit阶段主要的耗时是GPU渲染耗时。其中最容易产生性能瓶颈的是离屏渲染问题。

        所谓离屏渲染,是指设置图层的某些属性时,视图前期渲染结束后无法直接进入帧缓冲区,需要另外开辟一个新的屏幕缓冲区,对其再次进行整体处理。而开辟新的屏幕缓冲区及切换图片渲染上下文都是非常耗时的操作,因而非常容易导致UI卡顿。

        会导致离屏渲染的操作主要包括:        

      (1)layer.shouldRasterize(光栅化)

      (2)layer.mask(遮罩)

      (3)layer.shadowPath(阴影)

      (4)layer.cornerRadius及layer.maskToBounds(圆角)

        离屏渲染的主要优化套路比较固定,主要是在可能存在性能瓶颈的场景尽量避免设置图层的这些属性。类似的渲染效果,改为在CPU中通过预处理进行实现。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在原有项目进行业务逻辑开发:同一用户短时间不得提交多次申请,以及更新主表时数据刷新掉了角色权限以及密码重置的问题,详细思路及代码

开发背景: 用户提交表单后,插入到对应数据库表的字段中去,因需要保存是哪一个用户提交的,所以需要拿到主表的user_id,更新功能为记录提交时间,短时间不得再次提交 在对一个已有角色权限分配,登录…

蓝牙耳机和笔记本电脑配对连接上了,播放设备里没有显示蓝牙耳机这个设备,选不了输出设备

环境: WIN10 杂牌蓝牙耳机6s 问题描述: 蓝牙耳机和笔记本电脑配对连接上了,播放设备里没有显示蓝牙耳机这个设备,选不了输出设备 解决方案: 1.打开设备和打印机,找到这个设备 2.选中这个设备&#…

【iOS ARKit】协作 Session 实例

协作 Session 使用注意事项 协作 Session 是在 ARWorldMap 基础上发展起来的技术,ARWorldMap 包含了一系列的地标、ARAnchor 及在观察这些地标和 ARAnchor 时摄像机的视场(View)。如果用户在某一个位置新创建了一个 ARAnchor,这时…

C++之善用const修饰成员函数

C之善用const修饰成员函数 文章目录 C之善用const修饰成员函数前言1. 约束函数对成员变量的修改2. 允许 const 对象调用3. 在重载函数中提供重载决策总结 前言 ​ 在C编程中,使用const修饰成员函数是一种非常重要的技术手段,它能够提高代码的可维护性、…

基于Python微博舆情数据爬虫可视化分析系统+可视化+情感分析+爬虫+机器学习(完整系统源码+数据库+详细文档)

文章目录 基于Python微博舆情数据爬虫可视化分析系统可视化情感分析爬虫机器学习(完整系统源码数据库详细文档)源码资料获取在文章末尾1、项目介绍 Pycharm介绍Python语言Echarts简介Navicat Premium 15简介MySQL简介Flask简介 2、项目界面UI详情源码资料…

事物管理(黑马学习笔记)

事物回顾 在数据库阶段我们已学习过事务了,我们讲到: 事物是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功,要么同时…

Windows PowerShell 命令行历史记录补全

Windows 命令行历史记录补全 使用 powershell 安装PSReadLine 2.1.0 Install-Module PSReadLine -RequiredVersion 2.1.0检查是否存在配置文件 Test-path $profile # 为 false 则执行命令创建 New-item –type file –force $profile编辑配置文件 notepad $profile# 输入如下…

springboot 实现本地文件存储

springboot 实现本地文件存储 实现过程 上传文件保存文件(本地磁盘)返回文件HTTP访问服务器路径给前端,进行效果展示 存储 服务端接收上传的目的是提供文件的访问服务,对于SpringBoot而言,其对静态资源访问提供了很…

Python程序的流程

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 年轻是我们唯一拥有权利去编制梦想的时…

VDP (vSphere Data Protection)vsphere备份组件

一 概述 传统的备份:在需要备份的主机上安装备份代理,通过网络连接备份服务器对备份代理发出指令从而将备份数据传输到备份服务器所连接的存储中 不足: 每个虚拟机使用过多的物理资源(备份很占资源)备份过程中&#…

谷歌SEO推广提高网站点击率的10个秘籍-华媒舍

在当今数字化时代,拥有一个高点击率的网站对于企业和个人而言至关重要。通过谷歌SEO推广,可以帮助网站吸引更多的流量,并在搜索引擎结果页面(SERP)中获得更好的排名。本文将介绍10个谷歌SEO推广的秘籍,帮助…

高瓴张磊入籍新加坡,这代表了什么?

文|新熔财经 作者|显洋 这两天,海外媒体报道了中国投资大佬与企业家拿到新加坡永居的事儿。本来乏善可陈的文章,却因为一个人名的出现变得有趣起来——高瓴创始人张磊,一位曾经在国内如日中天,但今天鲜少…

算法沉淀——动态规划之两个数组的 dp(下)(leetcode真题剖析)

算法沉淀——动态规划之两个数组的 dp 01.正则表达式匹配02.交错字符串03.两个字符串的最小ASCII删除和04.最长重复子数组 01.正则表达式匹配 题目链接:https://leetcode.cn/problems/regular-expression-matching/ 给你一个字符串 s 和一个字符规律 p&#xff0c…

音频提取使用什么方法?视频提取音频

在数字技术与多媒体日益普及的今天,音频提取已成为一个常见且重要的任务。无论是为了制作视频、编辑音乐,还是进行语音识别和分析,我们都需要从原始材料中提取音频。那么,音频提取通常使用什么方法呢? 1. 使用专业的音…

Cap0:TensorRT环境搭建

文章目录 1、安装TensorRT1.1、下载TensorRT压缩包1.2、配置环境变量 2、测试2.1、测试源码2.2、编译源码 1、安装TensorRT TensorRT是针对NVIDIA显卡设备的加速方案,你要使用TensorRT则证明你有一定的深度学习基础,那么在你的Ubuntu上配置好显卡驱动、…

【Unity每日一记】角色控制器Character Contorller

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

Django学习记录——管理员-登录注销的实现

1.管理员案例 1.1管理员数据库 1.1.1 表结构 1.1.2 管理员表的建立 class Admin(models.Model):"""管理员表"""username models.CharField(max_length32, verbose_name"用户名")password models.CharField(max_length64, verbose…

前端AR图像增强 + 图像追踪 + 模型渲染

文章目录 背景介绍技术介绍准备目标图片准备3D模型整合到一起演示代码地址背景介绍 本文实现web端html实现AR识别功能 在日常生活中常常看到AR虚拟现实相结合的案例 如下图的效果匹配到目标图片后展示3D模型 从而提高真实度 AR识别 技术介绍 想要达到效果有以下几步是必须的 准…

https://htmlunit.sourceforge.io/

https://htmlunit.sourceforge.io/ 爬虫 HtmlUnit – Welcome to HtmlUnit HtmlUnit 3.11.0 API https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit/2.70.0 https://s01.oss.sonatype.org/service/local/repositories/releases/content/org/htmlunit…

西软云XMS operate XXE漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…