微信小程序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渲染引擎尝鲜的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/596091

相关文章

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

SpringBoot集成LiteFlow工作流引擎的完整指南

《SpringBoot集成LiteFlow工作流引擎的完整指南》LiteFlow作为一款国产轻量级规则引擎/流程引擎,以其零学习成本、高可扩展性和极致性能成为微服务架构下的理想选择,本文将详细讲解Sp... 目录一、LiteFlow核心优势二、SpringBoot集成实战三、高级特性应用1. 异步并行执行2

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 带图