认识Creator热更新

news2024/11/16 10:36:47

Creator热更新

1、什么是热更新

当你下载一个游戏,比如王者荣耀,打开时发现提示有新的资源包要让你更新,那就是使用了热更新。

在这里插入图片描述

热更新主要是用于原生环境的andriod和ios,对于小游戏不用,小游戏是审核过后,打开原来的小游戏马上就会更新,而安装包 .apk/.ipa已在这里插入图片描述
经是安装在手机上了。如果不把原来的游戏卸载,再去下载更新过的游戏,那么是玩不到更新过的游戏,一直是老版本。

而热更新就是玩家不用去下载新版本,直接更新资源包就能更新这个游戏,当你将这个游戏(应用包)的所有数据清空后,你发现这个游戏又变成了老版本。

所以经过热更新后·是把有变化的资源存在缓存中,游戏中使用的资源,优先是使用搜索到缓存中的资源。

2、Creator中的热更新

Cocos Creator 中的热更新主要源于 Cocos 引擎中的 AssetsManager 模块对热更新的支持。它有个非常重要的特点:

服务端和本地均保存完整版本的游戏资源,热更新过程中通过比较服务端和本地版本的差异来决定更新哪些内容。这样即可天然支持跨版本更新,比如本地版本为 A,远程版本是 C,则直接更新 A 和 C 之间的差异,并不需要生成 A 到 B 和 B 到 C 的更新包,依次更新。所以,在这种设计思路下,新版本的文件以离散的方式保存在服务端,更新时以文件为单位下载。

除此之外,由于 WEB 版本可以通过服务器直接进行版本更新,所以资源热更新只适用于原生发布版本。AssetsManager 类也只在 jsb 命名空间下,在使用的时候需要注意判断运行环境。

2.1、使用Manifest文件

对于不同版本的文件级差异,AssetsManager 中使用 Manifest 文件来进行版本比对。本地和远端的 Manifest 文件分别标示了本地和远端的当前版本包含的文件列表和文件版本,这样就可以通过比对每个文件的版本来确定需要更新的文件列表。

Manifest 文件中包含以下几个重要信息:

  1. 远程资源包的根路径
  2. 远程 Manifest 文件地址
  3. 远程 Version 文件地址(非必需)
  4. 主版本号
  5. 文件列表:以文件路径来索引,包含文件版本信息,一般推荐用文件的 md5 校验码来作为版本号
  6. 搜索路径列

其中 Version 文件内容是 Manifest 文件内容的一部分,不包含文件列表。由于 Manifest 文件可能比较大,每次检查更新的时候都完整下载的话可能影响体验,所以开发者可以额外提供一个非常小的 Version 文件。AssetsManager 会首先检查 Version 文件提供的主版本号来判断是否需要继续下载 Manifest 文件并更新。

2.2、Creator热更新原理

对于 Cocos Creator 来说,所有 JS 脚本将会打包到 src 目录中,其他 Assets 资源将会被导出到 assets 目录。

基于这样的项目结构,本篇教程中的热更新思路很简单:

  1. 基于原生打包目录中的 assets 和 src 目录生成本地 Manifest 文件。
  2. 创建一个热更新组件来负责热更新逻辑。
  3. 游戏发布后,若需要更新版本,则生成一套远程版本资源,包含 assets 目录、src 目录和 Manifest 文件,将远程版本部署到服务端。
  4. 当热更新组件检测到服务端 Manifest 版本不一致时,就会开始热更新

注意:项目中包含的 remote-assets 为 debug 模式,开发者在测试的时候必须使用 debug 模式构建项目才有效,否则 release 模式的 jsc 文件优先级会高于 remote-assets 中的资源而导致脚本失效。

2.3、Creator简单实现

使用场景:比如当前版本1.0,远端服务器版本已经是2.0版本了,此时需要将当前版本的更新为2.0版本,就需要更新。

使用方式:比如version_generator.js(GitHub | Gitee)这是一个用于生成 Manifest 文件的 NodeJS 脚本。使用方式如下:

