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

那个网站做教学视频/郑州网站推广公司电话

那个网站做教学视频,郑州网站推广公司电话,正规网站建设公司哪家好,合肥网站制作前3名的热更新的思想从本质上来讲,要考虑一些问题。例如,一个完整的游戏最多可以有多大比例的资源通过网络加载?能否让尽可能多的资源通过网络加载? 通过网络加载有很多好处,不仅可以极大减小安装包的体积,而且有…

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

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

那么哪些资源需要通过网络加载呢?首先,理论上几乎全部资源都可以通过网络加载;其次,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# 读...

揭秘亚马逊Amazon测评,掌握细节和技巧,提升产品销量和评论数量

亚马逊是全球最大的跨境电商平台,拥有全球65个国家的几十个网站。对于跨境卖家来说,亚马逊是最值得选择的平台之一。 亚马逊的八大站点分别是美国、加拿大、墨西哥、欧洲、澳大利亚、日本、中东和巴西。 美国站点是全球最大的零售市场,拥有…...

Linux线程互斥

目录 一、线程不安全 1.线程不安全现象 2.线程不安全程序的特质 3.线程不安全程序的原因 二、线程互斥 1.基本概念 2.锁 (1)认识锁 (2)互斥锁的使用 (3)代码的改造 3.锁的本质 (1&a…...

【仿写spring之ioc篇】三、检查是否实现了Aware接口并且执行对应的方法

Aware接口 Aware接口中只是设置了对应的set方法,目前只定义了三个Aware 以BeanNameAware为例 package com.ez4sterben.spring.ioc.factory.aware;/*** bean名字清楚** author ez4sterben* date 2023/08/31*/ public interface BeanNameAware {/*** 设置beanName* …...

C++ 异常处理

C 异常​(Exception)是指在程序运行时产生的特殊情况,例如,尝试除以零的操作。异常提供了一种转移程序控制权的方式,异常处理涉及到三个关键字:try、catch、throw。 throw: 当问题出现时,程序会抛出一个异常。这是通过…...

OJ练习第157题——单词拆分

单词拆分 力扣链接:139. 单词拆分 题目描述 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例 …...

若依tab-content面板失效、使用load的解决方法(附详细步骤)

【版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任】【创作不易,点个赞就是对我最大的支持】 前言 仅作为学习笔记,供大家参考 总结的不错的话,记得点赞收藏关注哦! 思路&…...

2023年03月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:拼点游戏 C和S两位同学一起玩拼点游戏。有一堆白色卡牌和一堆蓝色卡牌,每张卡牌上写了一个整数点数。C随机抽取n张白色卡牌,S随机抽取n张蓝色卡牌,他们进行n回合拼点,每次两人各出一张卡牌,点数大者获…...

Android安卓实战项目(12)—关于身体分析,BMI计算,喝水提醒,食物卡路里计算APP【支持中英文切换】生活助手类APP(源码在文末)

Android安卓实战项目(12)—关于身体分析,BMI计算,喝水提醒,食物卡路里计算APP【支持中英文切换】生活助手类APP(源码在文末🐕🐕🐕) 一.项目运行介绍 B站演示…...

Hadoop 3.2.4 集群搭建详细图文教程

目录 一、集群简介 二、Hadoop 集群部署方式 三、集群安装 3.1 集群角色规划 3.2 服务器基础环境准备 3.2.1 环境初始化 3.2.2 ssh 免密登录(在 hadoop01 上执行) 3.2.3 各个节点上安装 JDK 1.8 环境 3.3 安装 Hadoop 3.4 Hadoop 安装包目…...

STL的学习之一

1)STL扫盲 1)C标准库和标准模板库是不一样的 2)标准模板库是用泛型编程方式编写的函数或者类库; 3) SGI STL linux一般用,P.J.Plauger STL,visual2017 windows用 STL六大组件 : 容器,迭代器 STL 算法(说白了就是函数…...