当前位置: 首页 > news >正文

Unity——热更新浅析

热更新的思想从本质上来讲,要考虑一些问题。例如,一个完整的游戏最多可以有多大比例的资源通过网络加载?能否让尽可能多的资源通过网络加载?

通过网络加载有很多好处,不仅可以极大减小安装包的体积,而且有助于游戏的推广传播。更重要的是,以后游戏更新都不需要重新安装,只要有网络,打开游戏后自动加载新版本的资源就可以了。

那么哪些资源需要通过网络加载呢?首先,理论上几乎全部资源都可以通过网络加载;其次,Unity脚本本身不支持动态加载。针对这两点,前辈们想出了各种解决方案。

1.过渡场景

最容易想到的是,要想减小安装包体积,,应该在游戏中做一个最简单、最基本的过渡场景。过度场景本身需要的素材非常少(如只有一个加载进度条),其作用也只有一个——联网下载所有必要的资源包,等下载完成后再切换场景,正式启动游戏。如果采用这种设计,游戏的安装包只需要包含Unity引擎本身的资源、加载程序的资源和过渡场景的资源就足够了,从而安装包的容量可以做到非常小。

2.脚本的动态加载

举例理解脚本的动态加载

当涉及到脚本动态加载时,一个常见的比方是插件系统。

想象你正在开发一个图像编辑应用程序,用户可以选择不同的特效来编辑图片。而这些特效(或者称之为插件)可以以脚本的形式存在,并且可以在应用程序运行时动态加载和使用,而不需要在编译时将它们直接包含在应用程序中。

在这个比方中,应用程序就好比一个宿主系统,而特效脚本就是插件。通过脚本动态加载,你的应用程序可以根据用户的选择或动态配置在运行时加载特定的特效脚本,并将它们与图像进行交互以实现不同的编辑效果。

这种动态加载的插件系统允许你无需重新编译整个应用程序,就能够灵活地添加、删除或更新特效功能。用户可以根据需求自定义和扩展应用的功能,而不需要修改应用程序本身。

脚本资源最好也能通过网络加载更新。如果脚本不能更新,就只能更新美术资源和数据文件,而绝大部分游戏逻辑都无法改动,旧版本中的程序bug也无法修复。

脚本动态加载设计动态编译和执行的问题,属于很深入的技术问题。现代脚本动态加载的思路分为以下两大类。

第一类思路

将脚本编译成为动态链接库(DLL),然后把DLL当作资源打入资产包。使用脚本时,利用C#的反射机制,让DLL中的程序动态执行。

这种思路的优点是不需要改变原本的脚本编辑方法,仅仅在打包和加载时需要做一些额外的处理。也就是说,对开发者几乎不会带来额外的负担。但它也有着致命的缺点,在iOS平台上,出于安全考虑,不允许利用反射加载网络代码,因此这种做法在iOS等安全性要求较高的操作系统中无法使用。

使用反射加载网络代码可能存在安全风险,主要有以下几个原因:

1. 安全漏洞:通过网络加载的代码可能包含恶意代码或存在安全漏洞。这些代码可能会执行未经授权的操作,访问敏感信息,破坏系统稳定性,甚至攻击其他计算机或网络资源。

2. 无验证:反射提供了动态加载类型的能力,但它并没有内置的验证机制来验证这些类型的来源和完整性。因此,如果不仔细核实加载的代码的来源和内容,可能会导致不受信任的代码被加载和执行。

3. 代码注入:通过反射加载的代码可能会以注入的方式执行,这意味着它们与应用程序的其他部分的关系可能不明确或不可预测。这种情况下,代码可能会以无控制的方式访问和修改应用程序的内部状态,导致安全问题和不稳定性。

4. 权限提升:加载的代码可能尝试在执行时提升权限,获取系统管理员权限或执行特权操作,这可能会导致安全漏洞和未授权的访问。

 第二类思路

换一种全新的脚本框架,甚至可以换一种脚本开发语言。现在流行的热更新框架中,采用Lua作为开发语言比较常见。另外,也有采用C#语言的热更新框架,好处是不需要学习和使用另一种新的编程语言。

这种思路是在运行的环境中创建一个新的虚拟机,由虚拟机负责热更新脚本的运行。由于这些脚本只能调用有限的程序接口,而不会拥有过多权限,因此是相对安全的。

3.版本资源列表

在热更新技术中,有一个技术值得学习——版本资源列表。

