模块化热更思路

news2024/11/15 15:29:56

title: 模块化热更思路
categories: Others
tags: [热更, 模块化, 分包]
date: 2023-02-18 01:04:57
comments: false
mathjax: true
toc: true

模块化热更


浅浅的记录一下访问破 200w (But, I don’t care about this.)

image-20230218004545551


前篇

  • 只谈思路, 不贴实现代码.

需求

  • 游戏类型属于合集类, 也就是一个 大厅 + 多个小游戏模块, 每个小游戏模块之间互不关联. 如果不做模块化热更的话, 那么初始包的大小就会很大, 随着小游戏模块的数量增加而增加, 因此就可以考虑把每一小游戏模块分割出来, 在需要用的时候在去热更, 那么出来的初始包的大小就是只有一个大厅, 或者预置几个小游戏模块, 其他的小游戏模块运行时去更新下来, 这样包体就不会受小游戏模块的限制.

思路

游戏内的资源主要还是 贴图之类的 美术资源最占大头, 脚本资源 和 配置表 都只占很小很小, 所以只需要在美术资源这一块去着手处理即可.

打包

  1. 以前打 patch 的还是怎么打, 只需要最后在打包的时候, 把 patch 复制一份副本用来打包, 其中把 每个小游戏模块的 美术资源剔除掉, 只留下 大厅模块 美术资源, 剔除掉的模块的资源生成一个 db 记录表, 里面记录所有剔除掉的模块资源, 且每一个模块一个 db 记录, 如:

    image-20230217180029207

    每个 db (1001.db, 1002.db, 1003.db, …) 记录表记录的就是的剔除掉的, 也就是需要热更的资源, 如: 1003.db

    image-20230217180238302


资源引用关系

因为模块可能不存在, 所以大厅与模块之间的就必须遵循一些条件, 如图:

image-20230217181443278

  1. 大厅 (lobby) 只能引用 大厅 的资源, 不能引用模块的资源
  2. 模块 (mod01, mod02) 能引用 同模块 和 大厅 的资源, 不能引用其他模块的资源

引用关系的检测逻辑必须在 打包, 打 patch 逻辑之前走一遍, 确保没有问题.


运行时热更模块

假设最新的 db 记录文件是 1003.db, 那么可以用一个如 old_1003.db 的 db 记录去记录本地已有的旧资源

  1. 首先进入大厅前, 会先进行更新大厅, 此时会把模块资源的 1003.db 记录表下载下来, 覆盖掉旧的
  2. 然后进入模块 1003 前, 先去对比 1003.db 和 old_1003.db 的 md5 值是否一致
    1. 如果不一致, 说明此时需要去更新新的 1003 模块的资源, 把里面有 md5 差异的资源下载下来, 完成之后写入, 用 1003.db 覆盖到 old_1003.db, 完成模块的更新
    2. 如果一致, 这说明没有资源需要更新

优化

  1. 因为单文件的更新速度大部分情况下都会快于散文件的批量更新.

    在首次热更模块时, 可以把模块资源都打包为一个 zip 文件, 下载下来再本地解压, 里面包含的就是 old_1003.db 资源记录表 和 需要热更的文件.


踩坑

  1. 在 Android 平台, 包内文件如果不存在, 去拷贝这个不存在的文件到持久化路径下, 会成功拷贝, 但是会是个空文件, 所以读取文件要进行判空处理 (被坑了 几十分钟).

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

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

相关文章

Linux(十三)设计模式——单例模式

设计模式——针对典型场景所设计出来的特别的处理方案 单例模式:一个类只能实例化一个对象(所以叫单例) 场景: 1、资源角度:资源在内存中只占有一份 2、数据角度:如果只有一个对象,那么该对象在…

2019蓝桥杯真题质数(填空题) C语言/C++

题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 我们知道第一个质数是 2、第二个质数是 3、第三个质数是 5…… 请你计算第 2019 个质数是多少? 运行限制 最大运行时间:1s 最大运行内存: 128M…

Mac下安装Tomcat以及IDEA中的配置

安装brew 打开终端输入以下命令: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 搜索tomcat版本,输入以下命令: brew search tomcat 安装自己想要的版本,例…

JDK版本区别

1. 泛型 ArrayList listnew ArrayList()------>ArrayList<Integer>listnew ArrayList<Integer>(); 2 自动装箱/拆箱 nt ilist.get(0).parseInt();-------->int ilist.get(0);原始类型与对应的包装类不用显式转换 3 for-each i0;i<a.length;i------------&…

解析从Linux零拷贝深入了解Linux-I/O(上)

本文将从文件传输场景以及零拷贝技术深究 Linux I/O 的发展过程、优化手段以及实际应用。前言 存储器是计算机的核心部件之一&#xff0c;在完全理想的状态下&#xff0c;存储器应该要同时具备以下三种特性&#xff1a; 速度足够快&#xff1a;存储器的存取速度应当快于 CPU …

JWT安全漏洞以及常见攻击方式

前言 随着web应用的日渐复杂化&#xff0c;某些场景下&#xff0c;仅使用Cookie、Session等常见的身份鉴别方式无法满足业务的需要&#xff0c;JWT也就应运而生&#xff0c;JWT可以有效的解决分布式场景下的身份鉴别问题&#xff0c;并且会规避掉一些安全问题&#xff0c;如CO…

python+vue微信小程序的线上服装店系统

