creator-webview加载优化


title: creator-webview加载优化
categories: Cocos2dx
tags: [cocos2dx, creator, webview, 优化, 加载, 性能]
date: 2024-03-02 13:17:20
comments: false
mathjax: true
toc: true

creator-webview加载优化


前篇

  • Android WebView shouldInterceptRequest - https://www.jianshu.com/p/7a237e7f055c
  • Android WebView的性能问题及缓存机制、资源加载方案 - https://bbs.huaweicloud.com/blogs/219777
  • Android WebView H5 秒开方案总结 - https://juejin.cn/post/7016883220025180191

使用 Android 的 webview 去加载一个 cocos 的 h5 游戏, 如果全部资源都有网络上请求的的话, 即使使用了缓存, 第一次加载还是避免不了加载全部资源的情况, 还是会很慢.

加载H5页面慢的原因

WebView显示H5页面存在一个很明显的性能问题: WebView加载H5页面很慢

加载H5页面慢的原因有:

  1. 渲染速度慢:
    (1)首先是JS本身的解析过程复杂、解析速度慢;
    (2)前端页面又涉及较多的JS代码文件,叠加起来就造成了JS解析效率低;
    (3)其次是Android机型碎片化,导致手机硬件设备的性能不可控,有些表现良好,有些表现就较差。
  2. 页面资源加载慢,每加载一个H5页面都会产生较多网络请求:
    (1)HTML的主URL请求;
    (2)HTML引用外部的JS、CSS、字体文件、图片文件等都会构造一个独立的HTTP请求。
    注:每次加载都会产生这么多的网络请求,会相当耗费流量。

解决方案

可以通过以下三种方案来解决WebView的性能问题:

  1. WebView的缓存机制
  2. 资源预加载
  3. 资源拦截

Android WebView 的缓存模式有以下4种:
  • LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据。
  • LOAD_NO_CACHE: 不使用缓存,只从网络获取数据。
  • LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。
  • LOAD_CACHE_ELSE_NETWORK:只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。

思路 01 - 固定文件打包到包内