需要版本资源列表的原因是,每次版本更新都需要对本地资源和远程服务器的资源进行版本对比。而且,如果用户的本地资源有一部分是新的,一部分是旧的,也需要某种机制保证快速、准确地更新旧的资源。

版本更新首先要以版本号作为基础。客户端有一个版本号,如1.0版,如果发现服务器端版本号是1.1版,则客户端就要下载1.1版的资源到本地。最简单的思路是,在服务器上存放一个从1.0到1.1版有变化的文件列表,客户根据该列表逐个更新资源即可,更新完成后版本号变为1.1。

这种思路可以达到效果,但不够灵活。更好的思路如下:

  1. 服务器端的每一个资源文件都计算一次MD5码,并将结果保存在资源列表里。
  2. 本地的每一个文件也要计算一次MD5码,为避免重复计算,可以计算一次后就保存在本地的列表文件中。
  3. 升级版本是,对比服务器端每个文件的MD5码和本地文件的MD5码,只下载MD5码不一致的文件
  4. 下载完成后可以重新计算MD5码,这样可以顺便检验在下载过程中数据传输是否出错
  5. 确保资源一致以后可以修改本地版本号,避免重复检查

 MD5码

MD5码是一种数据加密算法,它会便历文件中的所有数据,并将所有的数据以一种特殊算法合并,形成一个128比特(16)字节的数字。

相同数据计算出的MD5码也相同,如果文件中有任何一个比特变化,则生成的MD5码都会完全不同。现实中随意修改一个文件,但MD5码不变的概率接近0.这里借用的正式MD5码的这一性质。

虽然MD5码是一种加密算法,但其碰撞算法现已被破解,因此不再作为加密算法使用。但由于其具有算法简单、计算快的优点,因此作为文件一致性比较算法非常合适。


本文从思路上讲解了热更新这一技术产生的原因及其设计思想,可以看出热更新是以动态资源管理技术为基础的,也包括其他编程技术。热更新技术包含很多细节,因此市面上出现了多种功能齐全的热更新框架。

这些框架主要有以下功能:

  1. 提供执行热更新代码的虚拟机环境
  2. 把引擎提供的类型、方法和属性导出,让开发者可以在热更新代码中访问引擎功能
  3. 将开发者编写的Unity脚本接口导出,让热更新代码可以调用C#中的类型、方法和属性
  4. 提供一些方法,让Unity脚本可以使用热更新代码中的类型、函数和属性,大同两套代码之间的桥梁

一般来说,由于运行原理不同,动态加载的代码的执行效率会低于原生脚本。如果确实发现因动态脚本代码发生性能热点,可以将运算压力较大的部分用原生脚本编写,并封装成函数,然后让动态加载的代码调用该函数

相关文章:

Unity——热更新浅析

热更新的思想从本质上来讲,要考虑一些问题。例如,一个完整的游戏最多可以有多大比例的资源通过网络加载?能否让尽可能多的资源通过网络加载? 通过网络加载有很多好处,不仅可以极大减小安装包的体积,而且有…...

IMPLEMENT_DYNCREATE的分析

一、介绍 IMPLEMENT_DYNCREATE 是一个宏(macro),通常与DECLARE_DYNCREATE宏一起在MFC框架中使用。它的作用是为一个派生自 CObject 的MFC类提供运行时类型信息(RTTI)和对象的动态创建支持。 具体来说,IMP…...

Java实现根据短连接获取1688商品详情数据,1688淘口令接口,1688API接口封装方法

要通过1688的API获取商品详情数据,您可以使用1688开放平台提供的接口来实现。以下是一种使用Java编程语言实现的示例,展示如何通过1688开放平台API获取商品详情属性数据接口: 首先,确保您已注册成为1688开放平台的开发者&#xf…...

ABAP FICO 凭证替代 凭证校验

凭证校验 1.T-CODE--->GGX2--->GBLR-->ZRGGBR000 2.将程序RGGBR000 复制为ZRGGBR000 3.GGB0--》财务会计--》凭证抬头或者行项目维护检验规则 4.OB28 维护特定的公司代码和调用点和确认,活动等级设置为1 5.GGB4-->激活校验 凭证替代 1.T-CODE--->GG…...

项目验收有哪些流程?

验收流程 科技计划项目验收/课题验收测试服务的被测对象是国家重大专项、科研课题的软件成果物,可以是一个模块、软件或系统等,也可以是软件套件或软件原型等。测试范围主要来源于课题的合同书/可行吧报告/申报书中的技术指标要求。所出具的科技项目验收…...

