creator-webview加载优化

news2024/11/21 20:17:25

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);
        }
    
        @Override
        public 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.coloradmin.cn/o/1512862.html

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

相关文章

得物布局构建耗时优化方案实践

一、背景 当谈到移动应用程序的体验时,页面启动速度是其中至关重要的一点,更快的页面展示速度确保应用程序可以迅速加载并响应用户的操作, 从而提高用户使用 App 时的满意度。在页面启动的整个流程中,随着 UI 复杂度的上升,布局的…

jmeter发送请求参数如何使用变量

问题描述 发送jmeter请求时,想设置请求参数为变量 解决方法

190基于matlab的tfrSTFT时频分布图

基于matlab的tfrSTFT时频分布图,计算时间序列的STFT时频分布图,得到瞬时频率。通过GUI可以调节图像的展示样式。程序已调通,可直接运行。 190 STFT时频分布图 瞬时频率 能量谱 (xiaohongshu.com)

剪切板工具Ditto

https://github.com/sabrogden/Ditto/releases 1.开源免费Ditto 快捷键 ctrl (j键盘 esc下面的符号) 挺好用的,解决问题 投标中需要重复填写的内容,可以通过他进行 实时复制信息 2.windows自带的黏贴板工具 win键v调出快捷键

数字孪生+工业互联网标识解析,打造智能工厂新标杆!

当前,工业4.0浪潮愈发澎湃,加快数字化、网络化、智能化发展成为了制造业转型升级的必然要求。 51WORLD基于数字孪生技术与工业互联网标识解析体系,打造了一个集协同化供应、个性化定制、智能化生产于一体的全连接产线孪生平台(以…

电脑记事本分类密码怎么设置?记事本备忘录分类密码设置方法

身为一名文字工作者,我每天都需要在电脑上记录大量的信息和灵感。电脑记事本备忘录对我来说,就像是一位随时待命的助手,帮助我捕捉每一个稍纵即逝的想法。然而,在开放的办公环境中,我总有些隐隐的担忧——毕竟&#xf…

【Python】新手入门学习:详细介绍组合/聚合复用原则(CARP)及其作用、代码示例

【Python】新手入门学习:详细介绍组合/聚合复用原则(CARP)及其作用、代码示例 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集…

Affinity Photo:像素大师,影像重塑者 mac/win版

在数字图像处理领域,Affinity Photo已经崭露头角,成为许多专业摄影师和图像设计师的首 选工具。这款软件不仅具备丰富的功能和强大的性能,还提供了直观易用的操作界面,让用户能够轻松实现高质量的图像处理。 Affinity Photo 软件…

通过el-select选择器和el-tree树形结构二次封装(vue2+elementUI),开发element-plus的TreeSelect树形选择器

需求: 领导看我在另一个vue3项目的el-tree-select挺好的,叫我移入vue2的项目中。 但是vue2版本的elementUI,并没有这个组件,所以只能自己找,找半天找不到和它差不多的,通过网友写的组件改写的 参考链接&…

vMware WorkStation创建虚拟机安装CentOS7,NAT模式配置网络

一、安装虚拟机 1、选择典型(推荐)配置 2、选择稍后安装操作系统 3、操作系统选择CentOS7 64位 4、虚拟机命名、选择安装位置 6、指定磁盘容量 7、指定磁盘容量 步骤: (1)、系统内存2GB (2)、…

c++中string的模拟实现(超详细!!!)

1.string的成员变量、(拷贝)构造、析构函数 1.1.成员变量 private:char* _str;size_t _size; //string中有效字符个数size_t _capacity; //string中能存储有效字符个数的大小 1.2(拷贝)构造函数 //构造函数string(const char* …

IDEA 2022.1以上版本 配置使用新UI

1、进入此页面的快捷建CtrlAltShift/ 2、新UI配置 3、原设置

算法练习:二分查找

目录 1. 朴素二分查找2. 在排序数组中查找元素的第一个和最后一个位置3. 搜索插入位置4. x的平方根5. 山脉数组的峰值索引6. 寻找峰值7. 寻找旋转排序数组中的最小值8. 点名 1. 朴素二分查找 题目信息: 题目链接: 二分查找二分查找的使用前提为数据具有&…

System类 --java学习笔记

System System代表程序所在的系统,也是一个工具类 常见System方法: 按照惯例,exit括号中非零状态码表示异常终止,填零则表示人为终止 currentTimeMillis()返回的是long类型的时间毫秒值:指的…

iOS增量报告生成方案

一,iOS覆盖率报告生成逻辑 iOS覆盖率报告生成与Android有很大的不同,主要的生成逻辑如下: 1,将profraw文件,通过命令xcrun llvm-profdata merge -sparse转换成profdata; 2,再将profdata文件,通…

SCI 机器视觉领域期刊,审稿周期

(1)pattern recognition letters, 从投稿到发表,一年半时间 (2)Pattern recognition 不好中,时间长 (3)IEICE Transactions on Information and Systems, 作者中有一个必须是会员。收费高,审稿快。影响因子0.4 (4)Internationa…

SpringBoot实战项目——博客笔记项目

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、项目介绍二、项目的整体框架 2.1 数据库模块 2.2 前端模块 2.3 后端模块三、项目图片展示四、项目的实现 4.1 准备工作 4.…

PHP爬虫技术:利用simple_html_dom库分析汽车之家电动车参数

摘要/导言 本文旨在介绍如何利用PHP中的simple_html_dom库结合爬虫代理IP技术来高效采集和分析汽车之家网站的电动车参数。通过实际示例和详细说明,读者将了解如何实现数据分析和爬虫技术的结合应用,从而更好地理解和应用相关技术。 背景/引言 随着电…

git svn混用

背景 项目代码管理初始使用的svn, 由于svn代码操作,无法在本地暂存,有诸多不便,另外本人习惯使用git. 所以决定迁移至git管理 迁移要求: 保留历史提交记录 迁移流程 代码检出 git svn svn_project_url git代码提交 修改本…

突然估摸出了chrome数据的备份

首先是下载 其默认下载到c盘。 我们打开刚刚安装的chrome的位置, 我电脑上是 C:\Users\Lenovo\AppData\Local\Google\Chrome\Application 第一个文件名和版本号对应。 我们查看其上级目录,可以发现有个User Data,这个文件夹里面存放的就是…