> node version_generator.js -v 1.0.0 -u http://your-server-address/tutorial-hot-update/remote-assets/ -s native/package/ -d assets/

参数说明:

  • -v 指定 Manifest 文件的主版本号。
  • -u 指定服务器远程包的地址,这个地址需要和最初发布版本中 Manifest 文件的远程包地址一致,否则无法检测到更新。
  • -s 本地原生打包版本的目录相对路径。
  • -d 保存 Manifest 文件的地址。

官方文档范例工程的热更新组件的实现位于 assets/scripts/module/HotUpdate.js(GitHub | Gitee)中,开发者可以参考这种实现,也可以自由地按自己的需求修改。

除此之外,范例工程中还搭配了一个 Canvas/update 节点用于提示更新和显示更新进度供参考。即更新弹框。

在这里插入图片描述

需要修改本地的以下几个地方来让游戏可以成功找到远程包:

  1. assets/project.manifest:游戏的本地 Manifest 文件中的 packageUrlremoteManifestUrlremoteVersionUrl
  2. remote-assets/project.manifest:远程包的 Manifest 文件中的 packageUrlremoteManifestUrlremoteVersionUrl
  3. remote-assets/version.manifest:远程包的 Version 文件中的 packageUrlremoteManifestUrlremoteVersionUrl

main.js 附加上搜索路径设置的逻辑:

// 在 main.js 的开头添加如下代码
if (cc.sys.isNative) {
    var hotUpdateSearchPaths = cc.sys.localStorage.getItem('HotUpdateSearchPaths');
    if (hotUpdateSearchPaths) {
        jsb.fileUtils.setSearchPaths(JSON.parse(hotUpdateSearchPaths));
    }
}

或者直接使用项目仓库根目录下的 main.js 覆盖原生打包文件夹内的 main.js。注意,每次使用 Cocos Creator 构建后,都需要重新修改 main.js

这一步是必须要做的原因是,热更新的本质是用远程下载的文件取代原始游戏包中的文件。Cocos2d-x 的搜索路径恰好满足这个需求,它可以用来指定远程包的下载地址作为默认的搜索路径,这样游戏运行过程中就会使用下载好的远程版本。另外,这里搜索路径是在上一次更新的过程中使用 cc.sys.localStorage(它符合 WEB 标准的 Local Storage API)固化保存在用户机器上,HotUpdateSearchPaths 这个键值是在 HotUpdate.js 中指定的,保存和读取过程使用的名字必须匹配。

此外,打开工程过程中如果遇到这个警告可以忽略:loader for [.manifest] not exists!

2.4、热更新内部的一般流程

Creator热更新流程

  1. 判断是否需要更新

    在游戏启动后,需要向服务器发送请求,获取游戏版本号和更新信息。如果服务器上的版本号高于客户端的版本号,就需要进行更新。可以使用 cc.loader.loadRes 方法加载服务器配置文件,然后比较版本号来判断是否需要更新。

    cc.loader.loadRes("version", (err, data) => {
        if (err) {
            cc.error(err.message || err);
            return;
        }
        let remoteVersion = data.version;
        if (remoteVersion > cc.sys.localStorage.getItem("version")) {
            // 需要更新
        } else {
            // 不需要更新
        }
    });
    
  2. 创建热更新场景

    在 Cocos Creator 中,需要创建一个热更新场景,用于显示更新进度和更新结果。热更新场景通常包括一个进度条和一个文本标签。

  3. 下载更新包

    如果需要更新,就需要下载更新包。可以使用 cc.loader.load 方法下载更新包,并设置进度回调函数来显示下载进度。

    cc.loader.loadRes("version", (err, data) => {
        if (err) {
            cc.error(err.message || err);
            return;
        }
        let remoteVersion = data.version;
        if (remoteVersion > cc.sys.localStorage.getItem("version")) {
            // 需要更新
        } else {
            // 不需要更新
        }
    });
    
  4. 解压更新包

    下载完成后,需要将更新包解压到指定的目录下。可以使用 jsb.fileUtils.unzip 方法来解压更新包。

    let zipFilePath = `${jsb.fileUtils.getWritablePath()}update.zip`;
    jsb.fileUtils.writeDataToFile(data, zipFilePath);
    jsb.fileUtils.unzip(zipFilePath, `${jsb.fileUtils.getWritablePath()}update`, (err) => {
        if (err) {
            cc.error(err.message || err);
            return;
        }
        // 解压完成
    });
    
  5. 加载更新后的资源和代码

    更新完成后,需要重新加载游戏资源和代码。在 Cocos Creator 中,可以使用 cc.loader.loadResDir 方法来加载更新后的资源,使用 require 方法来加载更新后的代码。

    cc.loader.loadResDir("update/res", (err, assets) => {
        if (err) {
            cc.error(err.message || err);
            return;
        }
        // 加载完成
    });
    require("update/src/main");
    
  6. 重启游戏

    更新完成后,需要重启游戏,以便重新加载游戏资源和代码。可以使用 cc.game.restart 方法来重启游戏。

    cc.game.restart();
    