C++,类的继承

一、继承的基本概念 继承使得C能够从已有的类派生出新的类,而派生类继承了原有类的特征,包括方法。被继承者称为父类或基类,继承者称为子类或派生类。 继承的目的: 实现代码的重用性建立父类和子类之间的联系在实现多态的时候&a…...

作业33333333

一、正向解析 在开启DNS服务之前先将防火墙关闭。 systemctl stop firewalld.service 开启DNS服务,需要开启端先进行安装主软件,以及配置包管理软件 配置包管理软件一般会跟随主软件一起安装,如果没有手动安装一次就可以了。 安装完成之后&…...

Spring Cloud--从零开始搭建微服务基础环境【二】

😀前言 本篇博文是关于Spring Cloud–从零开始搭建微服务基础环境【二】,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,…...

算法工程题(中序遍历)

* 题意说明: * 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 * * 示例 1: * 输入:root [1,null,2,3] * 输出:[1,3,2] * * 示例 2: * 输入:root [] * 输出:[] * *…...

jsch网页版ssh

使用依赖 implementation com.jcraft:jsch:0.1.55Server端代码 import com.jcraft.jsch.Channel; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import java.io.InputStream; import java.io.OutputStream; import java.util.concurrent.TimeUnit; import o…...

教程i.MX8MPlus开发板SPI转CAN操作

飞凌嵌入式OKMX8MP-C核心板有两路原生CAN总线,但用户在开发产品时可能需要用到更多的CAN,这该如何解决呢?今天小编将为大家介绍一种SPI转CAN的方法,供各位工程师小伙伴参考。 说明 OKMX8MP-C核心板有两路原生的SPI总线&#xff0c…...

Docker中容器的随机命名方式

使用 docker 创建容器时,如果没有用 --name 指定,docker 会为用户选择一个名称, 格式是两个带有下划线的单词,如xxx_yyyy 其相关的实现在此处 pkg/namesgenerator/names-generator.go[1] 源码中有两个数组,第一个是一个…...

大数据Flink实时计算技术

1、架构 2、应用场景 Flink 功能强大,支持开发和运行多种不同种类的应用程序。它的主要特性包括:批流一体化、精密的状态管理、事件时间支持以及精确一次的状态一致性保障等。在启用高可用选项的情况下,它不存在单点失效问题。事实证明&#…...

数学中的自由与我们的生活

数学中的这些自由可以帮助我们养成很多优秀的品格。具体来说,知识的自由使我们变得足智多谋,让我们可以根据问题的具体情况选择恰当的工具和方法。探索的自由使我们在集体讨论时敢于大声发言,积极提问,让我们在为探索发现而欢呼雀…...

8 python的迭代器和生成器

概述 在上一节,我们介绍了Python的模块和包,包括:什么是模块、导入模块、自定义模块、__name__、什么是包、创建包、导入包等内容。在这一节中,我们将介绍Python的迭代器和生成器。在Python中,迭代器是一个非常重要的概…...

Git的基本使用笔记——狂神说

版本控制 版本迭代, 版本控制( Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。 实现跨区域多人协同开发 追踪和记载一个或者多个文件的…...

【小程序】外部二维码扫码打开微信小程序并跳转到指定页面

外部二维码扫码打开微信小程序并跳转到指定页面 您需要使用微信提供的跳转链接和相关参数。以下是实现的步骤: 生成跳转链接:使用以下链接格式生成跳转链接,其中APPID是您的小程序的 AppID,PATH是您要跳转的页面路径&#xff0c…...

bazel安装

安装 首先安装一下 Bazel 环境。参考 https://bazel.build/install。我是在 Ubuntu 上实验的,所以安装过程参考的是:https://bazel.build/install/ubuntu,有很多种安装方法,我选择的是使用二进制安装程序。这个具体参考的又是 ht…...

Typescript的class语法[类]的操作和应用

TypeScript 是一种面向对象的编程语言,它扩展了 JavaScript,为其添加了类型系统和其他一些特性。TypeScript 的 class 语法可以让开发者更加方便地使用面向对象的编程方式。本文将详细介绍 TypeScript 的 class 语法的操作和应用,并提供代码案…...

OPENCV实现暴力特征匹配

# -*- coding:utf-8 -*- """ 作者:794919561 日期:2023/9/1 """ import cv2 import numpy as np# 读...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 ​ 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

在rocky linux 9.5上在线安装 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...