服装行业是一个传统的行业。根据当前发展现状,网络信息时代的全面普及,服装行业也在发生着变化,单就服饰这一方面,利用手机购物正在逐步进入人们的生活。传统的购物方式,不仅会耗费大量的人力、时间,有时候还会出错。小程序系统伴随智能手机为我们提供了新的方向。手机线上服装…

JavaEE|套接字编程之UDP数据报

文章目录一、DatagramSocket API构造方法常用方法二、DatagramPacket API构造方法常用方法E1:回显服务器的实现E2:带有业务逻辑的请求发送一、DatagramSocket API 在操作系统中&#xff0c;把socket对象当成了一个文件处理。等价于是文件描述符表上的一项。 普通的文件&#xf…

vbs简单语法及简单案例

文章目录一、简单语法1、变量2、输入3、输出4、选择语句5、循环二、用记事本编译中文乱码问题三、制作一个简单vbs脚本表白一、简单语法 1、变量 语法&#xff1a; dim 变量名例&#xff1a; dim a,b a1 b2 msgbox ab运行&#xff1a; 2、输入 语法&#xff1a;InputBox(…

【ip neigh】管理IP邻居( 添加ARP\NDP静态记录、删除记录、查看记录)

一、邻居管理存在状态 1、NUD_NONE&#xff1a; 初始状态。当一个新的路由缓存条目被创建时&#xff0c;arp_bind_neighbour()函数被调用.如果找不到相匹配的ARP缓存条目, neigh_alloc()将创建一个新的ARP缓存条目并设置状态为NUD_NONE. 2、NUD_INCOMPLETE&#xff1a;未完成状…

设计模式之适配器模式与桥接模式详解和应用

目录1 适配器模式1.1 定义1.2 应用场景1.3 适配器角色1.4 类适配器1.5 对象适配器1.5 接口适配器1.6 实战1.7 源码1.8 适配器与装饰器的对比1.9 适配器模式的优缺点1.10 总结2 桥接模式2.1 原理解析2.2 角色2.3 通用写法2.4 应用场景2.5 业务场景中的运用2.6 源码2.7 桥接模式优…

指针笔记(指针数组和指向数组的指针,数组中a和a的区别等)

指针数组和指向数组的指针 int *p[4]和int (*p)[4]有何区别&#xff1f; 前者是一个指针数组&#xff0c;数组大小为4&#xff0c;每一个元素都是一个指向int的指针 后者是指向int[4]类型数组的指针 以上代码若运行会报如下错误 main函数中定义的a数组本质是一个指向int[2]的…

内网渗透(三十八)之横向移动篇-pass the key 密钥传递攻击(PTK)横向攻击

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

从0到1一步一步玩转openEuler--18 openEuler 管理服务-简介

文章目录18 管理服务简介18.1 概念介绍18 管理服务简介 systemd是在Linux下&#xff0c;与SysV和LSB初始化脚本兼容的系统和服务管理器。systemd使用socket和D-Bus来开启服务&#xff0c;提供基于守护进程的按需启动策略&#xff0c;支持快照和系统状态恢复&#xff0c;维护挂…

java基础学习 day41(继承中成员变量和成员方法的访问特点,方法的重写)

继承中&#xff0c;成员变量的访问特点 a. name前什么都不加&#xff0c;name变量的访问采用就近原则&#xff0c;先在局部变量中查找&#xff0c;若没找到&#xff0c;继续在本类的成员变量中查找&#xff0c;若没找到&#xff0c;继续在直接父类的成员变量中查找&#xff0c…

Mel Frequency Cepstral Coefficients (MFCCs)

wiki里说 在声音处理中&#xff0c;梅尔频率倒谱( MFC ) 是声音的短期功率谱的表示&#xff0c;基于非线性梅尔频率标度上的对数功率谱的线性余弦变换。 倒谱和MFC 之间的区别在于&#xff0c;在 MFC 中&#xff0c;频带在梅尔尺度上等距分布&#xff0c;这比正常频谱中使用的线…

Windows10 安装ElasticStack8.6.1

一、安装ElasticSearch8.6.1 1.官网下载ElasticSearch8.6.1压缩包后解压 2.安装为服务 elasticsearch-service.bat install 3.运行 elasticsearch-service.bat start 4.通过浏览器访问 http://localhost:9200/ 提示需要登录&#xff0c;但不知密码是啥。 5.重置密码 ela…

操作系统(day12)-- 基本分段存储,段页式存储

基本分段存储管理方式 不会产生内部碎片&#xff0c;会产生外部碎片 分段 按照程序自身的逻辑关系划分为 若干个段&#xff0c;每个段都有一个段名&#xff0c;每段从0开始编址 分段存储管理方式中一个段表项由段号&#xff08;隐含&#xff09;、段长、基地址 分段的段表项固…

Python基础2

1. python函数定义 函数定义语法&#xff1a; def 函数名&#xff08;传入参数&#xff09;&#xff1a; 函数体 return 返回值 —————————————— 参数如果不需要&#xff0c;可以省略返回值如果不需要&#xff0c;可以省略函数必须先定义在使用 注意&#xff…

UIE微调:autoML平台实践(一)

参考&#xff1a;uie模型微调个人总结 github&#xff1a;https://github.com/PaddlePaddle/PaddleNLP/tree/develop/model_zoo/uie 1、显存问题 之前是在实验室的服务器上跑&#xff08;2080ti&#xff0c;12G显存&#xff09;&#xff0c;频频出现以下报错&#xff1a; 原…