Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >小程序上视频列表的渲染与性能优化

小程序上视频列表的渲染与性能优化

作者头像
腾讯大讲堂
发布于 2020-10-30 07:40:11
发布于 2020-10-30 07:40:11
4K00
代码可运行
举报
运行总次数:0
代码可运行

| 导语  小程序的部分组件是由客户端渲染的原生组件,本文使用的 video 组件属于其中之一。视频列表涉及多个 video 组件的渲染、资源加载、滑动,处理不当会带来比较大的性能消耗。本文通过多种方案的对比,探讨视频列表渲染的最佳姿势,达到性能优化的目的。

一、背景

qq 小程序应用商店上的“值得一玩”模块,是由多个横向排列的视频组成的视频列表。该模块始终有一个视频完全处于可视区域,下一个视频的一部分露出。左右滑动列表切换下一个视频到可视区域,在 wifi 条件下自动播放可视区域视频。效果如下图所示:

根据业务需要,视频列表采用腾讯视频插件 txv-video 代替 video 组件,txv-video 底层也是 video 组件,只是在上面多封装了一层。

二.渲染方案对比

方案1:一次性渲染所有的 video 组件

刚拿到这个需求,想着 video 组件数量不多(最多5个),直接全部渲染影响应该不大。效果如下所示:

可以看到,模块加载时间过长,出现了 1-2s 的白屏现象。

下面从原生组件的渲染过程来解释原因。原生组件有非同层渲染、同层渲染2种渲染方式。

非同层渲染下,video 组件的渲染过程:

1. WebView 渲染一个占位元素,包括创建组件,计算组件位置、大小,通知客户端。

2. 客户端在相同的位置上,根据宽高插入一块原生区域进行渲染。

同层渲染下,video 组件的渲染过程(ios和安卓渲染方式不同,此处以安卓为例):

1. WebView 创建一个 embed DOM 节点并指定组件类型。

2. chromium 内核会创建一个  WebPlugin 实例,并生成一个渲染层 RenderLayer。

3. WebView 通知客户端创建原生组件。

4. 客户端将原生组件的画面绘制到步骤2创建的 RenderLayer 所绑定的 SurfaceTexture 上。通知 chromium 内核渲染该 RenderLayer 。

5. chromium 渲染该 embed 节点并上屏。

在非同层渲染下,原生组件的层级永远高于 Webview 的层级(无论 z-index 设置为多少),当组件位置发生改变时, Webview 通知客户端更新。这样会导致在切换视频时,video 组件位置的更新速度跟不上滑动速度,出现“连在一起”的现象。

安卓的同层渲染真正将原生组件视图加到了 WebView 的渲染流程中且 embed 节点是真正的 DOM 节点。当组件的位置发生改变时,WebView 更新,不用与客户端通信。目前 qq 小程序的 video 组件已经支持同层渲染。

可以看到,渲染过程涉及 WebView、客户端、内核的一系列操作。因此,当 video 组件个数越多时,渲染这些 video 组件耗费的时间越长。

方案2:开始只加载1个 video 组件,移动到目标区域后再加载 video 组件

根据方案1的结论,减少模块加载时渲染的video 组件个数。开始只渲染1个 video 组件,其余不在可视区域的用 image 标签代替,移动到可视区域后再渲染 video 组件。效果如下所示:

可以看到,相比方案1,模块加载时间明显减少。

同时发现:在 wifi 条件下自动播放可视区域视频,左右滑动时会发生卡顿现象。如下所示:

尝试了开启 3d 加速、先暂停视频再滑动(避免直接滑动视频带来的性能问题)等方法都没有明显的改进。在非 wifi 情况下,不自动播放可视区域视频,不会发生卡顿现象。

滑动切换播放视频的过程如下图所示:

视图层 Webview 处理 touch 事件,调用 callMethod 与 逻辑层 Appservice 通信;Appservice 收到当前 video 组件的 index 信息后,setVid 加载资源,执行 play 操作, 通知客户端;客户端播放当前视频,暂停上一个视频。

从表象上看,卡顿现象的发生与滑动到目标区域后是否播放视频有关。是 Appservice 与客户端的通信阻塞了 Webview 的操作?还是播放视频导致了卡顿的发生呢?

小程序的卡顿通常发生在逻辑层与视图层频繁地通信、页面节点数过多等情况下,Appservice 与客户端的简单一次通信并不会造成卡顿的发生,猜想是播放视频导致了卡顿。去除自动播放视频的操作,手动控制 video 组件播放或暂停,切换视频时发现卡顿依然明显。卡顿与滑动到目标区域后是否立即播放视频没有关系,而与播放过的video组件个数有关,播放过的video组件个数越多,切换时越卡顿。