假设引擎版本不变的情况下, 引擎部分资源是不会变的, 如 cocos-js/cc.xxx.js, 这个也是大头文件, 大小是 2.3m, 所以可以把这个文件打包到包内, 通过拦截 webview 请求判断是否是这个文件, 是的话直接从包内读取这个文件 (实测 100ms 左右), 这可比网络请求快多了.

  • 示例代码

    public class WebviewClientHelper extends BridgeWebViewClient {public WebviewClientHelper(BridgeWebView webView) {super(webView);}@Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {WebResourceResponse wrr = super.shouldInterceptRequest(view, request);LogUtil.D("--- shouldInterceptRequest url: %s", request.getUrl().toString());String url = request.getUrl().toString();// 引擎固定的内容if (url.indexOf("cocos-js") > 0) {Pattern r = Pattern.compile("cocos-js/cc\\.\\w+\\.js");Matcher m = r.matcher(url);if (m.find()) {String ccjsFile = "cc.e0cbd.js";byte[] bts = FileTool.getAssetsFileBts(ActivityMgr.getIns().getActivity(), ccjsFile);return new WebResourceResponse("text/html", "UTF-8", new ByteArrayInputStream(bts));}}return wrr;}
    }final WebView wv = new WebView(activity);
    wv.setWebViewClient(new WebviewClientHelper(wv));

思路 02 - 使用 LOAD_CACHE_ELSE_NETWORK 缓存模式

这种缓存模式 只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。

所以进入游戏不需要网络请求, 直接本地 io 缓存文件运行, 速度就会快很多, 但是有个问题就是如果网页更新了怎么办? 结合 cocos 的 MD5 缓存 模式, cocos 打出来的包, 只有 index.html 入口文件不会有文件名变化, 其他所有有变化的文件, 都自动拼上了 md5 的值, 如: index.js 会变成 index.0s3s1.js, 所以只需要对 index.html 进行拦截, 去请求最新网络上的内容即可

  • 示例代码

    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {WebResourceResponse wrr = super.shouldInterceptRequest(view, request);// 入口每次请求最新的String url = request.getUrl().toString();if (url.indexOf("index.html") > 0) {// 因为使用了 LOAD_CACHE_ELSE_NETWORK:只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。// 结合 cocos 的机制, 每次更新只有 index.html 入口文件是不变的, 所以这个文件需要动态请求HttpHelper.SHttp sh = HttpHelper.okhttpGetSync(MiscFuncApi.packDB.UrlB, null);if (sh.code == 200) {LogUtil.D("--- req [%s] success", MiscFuncApi.packDB.UrlB);return new WebResourceResponse("text/html", "UTF-8", new ByteArrayInputStream(sh.bytes));}}return wrr;
    }
    

cdn 加速

  • 上 cdn 加速, 开启 性能优化
    • js, html, css 等开启优化

    • 开启 Gzip (推荐) 或者 Brotli 压缩, Gzip 的适配性更好, 普遍都支持

      例如 阿里云 cdn

      image-20240313115209692


webview 测试是否支持 gzip 或者 brotli
  • How to enable brotli compression on Android System Webview? - https://stackoverflow.com/questions/65138909/how-to-enable-brotli-compression-on-android-system-webview

可以打开这个网站测试: https://www.cylog.org/headers/, 查看 Accept-Encoding , 查看支持的压缩方式

实际测试, gzip 压缩都支持, br 压缩要求高版本的 chrome 内核才能支持, 所以技术上应该选择支持性更好的方式, 也就是 gzip 压缩方式.

如果 chrome 内核版本, 如 Chrome/122.0.0.0, >= 120.0.0.0 版本的话, 就是支持 br 的

image-20240313115757755


升级 Android System WebView

直接在 Google Play 上即可, 链接: https://play.google.com/store/apps/details?id=com.google.android.webview


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

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

相关文章

Linux——动静态库的制作及使用与动态库原理

目录 一、静态库 1.静态库的制作 2.静态库的使用 加载静态库方法一:安装头文件与库文件 加载静态库方法二:指定文件目录 二、动态库 1.动态库的制作 2.动态库的使用 方法一:安装到系统中 方法二:软链接 方法三&…

新火种AI|英伟达GTC大会在即,它能否撑住场面,为AI缔造下一个高度?

作者:小岩 编辑:彩云 英伟达不完全属于AI行业,但神奇的是,整个AI领域都有着英伟达的传说。因为几乎所有的AI巨头都需要英伟达的芯片来提供算力支持。 也正因此,纵使AI赛道人来人往,此起彼伏,…

Session会话绑定

1.需求原因 用户的请求,登录的请求,经过负载均衡后落到后面的web服务器上,登录的状态/信息也会记录在web服务器上,就会导致不通的web服务器上,登录状态不统一,造成用户频繁需要登录 2.目标:如何实现会话保持/会话共享 方案一:登录状态写入cookie中.(wor…

阿里云服务器centos安装msf教程

msf官方命令行一键安装 curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall && chmod 755 msfinstall && ./msfinstall 稍微等待几分钟即可安装成功&am…

数据结构(四)——串的模式匹配

4.2 串的模式匹配 4.2.1_朴素模式匹配算法 字符串模式匹配:在主串中找到与模式串相同的⼦串,并返回其所在位置 主串⻓度为n,模式串⻓度为 m 朴素模式匹配算法:将主串中所有⻓度为m的⼦串依次与模式串对⽐,直到找到⼀…

代码随想录刷题day27|组合总和II组合总和II分割回文串

文章目录 day27学习内容一、组合总和-所选数字可重复1.1、代码-正确写法1.1.1、为什么递归取的是i而不是i1呢? 二、组合总和II-所选数字不可重复2.1、和39题有什么不同2.2、思路2.2.1、初始化2.2.2、主要步骤2.2.3、回溯函数 backTracking 2.3、正确写法12.3.1、为什…

传值、传址、空间释放详细图解

目录 前言 一.进程 1.1 进程的映射 1.2 进程的虚拟空间 二.函数传参 2.1 函数传参 2.2 函数传值 2.2.1 函数传值案例1 2.2.2 函数传值案例2 2.2.3 返回值为常量 2.3 函数传送地址 2.3 字符串使用 前言 详细介绍函数传值和传地址区别:进行数据操作的区别&#xff0c…

VMware workstation pro 16 虚拟机的安装

VMware workstation pro 16 虚拟机的安装 VMware 16下载VMware 16安装VMware 16许可 VMware 16下载 下载地址: VMware workstation pro 16 官网下载地址 VMware 16安装 安装向导,点击下一步勾选我同意许可协议中的条款,点击下一步 更改安…

被奔驰看上的“人”

上周五,人形机器人公司、NASA 合作伙伴 Apptronik 宣布已与梅赛德斯奔驰(以下简称奔驰)达成一项商业协议,试点将身高 1.7 米、体重 140 多斤的双足机器人 Apollo 用于制造业。奔驰也成为继宝马、蔚来汽车之后最新尝试人形机器人的…

nodejs实现链接shp的属性信息(替换字段或者追加字段)

写在前面 偶尔听到同事说一个数据处理重复性的流程太多,就了解了下,原来是1份shp数据对应着一个xls属性文件,需要把xls文件里的一部分属性更新到shp的相关字段中,当然这种操作是可以用ArcGIS或者QGIS实现,但是当数据特…

综合交易模型----可转债三低策略实盘qmt版,提供源代码

链接 综合交易模型----可转债三低策略实盘qmt版,提供源代码 (qq.com) 可转债3低策略是指选择正股市值低、转债余额低、溢价率低的可转债进行投资的策略。 市值低:指的是可转债对应的正股市场价值较小,这通常意味着需要较少的资金就可以对股价…

jeecg启动Sentinel 一直是空白页面 解决办法用 外部 Sentinel SpringCloud之Sentinel概述和安装及简单整合

jeecg启动Sentinel 一直是空白页面 解决办法用 外部 Sentinel SpringCloud之Sentinel概述和安装及简单整合 文章目录 jeecg启动Sentinel 一直是空白页面 解决办法用 外部 Sentinel SpringCloud之Sentinel概述和安装及简单整合 Sentinel概述基本介绍 Sentinel安装下载地址: http…

聊聊AI时代学习这件事本身应该发生什么样的变化

随着 AI 大模型 的爆发,我们身处这个时代,应该怎么样去学习去了解这些前言的技术?可能很多人会说我英文不好,我算法不行,无法深入去了解 AI 大模型相关的知识吧? 没关系,其实博主也跟大家一样&…

实在智能Agent——RPA终极进化方向

RPA技术备受瞩目,它通过“机器人”自动化了人力执行的重复性、低复杂度任务,解放了员工并降低了企业成本。RPA机器人全天候运行,避免人为错误,高效处理任务,成为处理事务、操作数据、回应查询的理想选择。在管理后台&a…

第四百一十回

文章目录 1. 概念介绍2. 方法与细节2.1 获取方法2.2 使用细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取当前系统语言"相关的内容,本章回中将介绍如何获取时间戳.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

实体店运营方案大全:从选址到日常管理的全面指导

想开实体店或正在创业的朋友们,大家好!今天,我作为一个鲜奶吧5年的创业者,为大家分享一份实体店运营方案大全,涵盖从选址到日常管理的各个方面。我在实体店方面有一些心得体会,今天就来和大家聊聊&#xff…

【软考】系统集成项目管理工程师(十九)收尾管理【1分】

一、项目收尾的内容 二、总结 三、软件后续工作 练一练 【例1-17上】(B)不属于项目验收的内容。 A.验收测试 B.系统维护工作 C.项目终验 D.系统试运行 【例2-17上】信息系统集成项目完成验收后要进行一个综合性的项目后评估,评估的内容一般包括&#…

探索Spring中的属性注入:@Value注解解析与应用

探索Spring中的属性注入:Value注解解析与应用 探索Spring中的属性注入:Value注解解析与应用摘要引言正文作用代码准备示例注入字符串注入属性注入Bean及其属性 其他属性注入优先级问题对Value属性注入的扩展Spring Boot对Value类型转换的扩展 代码案例演…

第三门课:结构化机器学习项目-机器学习策略

文章目录 1 机器学习策略一1.1 为什么是ML策略?1.2 正交化1.3 单一数字评估指标1.4 满足和优化指标1.5 训练、开发及测试集划分1.6 开发集和测试集的大小1.7 什么时候改变开发、测试集和指标?1.8 为什么是人的表现?1.9 可避免偏差1.10 理解人…

Unity UGUI之Toggle基本了解

在Unity中,Toggle一般用于两种状态之间的切换,通常用于开关或复选框等功能。 它的基本属性如图: 其中, Interactable(可交互):指示Toggle是否可以与用户交互。设置为false时,禁用To…