3、结语

以上介绍的是目前一种可能的热更新方案,Cocos Creator 在未来版本中提供更成熟的热更新方案,直接集成到编辑器中。当然,也会提供底层 Downloader API 来允许用户自由实现自己的热更新方案,并通过插件机制在编辑器中搭建完整可视化的工作流。

热更新具体操作步骤可以参考以下文章(未测试):Cocos Creator 3.x之热更新详解_Better_Power_Wisdom的技术博客_51CTO博客

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

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

相关文章

同声传译用什么软件?亲测好用的同传翻译器分享

巴黎奥运会的到来,让全球的目光再次聚焦于这座浪漫之都。作为国际盛事,语言沟通无疑成为连接各国运动员、观众与媒体的桥梁。 面对多语言环境的挑战,一款高效、准确的同声传译软件显得尤为重要。它不仅能即时传递赛场激情,还能让…

加密软件有什么功能

加密软件是一种用于保护数据安全的工具,它通过对数据进行加密处理,使得未经授权的用户无法访问或篡改这些数据。加密软件使用各种加密算法,如对称加密、非对称加密等,确保数据在传输和存储过程中的安全性。 一、加密软件的功能 数…

【leetcode】相同的树、另一棵树的子树、翻转二叉树(利用深度优先遍历)

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:数据结构、LeetCode专栏 📚本系…

【mars3d】LayerType 的arcgis_feature类型的图层配置聚合属性,达到聚合效果

