微信小程序skyline渲染引擎尝鲜

2024-01-11 23:40

本文主要是介绍微信小程序skyline渲染引擎尝鲜,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述
官方描述

当小程序基于 WebView 环境下时,WebView 的 JS 逻辑、DOM 树创建、CSS 解析、样式计算、Layout、Paint (Composite) 都发生在同一线程,在 WebView 上执行过多的 JS 逻辑可能阻塞渲染,导致界面卡顿。以此为前提,小程序同时考虑了性能与安全,采用了目前称为「双线程模型」的架构。

在 Skyline 环境下,我们尝试改变这一情况:Skyline 创建了一条渲染线程来负责 Layout, Composite 和 Paint 等渲染任务,并在 AppService 中划出一个独立的上下文,来运行之前 WebView 承担的 JS 逻辑、DOM 树创建等逻辑。这种新的架构相比原有的 WebView 架构,有以下特点:

  • 界面更不容易被逻辑阻塞,进一步减少卡顿
  • 无需为每个页面新建一个 JS 引擎实例(WebView),减少了内存、时间开销
  • 框架可以在页面之间共享更多的资源,进一步减少运行时内存、时间开销
  • 框架的代码之间无需再通过 JSBridge 进行数据交换,减少了大量通信时间开销
思考

新的skyline渲染引擎能提升性能,减少卡顿,接下来编写长列表代码来测试新引擎的实际性能表现如何。

一、环境准备

在hbuderx中创建项目,选择默认模板,生成基础代码。
文件结构如图。

运行项目后查看详情-本地设置,确保基础库版本在2.30.4以上

manifest.json 文件配置

在mp-weixin 对象内增加如下lazyCodeLoading、rendererOptions 的配置信息,完整配置如下。

{"mp-weixin" : {"appid" : "","setting" : {"urlCheck" : false},"usingComponents" : true,"lazyCodeLoading": "requiredComponents","rendererOptions": { "skyline": { "defaultDisplayBlock": true } }}
}
pages.json 文件配置

在需要Skyline渲染的页面增加renderer、navigationStyle、componentFramework 三个配置项,完整配置如下

{"pages": [{"path": "pages/index/index","style": {"navigationBarTitleText": "uni-app","renderer": "skyline","navigationStyle": "custom","componentFramework": "glass-easel"}}]
}

配置完成重新启动项目会提示切换Skyline调试模式,直接切换。

二、长列表实现

html

<template><view class="navBar"></view><view class="content"><view class="title"> <text>姓名</text><text>学校</text><text>班级</text><text>语文</text><text>数学</text><text>英语</text></view><scroll-view type="list" :scroll-y="true" class="list"><view class="item" v-for="item in list" :key="item.key1"><text>{{ item.key1 }}</text><text>{{ item.key2 }}</text><text>{{ item.key3 }}</text><text>{{ item.key4 }}</text><text>{{ item.key5 }}</text><text>{{ item.key6 }}</text><text>{{ item.key7 }}</text></view><view class="more" @tap="page++">查看更多~</view></scroll-view></view>
</template>

javascript

export default {data () {return {showPage: 1,list: [],page: 1,size: 200}},onLoad() {this.getList()},methods: {getList () {let len = this.list.lengthfor (let i=1; i <= this.size; i++) {this.list.push({key1: len + i,key2: '张三',key3: '1中',key4: '3班',key5: '100分',key6: '90分',key7: '87分',})}}},watch: {'page' () {console.log('页码改变了---', value);this.getList()}}
}

css

.navBar {height: var(--status-bar-height);background-color: red;position: fixed;top: 0;z-index: 9999;
}
.content {font-size: 14px;
}
.title {height: 40px;width: 100%;display: flex;justify-content: space-around;background: #4381ff;
}
.title text {width: 100rpx;color: #fff;line-height: 40px;text-align: center;
}.list {height: calc(100vh - var(--status-bar-height) - 40px);
}.item {height: 40px;width: 100%;display: flex;justify-content: space-around;border-bottom: solid 1px rgba(0, 0, 0, 0.068);
}
.item text {width: 100rpx;line-height: 40px;text-align: center;
}.more {height: 40px;width: 100%;text-align: center;line-height: 40px;color: #4381ff;
}

