奇巴布Feed流性能优化

news2024/10/5 11:33:03

01

   项目背景

d4019623db2452a7219d093769cbdf72.png

“爱奇艺奇巴布”是爱奇艺为0-8岁孩子和家长定制化设计的寓教于乐平台,为儿童量身打造精致的观看体验,精彩内容解锁寓教于乐新方式。为儿童提供优质动画内容的同时,我们更关注APP用户体验。在产品交互设计上我们立足儿童视角,把内容浏览和观影做到做到简约易用。奇巴布APP整体界面简约、导航清晰、播放流畅,以极致的设计理念荣获2018年德国红点传达设计奖。

在技术侧我们不断完善技术架构体系,优化提升APP各项性能指标,发挥工匠精神把APP的用户体验做到极致。优化技术方向包括:APP冷启动、Crash防控、内存管理、电量消耗、安装包体积等。奇巴布APP历经数年迭代开发,产品功能不断完善,叠加儿童移动设备换新频次相对成人低,奇巴布APP首页Feed流在老旧设备滑动使用过程中会出现卡顿情况,滑动中有视频播放等场景时页面卡顿比较明显,影响用户体验。

02

   问题现状


  • 卡顿原因

屏幕刷新率由硬件决定,通常是 60Hz/S,或者由 OS 和硬件协调动态调整刷新率。当程序通过 CPU、GPU 渲染画面的过程中,耗时超过一次刷新间隔,就会使得屏幕画面没有更新,导致卡顿现象产生,影响用户体验。

  • Feed卡顿问题分析

使用性能较差的手机滑动Feed流,通过Xcode-Instruments工具分析在滑动过程中具体耗时分布情况。截取代表性性能分析图,如下:

00da64297c1039a2dd8465368141b88e.pngHitch 出现时的耗时调用堆栈1db53eed5abf87b648b0f511d621f20b.png

滑动列表时的统计曝光耗时堆栈

Feed卡顿问题分析总结如下:

  1. Feed中存在较多不同样式Card,多种Card类的合计初始化耗时较长;

  2. Feed中有各种图片,这些本地图片资源在主线程读取和渲染,有性能提升空间;

  3. Feed滑动中图片库(基于SDWebImage二次开发)在读取磁盘缓存文件过程中耗时较长,且在主线程中做读取操作;

  4. Feed滑动过程中播放器开播与停播耗时较长;

  5. Feed滑动过程中Card区块曝光引发频繁Pingback投递,整体耗时较长。

03

   解决方案


  • Card数据解析与渲染异步处理

使用QoS的NSQualityOfServiceUserInitiated创建自定义队列,当前设备CPU活跃核心数和自定义最大核心数比较,获得结果设置队列上限。通过限制并发数量减少多个线程频繁切换带来CPU资源损耗,避免GCD API频繁创建线程。Card数据解析和布局计算、播放器内核初始化、图片和文本渲染都使用该自定义队列来处理。

  • 首页Card预加载

在奇巴布Feed列表中前几屏幕业务数据大多为固定推荐内容组合,Card类型繁多无法复用,因此预先加载前几屏不同Card实例是提高性能的一种技术手段。具体解决方案如下:

  1. 预加载策略:

    APP每次冷启动时,总体策略是以最快速度展示内容给用户,缩短启动时间。首页Feed接口在发送网络请求过程中有网络延迟,在服务端数据传送到本地之前加载本地磁盘缓存的上次启动时Feed流JSON数据。利用磁盘中持久化的JSON数据,解析出JSON对应的Card类,将常用的Card类名缓存到内存,以备在合适的时机初始化Card实例,以备后续滑动Feed时直接读取Card实例,从而避免在滑动过程中初始化。

  2. 预加载时机的判别与执行:

在用户启动APP的瞬间,会存在大量异步业务操作抢占CPU资源。所以需要寻找CPU闲置且用户没有手势操作时预加载Card。监测与执行大体实现逻辑是:通过向主线程RunLoop添加Observer监听DefaultMode,监听作用的时间点为线程进入休眠之前或RunLoop即将退出。当方法回调触发时,意味着用户没有滑动或者滑动结束,在回调方法中做预加载。

  • 本地图片预解码

46eaa1458f046e5ce0c76373d9730bbf.pngFeed中各种本地图片