下面从 chromium 内核对 <video> 标签的处理来解释原因。

chromium 是通过 WebKit 解析网页内容的。当 WebKit 遇到 <video> 标签时,就会创建一个播放器实例。WebKit 并没有自己实现播放器,而仅仅是创建一个播放器接口。通过这个播放器接口,可以使用平台提供的播放器来播放视频的内容。当创建  <video> 标签时,仅仅创建了类型为 HTMLMediaElement 的 DOM 节点。当为 video 组件的 src 赋值时,会调用接口创建播放器,进行视频资源信息加载、视频解码等一系列操作,“真正”渲染 video 组件。

上述操作会占用一部分系统资源,播放过的 video 组件个数越多,占用的系统资源越多,切换视频时越卡顿。即使暂停视频也没用,video组件实例仍然存在没被销毁,依旧占用系统资源。

方案3:video 组件实例复用

根据方案1、2的结论,减少 video 组件实例个数。考虑采用3个 video 组件,索引为 index % 3 的 video 组件用来播放当前视频,索引为 ( index+1 ) % 3 的 video 组件用来预加载下一个视频,索引为( index+2 ) % 3 的 video 组件用来缓存上一个视频。在左右滑动切换时仅更改这3个 video 组件的 transform,达到视觉隐藏和实例复用的目的。从需求背景可以看到,本需求要求下一个视频的一部分露出,与本方案不太符合,本方案更适合一个视频占满整个可视区域的使用场景,比如微视无限列表。

方案4:video 组件即用即毁,其余用 image 标签代替

从上面的分析可以得到,减少模块加载时间和提高视频切换性能的关键在于减少 video 组件实例数,需要及时销毁当前没有使用的 video 组件实例。因此,只渲染可视区域的 video 组件,其余用 image 标签代替,当 video 组件滑出可视区域后,及时销毁该 video 组件实例。

关键代码如下所示:

 <txv-video

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            class="topic-video"
            wx:if="{{ videoVid[index] && viewportList[index] }}"
            vid="{{ videoVid[index] }}"
            playerid="topic-video-{{ index }}"
            poster="{{ item.videoCover }}"
            bindplay="playVideo"
            bindpause="pauseVideo"
            muted="{{ true }}"
            showMuteBtn="{{ true }}"
            enableProgressGesture="{{ false }}"
            data-app="{{ item }}"
            bindtap="tapVideo"
            autoplay="{{ videoVid[index] }}"
            showFullscreenBtn="{{ false }}"
            showCenterPlayBtn="{{ false }}"
          ></txv-video>
          <view wx:if="{{ !videoVid[index] || !viewportList[index] }}"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class="topic-video-image">
            <image src="{{ item.videoCover }}" class="topic-video-cover">
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
</image>
            <image
              src="../../images/ad-friend-watch/topic-video-play-btn.png"
              class="topic-video-play-btn"
              bind:tap="tapVideo"
            ></image>
          </view>

视频切换效果如下所示:

可以看到,切换视频时不存在卡顿现象,性能得到了明显的提升。

本方案对 video 组件即用即毁,滑动到可视区域时才渲染组件,相比 video 组件实例复用,花费的时间会不会多很多呢?

从方案2中的分析可以得到,在 video 组件的 src 赋值前,仅创建了一个 DOM 节点,该步骤的时间花销较小。在 video 组件的 src 赋值后,才“真正”渲染 video 组件。所以,对于切换到 src 没有被赋值的 video 组件,本方案和 video 组件实例复用的时间花销差不多。但是,对于视频被播放过再切回该视频的情况,因为该 video 组件已经被销毁,会再次经历渲染 video 组件、加载资源等操作,有一定的时间损耗和用户流量的损耗。考虑到非wifi情况下不会自动播放视频,视频时长较短(15-30秒),且用户来回滑的行为概率较小,相比明显卡顿甚至卡死现象,还是更能让人接受。

数据分析方法入门

从0开始打造UI框架:动态化框架Scrollview物理学算法解析

直播插件体系设计

