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,一经查实,立即删除!

相关文章

Cesium.js计算两个地理坐标点之间按照1米为间隔进行等分的所有插值点的经纬度坐标

功能介绍: 首先,定义了两个地理坐标点 point1 和 point2,分别表示两个点的经度、纬度和高度。接着,通过 Cesium.Cartesian3.distance 方法计算了两点之间的直线距离。然后,根据直线距离将两点之间的距离进行等分&#…

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的⼦串依次与模式串对⽐,直到找到⼀…

JavaScript语法

* number 数字,不论是整数还是小数,数据类型都是number * string 字符串, * boolean 布尔值,只有两个,true和false. 只有python中是首字母大写 * object 对象,这个比较特殊.你可以理解为所有被new出来的东西…

代码随想录刷题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 引入依赖库1.2 创建自定义组件 2. React(使用React Router)3. Angular(使用Angular Router)4. Vue(使用Vue Router) 1. 多视图 构建多视图的单页应用程序&#x…

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

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

c++算法学习笔记 (11) 离散化

1.前置知识&#xff1a; unique是 c标准模板库STL中十分实用的函数之一&#xff0c;使用此函数需要#include <algorithm>头文件 该函数的作用是“去除”容器或者数组中相邻元素的重复出现的元素。 (1) 这里的去除并非真正意义的erase&#xff0c;而是将重复的元素放到容…

VMware workstation pro 16 虚拟机的安装

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

被奔驰看上的“人”

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

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

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

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

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

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

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

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

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

注册登录Vue3+ElementPlus代码

1、app.vue <script setup>import LoginVue from /views/Login.vue </script><template><LoginVue/> </template> 2、Login.vue <script setup> import { User, Lock } from "element-plus/icons-vue"; import { ElMessage } …

[小程序开发] 外部样式类

一、外部样式类 在使用组件时&#xff0c;组件使用者可以给组件传入CSS类名&#xff0c;通过传入的类名修改组件的样式。 如果需要使用外部样式类修改组件的样式&#xff0c;在Component中需要用extemalClasses定义若干个外部样式类。 二、使用步骤 1、在Component中用externa…

C++面试100问!(一)

STL中MAP数据存放形式&#xff1f; 红黑树。unordered map底层结构是哈希表。 STL有什么基本组成&#xff1f; 容器、迭代器、仿函数、算法、分配器、配接器&#xff0c; 他们之间的关系&#xff1a;分配器给容器分配存储空间&#xff0c;算法通过迭代器获取容器中的内容&…