Feed中不同类型Card中的角标和占位图,这些图片为本地资源,在用户滑动Feed时,过往实现方式是在主线程中从磁盘读取资源,然后进行渲染。将这些I/O操作放入子线程,在图标使用前提前生成Bitmap到内存中,可以减少用户在滑动过程中因加载图片带来的性能损耗。具体解决方案如下:

  1. 预加载策略:

    在APP首页渲染完成后,异步执行统计常用Card中依赖的角标和占位图,提前生成Bitmap, 并加载到内存。Hook图片调用方法[UIImage imageNamed:],在后续调用[UIImage imageNamed:] 方法时将省去I/O和解码过程,并通过以图片名键值匹配方式存储避免多次缓存。

  2. 解码方案:

强制解码过程:iOS15.0以上系统直接调用系统方法imageByPreparingForDisplay进行预解码,其他系统版本则使用 CGBitmapContext 强制解码。

  • 图片库读取优化

图片库设置组件的图片策略是通过异步下载URL对应图片并做缓存。本次优化主要是针对已经加载到缓存的图片,当对应Card再次滑入屏幕时,第一时间加载缓存中图片而不是再走图片库内部方法各种业务逻辑判断。

  • 其他优化

  1. 针对问题现状中第4个问题:Feed滑动过程中播放器开播与停播耗时较长,解决办法是在滑动时避免播放器的初始化,避免播放器的停播,维持播放状态与滑动前一致。另外在Card停播时显性的调用停止加载数据API,防止播放器在后台异步加载数据。

  2. 针对问题现状中第5个问题:Card区块曝光引发频繁Pingback投递耗时较长,且在主线程中操作。解决思路是滑动时对统计方法限流、降低调用频次。曝光精度会有非常小的下降,但在可接受范围内。

04

   项目总结


  • 技术总结

以UML时序图汇总优化技术点,如下图:

42c86c2b8a7815791ddf7a23ead6ca1a.png

  • 项目收益

使用Apple Xcode工具Scroll Hitch Rate监测优化效果,优化后每秒滑动挂起降低至1.4ms,远低于Apple对滑动流畅的标准5ms/s,即使在性能较差的低端机上滑动也非常流畅,用户体验有较大提升。

aee79f2726b52ab9cd36c1c4044a8179.png

注:Scroll Hitch Rate表示图像帧延迟显示在屏幕上的时间总和 Hitch time除以用户滑动屏幕的持续时间 Scroll duration 得到一个比例,它可以反映用户感受到的滑动卡顿的严重程度。

6261be8d72181d7ec9681c3121543f8e.jpeg

也许你还想看

Prometheus监控指标查询性能调优

爱奇艺DRM修炼之路

组件化设计在会员业务的应用和实践

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

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

相关文章

抖音SEO矩阵系统开发分享及搭建流程

目录 产品功能亮点 产品介绍及开发背景 开发要求及实现流程 产品功能亮点 1. 支持多账号多平台一键 授权管理 2.支持矩阵视频批量剪辑,批量发布 3. 多平台关键词布局,提升企业及产品曝光 4. 评论区关键词自动回复,意向线索智能挖掘 5…

RTOS专栏(一) —— rt-thread简单介绍和qemu使用

本期主题: 简单介绍rt-thread介绍qemu和rt-thread怎么配合使用qemu的简单例子 rt-thread & qemu 1.rt-thread介绍2.qemu介绍3.搭建rt-thread和qemu开发环境4.简单例子 1.rt-thread介绍 RT-Thread 是一款完全由国内团队开发维护的嵌入式实时操作系统&#xff0…

《操作系统》期末主观题梳理

操作系统简答题 文章目录 操作系统简答题第一章第二章第三章第四章第五章第六章第七章第八章第九章 第一章 在计算机系统上配置OS(operating system, 操作系统)的目标是什么?作用主要表现在哪几个方面? 在计算机系统上配置OS, 主要目标是实现:方便性、有效性、可…

Error: Flash Download failed - Target DLL has been cancelled

文章目录 背景参考 背景 在使用keilv5进行STM32开发时,配置用JLink进行文件烧录,出现如下错误: 查阅资料,是因为Keil未识别烧录工具,需要进行下面的操作: 1.打开工程配置窗口,点开Debug选项卡…

并查集专题

⭐️前言⭐️ 本篇文章主要介绍与并查集相关的题目。 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 🍉博客中涉及源码及博主…

阿里「通义千问」内测详细使用体验

名人说:一花独放不是春,百花齐放花满园。——《增广贤文》 作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、简要介绍二、分类问题测试0️⃣自我介绍1️⃣生成内容2️⃣回答问题3️⃣对话协…