喜欢本文?快点“在看”支持一下↓↓

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯大讲堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
小程序视频组件踩坑历险记
实现一个长列表页,列表中有视频和图文两种元素,未播放的视频上显示标题,在列表页点击视频后直接全屏播放。
IMWeb前端团队
2019/12/03
2.2K0
仿抖音视频全屏播放&滑动切换
随着移动技术的快速迭代,数据流量费用的快速下降,视频、直播正成为全民的媒体盛宴,我司必然也不会缺席此次盛宴,这里讲述的是通过h5实现仿抖音视频全屏播放&滑动切换的效果,供我司直播鉴定回放视频使用。
前端小tips
2021/11/30
4.5K0
仿抖音视频全屏播放&滑动切换
uni-app小程序开发
https://opendocs.alipay.com/mini/ide/download
码客说
2024/05/15
3080
uni-app小程序开发
小程序的当下和未来可能 | 崔红保在GMTC 深圳站演讲内容整理
简要介绍今天的分享大纲,罗马不是一天建成的,小程序也不是一天发明的;小程序这种介于H5和Native App之间的特殊应用形态,从探索到成熟,经历了哪些过程,我们首先带大家回顾梳理一下,然后从现有技术架构出发,分析小程序当下几个主要性能坑点,各家小程序引擎为解决这些坑点,做了哪些完善工作;比如大家知道小程序是以web渲染为主、原生渲染为辅,那引入原生渲染后,引发了哪些新的问题?为解决这些,微信提出了同层渲染的方案,同层渲染在技术层面上又是如何实现的?最后从当前已知问题出发,对于小程序未来的技术更迭,抛出一些我们认为的可能方向,供大家参考。
CHB
2020/04/10
1.2K0
小程序的当下和未来可能 | 崔红保在GMTC 深圳站演讲内容整理
小程序长列表优化实践
在一些电商的小程序项目中,长列表是一个很普遍的场景,在加载大量的列表数据的过程中,可能会遇到手机卡顿,白屏等问题。也许数据进行分页处理可以防止一次性加载数据带来的性能影响,但是随着数据量越来越大,还是会让小程序应用越来越卡顿,响应速度越来越慢。这种问题不仅仅在小程序上,在移动端 h5 项目中同样存在。
用户6835371
2022/09/01
2.8K0
小程序长列表优化实践
视频播放优化浅析
随着移动终端的普及和网络的提速,以短视频为媒介的内容成了大家普遍接受和喜欢的内容消费形式。但是短视频是如何从一个视频地址到我们能看见的音视频内容呢?我们都知道播放器就是用来完成视频从地址解析到视频渲染这个流程的集合。那在我们Android平台上播放器的发展和演进过程中,有哪些实现方式?他们背后都有些什么优缺点呢?对于一个内容消费者来说,在浏览短视频的过程中,哪些性能指标是影响用户体验的呢?技术人员对于这些性能指标有哪些可做的优化?以及在快速的版本迭代中如何保证海量用户的播放体验呢?带着这些问题,本文尝试从
微信终端开发团队
2021/06/02
4.8K0
基于 Cocos 的高性能跨平台开发方案
2018 年 6 月 GMTC 全球移动技术大会在北京举办,大会旨在通过聚焦前沿技术与实践经验帮助参会者了解移动开发、前端领域最新的技术趋势与最佳实践。
HaHack
2018/08/02
3.2K0
基于 Cocos 的高性能跨平台开发方案
同层渲染
可能作为 iOS 开发者,对同层渲染这个名词比较陌生,但是如果大家开发过小程序,应该对这个名词就不会陌生,因为小程序中有一类组件叫做原生组件(native-component),比如camera、video等,这类组件在渲染过程中最终会映射成下文提到的原生组件。
CoderStar
2022/08/24
1.9K0
同层渲染
K歌礼物视频动画 web 端实践及性能优化回顾
K 歌移动客户端19年在直播间中上线了视频礼物资源动画能力,使用特制的视频资源加通道导出和混合 (基于企鹅电竞vapx方案),支持了细腻的视频动画素材播放渲染,同时解决了直接播放视频背景无法透明的问题。 ‍‍‍‍‍‍在随后的新 pc 主播端项目中我们对直播工具进行重构 (主界面 UI 基于 web 完成),礼物动画部分由于当时没有 web 版本的 sdk,为了复用线上已有的动画资源以及和移动端保持对齐的效果,web 端通过 video + canvas/webgl 实现进行了支持。 此文回顾
QQ音乐技术团队
2020/08/17
2.7K1
关于直播卖货系统平台在微信浏览器中音视频播放的问题
Android 上,因为各个软件使用的浏览器渲染引擎不一样,所以直播卖货系统页面播放的效果差异也很大,这里主要以微信为主。微信使用的是腾讯浏览器自带的X5内核。
云豹kj的晨曦
2020/09/17
1.5K0
关于直播卖货系统平台在微信浏览器中音视频播放的问题
播放器秒开优化丨音视频工业实战
视频播放时的画面打开速度是播放体验中一个非常重要的指标,如果视频画面打开速度太慢,用户失去耐心可能就直接划走不看了。如果视频速度打开够快,甚至可以带来业务上的收益,字节跳动就曾给出过一份数据:对一部分型号的 Android 手机,播放首帧时长从平均 170ms 优化到 100ms,带来了 0.6% 左右的用户播放时长提升。
关键帧
2023/02/14
3.8K0
播放器秒开优化丨音视频工业实战
小程序应用中WebView中原生组件限制问题解析
在微信的文档中有一个章节说明了『 [原生组件的使用限制](https://developers.weixin.qq.com/miniprogram/dev/component/native-component.html#%E5%8E%9F%E7%94%9F%E7%BB%84%E4%BB%B6%E7%9A%84%E4%BD%BF%E7%94%A8%E9%99%90%E5%88%B6) 』有这么一段话
openapplus
2018/09/14
2.1K0
小程序长列表性能优化实践
https://juejin.cn/post/6966904317148299271
落落落洛克
2021/07/05
1.2K0
小程序长列表性能优化实践
如何让视频会议在小程序上开起来
|导语  使用企业微信跨组织间会议门槛较高,要求外部客户或合作伙伴先建立在企业微信的线上组织才可入会,通过引入小程序入会能力,降低跨组织会议的门槛; 为解决微信用户发起会议,邀请企业微信、微信好友入会的场景,企业微信会议小程序也提供在微信侧接入和发起会议的能力,实现微信用户发起会议邀请企业成员加入会议的能力; 产品功能说明 企业微信的会议是接入了腾讯云提供的XCast SDK,腾讯会议后台提供了Rest APi接口用于创建会议、加入会议、获取会议信息等; 企业微信的会议是接入了腾讯云提供的XCast S
腾讯大讲堂
2020/09/30
12.4K1
视频H5 video最佳实践
随着 4G 的普遍以及 WiFi 的广泛使用,手机上的网速已经足够稳定和高速,以视频为主的 HTML5 也越来越普遍了,相比帧动画,视频的表现更加丰富,这里介绍一些实践经验。
gnip
2020/10/28
5.1K0
微信活动小程序性能优化实践
作者:louiszhai,腾讯增值服务项目管理员工 背景 为了满足日益复杂的小程序活动需求,腾讯增值服务项目组开发了一款Ulink活动小程序,该小程序以游戏社交圈为依托,提供游戏玩家基本的社交功能,如发帖、评论、点赞、分享等。 为了支持这些功能,进行了一系列的性能优化改进。Ulink活动小程序共有5个tab,分别提供关注人的feeds信息、所有用户的精品分享,图文发布入口、消息及个人页,如下所示。 开发过程中折腾了各种各样的挑战和难题。其中以性能问题最为棘手,主要有体现在以下几个方面: 小程序首次访问
腾讯大讲堂
2020/05/17
7.1K0
日访问百万级微信小程序优化技巧总结
之前负责的锡慧在线小程序是一款公益性质在线教育类小程序,因疫情影响导致流量暴增,日访问过百万
薛定喵君
2020/02/17
2.7K0
干货 | Taro虚拟列表最佳实践
最近组内小程序项目从Taro1迁移到了Taro3,紧跟凹凸实验室的步伐,开发体验确实比版本1好了很多,完全支持React语法,没有了那么多鸡肋的限制,项目的可配置程度也大大放开,充分给予了开发者自由发挥的空间。
携程技术
2021/07/22
1.8K0
杨春文:小程序在直播产品中的技术应用
我是腾讯的杨春文,老东家在百度,目前在深圳腾讯,做的主要产品是web相关。我本身做NOW直播,所以会讲基于腾讯云的直播小程序,然后是小程序终端开发,总结一些经验点,更注重于开发者和一线工程师所关注的包括性能等等的开发经验。
腾讯云开发者社区技术沙龙
2018/05/08
2.2K0
杨春文:小程序在直播产品中的技术应用
从Webkit内部渲染机制出发,谈网站渲染性能优化
本文由 jerryOnlyZRJ 首发于 IMWeb 社区网站 imweb.io。点击阅读原文查看 IMWeb 社区更多精彩文章。 本文是对前文:网站性能优化实战——从12.67s到1.06s的故事 相关知识的补充,文中的“前文”一词同此。 特以此文向《WebKit技术内幕》作者朱永盛前辈致敬。 0.引言 自上次发布了《网站性能优化实战——从12.67s到1.06s的故事》一文后,发现自己对页面渲染性能这个版块介绍的内容还不够完善,为了更清晰的梳理浏览器渲染页面的机制,以让读者更为全面了解渲染性能优化的深
用户1097444
2022/06/29
8280
从Webkit内部渲染机制出发,谈网站渲染性能优化
相关推荐
小程序视频组件踩坑历险记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档