相关api文档: Global - V3.7.23 - Mars3D API文档 Global - V3.7.23 - Mars3D API文档 ArcGisWfsLayer - V3.7.23 - Mars3D API文档 实现代码: export function onMounted(mapInstance) {map mapInstance // 记录首次创建的map// 添加参考三维模型co…

html+css+js网页设计原神8个页面带js

htmlcssjs网页设计原神8个页面带js 有轮播图,一键置顶等多种效果 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操…

​​​​​​​ 《大学新生编程入门指南:从新手到大神的蜕变之路》

编程小白如何成为大神?大学新生的最佳入门攻略 编程已成为当代大学生的必备技能,但面对众多编程语言和学习资源,新生们常常感到迷茫。如何选择适合自己的编程语言?如何制定有效的学习计划?如何避免常见的学习陷阱&…

PD暗电流的测试小技巧

随着新基建概念的提出,5G和数据中心的建设在2020年进入快车道,海量的光模块需求引领着行业的更新换代,对光器件提出了更高的要求。在光通信测试领域,也将迎来很多挑战。 共同面对未来挑战,泰克将推出一系列关于光通信…

计算机网络复习总结

第一章 计算机网络体系结构 1、计算机网络的概念组成和功能 (1)什么是计算机网络? 计算机网络是将一个分散的、具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。…

网页离线缓存 Service Worke

随着 Web 技术的飞速发展,用户对网站的要求越来越高,为了达到用户期望,开发者使出了浑身解数来做性能优化,包括 CDN 内容分发、图片合并、资源文件压缩、异步加载等等手段,这些手段绝大部分都是在干一件事情&#xff0…

真人拍摄,还是技术生成?会走路的数字人物到底是谁?

近日,一段数字人视频引发了全网热议,画面中,一个外观与真人无异的女子在说话的同时缓缓走动。这也让不少网友质疑,视频中所出现的会走路的数字人物并非是由技术生成,而是真人拍摄。“数字人不都是固定不动的吗&#xf…

【Linux学习】文件系统 - 揭秘磁盘存储结构与存储原理

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 🍑磁盘文件管理🚀磁盘的机械构成🌌磁盘的物理存储🍑存储原理📕磁盘的逻辑…

XML 发票解析

文章目录 1. xml 类型发票格式2. 数据提取思路2.1 项目结构 3. 提取实现3.1 实体类3.2 提取工具类3.3 controller3.4 service 4. 结果展示 1. xml 类型发票格式 本文解析的xml类型的发票格式如下 2. 数据提取思路 通过遍历xml文件中的标签去获得标签对应的文本 2.1 项目结…

MySQL的简单介绍

文章目录 数据库关系型数据库非关系型数据”数据库的概念和用途MySQL数据库服务器、数据库和表的关系数据库的创建和删除表创建表修改常见的数据类型和约束字符串类型日期和时间类型PRIMARY KEY使用AUTO_INCREMENT使用UNIQUE使用FOREIGN KEY使用 SQL语言基础SQL语言简介SQL分类…

基于Spark的豆瓣书籍推荐系统的设计与实现-计算机毕业设计源码53447

摘要 本论文主要论述了如何基于Spark开发一个豆瓣书籍推荐系统,本系统将严格按照软件开发流程进行各个阶段的工作,面向对象编程思想进行项目开发。在引言中,作者将论述豆瓣书籍推荐系统的当前背景以及系统开发的目的,后续章节将严…

谷粒商城实战笔记-MySQL踩坑记录

文章目录 1, Public Key Retrieval is not allowed问题描述解决办法 2,1044 -Access denied for user root% to database解决方案 1, Public Key Retrieval is not allowed 问题描述 打开DBeaver连接MySQL提示“Public Key Retrieval is no…

大数据信用报告查询有什么作用?怎么选择查询平台?

随着互联网的快速发展,人们的金融行为越来越多地依赖于网络平台。然而,网络上的金融交易存在着一定的风险,为了有效地防范这些风险,金融机构采用了大数据技术进行风险控制,下面,小易大数据平台将详细介绍大…

20240807 每日AI必读资讯

👨‍💼马斯克再发难、OpenAI 高层巨变:两大核心人物离职,总裁休长假到年底 - OpenAI 联合创始人 John Schulman 官宣离职,加入原是竞品公司的 Anthropic - 陪伴 OpenAI 共同成长 9 年的总裁兼联合创始人 Greg Brockm…

《计算机组成原理》(第3版)第3章 系统总线 复习笔记

第3章 系统总线 一、总线的基本概念 总线是连接多个部件的信息传输线,是各部件共享的传输介质,如图3-1所示。 图3-1 面向CPU的双总线结构框图 倘若将CPU、主存和I/O设备都挂到一组总线上,便形成单总线结构的计算机,如图3-2所示…

【自动驾驶】ubuntu server安装桌面版

目录 安装桌面版当锁屏界面使用root用户登录错误时 这里环境一开始是ubuntu20.04服务器版本 安装桌面版 sudo apt-get update sudo apt-get upgrade apt-get install -y ubuntu-desktop # 如果你不想安装一些附加的程序,可用以下命令 sudo apt install --no-instal…

java创建多线程方式

文章目录 概要继承 Thread 类实现 Runnable 接口实现 Callable 接口线程池 概要 继承 Thread 类 public class Test extends Thread {Overridepublic void run() {System.out.println("current thread is:" Thread.currentThread().getName());}public static voi…