界面展示如图,点击查看更多一次,多展示一页的数据。

三、性能对比测试
1. 测试说明

复制长列表页面,把pages.json 内两个页面的配置改为普通渲染(webview)。这样子就有了所有条件都一致、渲染方式不同的两个页面,通过查看更多按钮增加列表渲染数量,在不卡顿的前提下数据渲染的条数越多,性能越好,反之越差。

文件结构如图

pages.json 配置如下

{"path": "pages/index/skyline","style": {"navigationBarTitleText": "skyline","renderer": "skyline","navigationStyle": "custom","componentFramework": "glass-easel"}
},
{"path": "pages/index/webview","style": {"navigationBarTitleText": "webview","navigationStyle": "custom"}
}
2. webview渲染

演示视频地址: https://markdownimg-1313808923.cos.ap-chengdu.myqcloud.com/skyline%2F888.mp4

普通的渲染模式(webview)在渲染第2000条数据时,界面卡死,操作无反应。

3. skyline渲染

演示视频地址: https://markdownimg-1313808923.cos.ap-chengdu.myqcloud.com/skyline%2F999.mp4

skyline渲染模式在渲染第7000条数据时,界面卡死,操作无反应

4. 打包uni-小程序

通过hbuderX 发行为小程序包,在iphone5 上运行测试:

  • 未使用skyline配置: 页面渲染10000条数据是出现明显卡顿,点击按钮无反应

  • 使用skyline配置: 页面渲染8500条数据是出现明显卡顿,点击按钮无反应

四、总结
1. 性能

在性能的表现上官方给出的首屏渲染速度数据如图

我们用长列表的渲染数据量对比的结果 2000( webview ) / 7000(skyline) 和官方标定的性能对比图类似,使用skyline引擎渲染的界面确实速度有质的飞跃(至少在长列表渲染场景中)。

2. 遇到的问题
  • 使用skyline渲染模式无法实现整页滚动,必须借助scoroll-view 组件,并指定"type: list"
  • 使用skyline渲染模式必须使用自定义导航栏
  • 开发工具在使用skyline模式时不会热更新
  • 使用hbuderx打包uni-小程序时skyline引擎是不生效的

这篇关于微信小程序skyline渲染引擎尝鲜的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_63212264/article/details/132567440
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/596091

相关文章

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

MySQL 存储引擎 MyISAM详解(最新推荐)

《MySQL存储引擎MyISAM详解(最新推荐)》使用MyISAM存储引擎的表占用空间很小,但是由于使用表级锁定,所以限制了读/写操作的性能,通常用于中小型的Web应用和数据仓库配置中的只读或主要... 目录mysql 5.5 之前默认的存储引擎️‍一、MyISAM 存储引擎的特性️‍二、MyISAM 的主

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

如何基于Python开发一个微信自动化工具

《如何基于Python开发一个微信自动化工具》在当今数字化办公场景中,自动化工具已成为提升工作效率的利器,本文将深入剖析一个基于Python的微信自动化工具开发全过程,有需要的小伙伴可以了解下... 目录概述功能全景1. 核心功能模块2. 特色功能效果展示1. 主界面概览2. 定时任务配置3. 操作日志演示

Redis迷你版微信抢红包实战

《Redis迷你版微信抢红包实战》本文主要介绍了Redis迷你版微信抢红包实战... 目录1 思路分析1.1hCckRX 流程1.2 注意点①拆红包:二倍均值算法②发红包:list③抢红包&记录:hset2 代码实现2.1 拆红包splitRedPacket2.2 发红包sendRedPacket2.3 抢