springboot+vue大学生租房系统(java项目源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的大学生租房系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风歌…

太稳了,支付系统就该这么设计

支付中心系统对内为各个业务线提供统一的支付、退款等服务,对外对接三方支付或银行服务实现资金的流转。如下图: 大部分公司基本都是这样的架构,主要有以下几方面的优点: 形成统一支付服务,降低业务线接入成本及重复研…

数据结构-树,森连,二叉树之间的转换

树》二叉树 1.给兄弟加线 2.给出长子外的孩子去线 3.层次调整 (整体向左偏移45) eg: 1.给兄弟加线: 2.给处长紫外的孩子去线 3.层次调整,整体向左偏移45 (由兄弟转化来的孩子都是右节点&#xff0c…

DJ6-5 目录管理

目录 6.5.1 文件控制块和索引结点 1、文件控制块 FCB 2、索引节点 6.5.2 简单文件目录 1、单级目录结构 2、二级目录结构 3、树形目录结构 6.5.3 目录查询技术 1、线性检索法 2、Hash 方法 文件目录:是指由文件说明索引组成的用于文件检索的特殊文件…

chatgpt赋能python:Python文件复制到指定文件夹——实现简单又高效的文件操作

Python 文件复制到指定文件夹——实现简单又高效的文件操作 如今,人们对于数据的需求越来越多,因此在编程过程中,对于文件的操作也变得越来越重要。而Python作为一种高效而简洁的编程语言,其文件操作也是十分出色的。本文将会带领…

C/C++ ---- 内存管理

目录 C/C内存分布 常见区域介绍 经典习题(读代码回答问题) 选择题 填空题 C语言内存管理方式 malloc/free calloc realloc C内存管理方式 new和delete操作内置类型 new和delete操作自定义类型 operator new和operator delete函数 new和dele…

Linux环境变量总结

Linux是一个多用户的操作系统。多用户意味着每个用户登录系统后,都有自己专用的运行环境。而这个环境是由一组变量所定义,这组变量被称为环境变量。用户可以对自己的环境变量进行修改以达到对环境的要求。 设置环境变量的方法 对所有用户生效的永久性变量 这类变…

K8s进阶6——pod安全上下文、Linux Capabilities、OPA Gatekeeper、gvisor

文章目录 一、Pod安全上下文1.1 配置参数1.2 案例11.2.1 dockerfile方式1.2.2 pod安全上下文方式 1.3 案例21.4 Linux Capabilities方案案例1案例2 二、pod安全策略2.1 PSP(已废弃)2.1.1 安全策略限制维度 2.2 OPA Gatekeeper方案2.2.1 安装Gatekeeper2.…

百度搜索迎来奇点 大模型掀起代际变革

每一轮技术革命掀起的浪潮,大部多数人还没来得及思考或者布局,已经消失于海浪中。机会是给有准备的人的,要发现新兴技术的亮点,并立足自身去积极拥抱它,最后转化为自身前进的动力,跨越周期,迎来…

网站出现403 Forbidden错误的原因以及怎么解决的方法

这几天刚接手一批新做的网站,在访问网站的时候,会时不时的出现403 Forbidden错误,浏览器会给出403 Forbidden错误提示,在打开Access Error中列出的URL之后, 出现以下错误: 403 Forbidden Access to this resource on…

SAP工具箱 批量下载指定表数据到EXCEL

点击蓝字 关注我们 一 前言 下载指定表内容到指定的EXCEL是一个比较简单的程序.但仔细考虑这个程序,还是可以在细节上找出一些关注点 多表内容同时下载,每个表生成一个文件多表选择时,先查看表的记录数大表下载时,拆分下载拆分到不同的文件中拆分到同一个文件中的不同的工作表下…

windows server 2016 ftp搭建详细教程

一.什么是FTP? FTP(File Transfer Protocol)是TCP/IP网络上两台计算机传送文件的协议,使得主机间可以共享文件。 接下来我给大家分享快速搭建FTP服务器的方法。 二.安装FTP服务器 1.进入服务器系统打开“服务器管理器”,点击“添加角色和功…

【JavaSE】Java基础语法(二十三):递归与数组的高级操作

文章目录 1. 递归1.1 递归1.2 递归求阶乘 2. 数组的高级操作2.1 二分查找2.2 冒泡排序2.3 快速排序2.4 Arrays (应用) 1. 递归 1.1 递归 递归的介绍 以编程的角度来看,递归指的是方法定义中调用方法本身的现象把一个复杂的问题层层转化为一个与原问题相似的规模较…

C语言2:说心里话

描述 分两次从控制台接收用户的两个输入:第一个内容为“人名”,第一个内容为“心里 话”。 然后将这两个输入内容组成如下句型并输出出来: 1.(人名),I want to say,(心里话 2. 输入输出示例: 输入&#xff…