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

【unity进阶篇】unity如何实现跨平台及unity最优最小包体打包方式(.NET、Mono和IL2CPP知识介绍)

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇

  • 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的同学入门。
  • 【unity通用篇】:主要讲解unity的基础通用的知识,包括unity界面、unity脚本、unity资源管理、unity动画、unity摄像机等,适合unity初学者入门。
  • 【unity3D篇】:主要讲解unity3D的知识,unity3D角色、unity3D物理系统、unity3D光照等,适合只想做2D游戏的开发者学习。
  • 【unity2D篇】unity2D篇:主要讲解unity2D的知识,包括unity2D角色、unity2D物理系统、unity2D光照等,适合只想做3D游戏的开发者学习。

这样方便大家按需选择性的去学习,比如有编程基础的大概率可以直接从unity通用篇开始入门,没有编程基础的建议从C#篇开始学习。只想做2D游戏的话,可以直接从unity2D篇开始学习,3D篇大概率就不需要看了,节约学习时间成本。

文章目录

  • 一、unity如何实现跨平台
    • 1、什么是 .NET
    • 2、.NET 的跨语言特性
    • 3、.NET 的跨平台特性
    • 4、Unity 和 .NET 的关系
    • 5、IL2CPP 的优势与挑战
    • 6、IL2CPP和Mono性能对比
    • 7、总结
  • 二、设置IL2CPP
    • 1、修改打包配置
    • 2、安装IL2CPP模块
  • 三、IL2CPP打包时的类型裁剪问题
    • 如何解决?
      • 1、调整剥离级别
      • 2、使用Link.xml文件
      • 3、最佳实战
  • 四、IL2CPP打包时的泛型问题
    • 1、解决方案
    • 2、泛型类:
    • 3、泛型方法:
  • 总结
  • 专栏推荐
  • 完结

一、unity如何实现跨平台

1、什么是 .NET

.NET 是微软推出的一整套技术体系,它不是一个编程语言也不是一个框架,而是用来开发应用程序的技术平台。你可以把它想象成一个大工具箱,里面有许多不同的工具(如编程语言、库和工具),帮助开发者创建各种类型的应用程序。这个平台支持多种编程语言(如 C#、VB.NET 等),并且可以让这些语言之间相互协作。

2、.NET 的跨语言特性

为了让不同语言编写的代码能够一起工作,.NET 定义了一组规则,确保所有语言都能遵循这些规则来编写代码。这就好比是制定一套交通规则,让所有的车辆在路上安全行驶。在 .NET 中,有以下几个关键概念:

  • CLS (Common Language Specification):公共语言规范,是一组语言互操作性的标准,保证不同语言的代码可以互相调用。
  • CTS (Common Type System):公共类型系统,定义了所有语言必须遵守的数据类型和结构,使得不同语言中的数据可以相互通信。
  • CLI (Common Language Infrastructure):公共语言基础结构,包含了 CTS 和其他必要的组件,是一个工业标准,确保 .NET 应用可以在任何实现了 CLI 的平台上运行。

3、.NET 的跨平台特性

早期的 .NET 主要是为了 Windows 操作系统设计的(即 .NET Framework)。后来为了实现跨平台,微软推出了 .NET Core,这是一个完全开源且能够在多个操作系统上运行的新版本。此外,还有一个叫做 Mono 的项目,在 .NET Core 出现之前就已经实现了跨平台的功能。Mono 是由第三方公司 Xamarin 开发的,后来被微软收购了。

  • .NET Framework:主要用于 Windows 上的应用开发。
  • .NET Core:用于跨平台应用开发,支持 Windows、macOS 和 Linux。
  • Mono:提供了一个额外的选择,允许 .NET 应用在更多类型的设备上运行,包括游戏主机等。

4、Unity 和 .NET 的关系

Unity 使用了 .NET 技术栈作为其脚本后端。具体来说,Unity 的底层是由 C++ 编写的引擎核心,而上层逻辑则主要通过 C# 来编写。为了使 C# 代码能够在不同的平台上运行,Unity 使用了 Mono 或者后来引入的 IL2CPP 技术。这两种技术都是基于 .NET 的公共语言基础结构 (CLI) 来工作的。

  • Mono:这是 Unity 最初采用的方式,它将 C# 代码编译为中间语言 (IL),然后在目标平台上使用虚拟机 (VM) 将其转换为本地机器码执行。
  • IL2CPP:这是一种较新的方法,它会将 C# 代码先编译为 C++ 代码,再由 C++ 编译器生成针对特定平台优化后的二进制文件。这种方法通常能带来更好的性能,并且更容易集成到不同的操作系统中。

5、IL2CPP 的优势与挑战

IL2CPP 提供了一些显著的优点,比如更高的运行效率和更小的应用体积。然而,它也有一些局限性,例如无法像 Mono 那样动态生成代码,这意味着你必须提前确定所有要用到的类型。如果某些类型是在运行时才决定使用的(例如通过反射或泛型),那么你需要采取特别措施来确保它们不会被裁剪掉。

6、IL2CPP和Mono性能对比

IL2CPP的代码执行效率是高于Mono的。

主要原因:

  • Mono是JIT即时编译,IL2CPP是AOT提前编译。
  • AOT的优势是在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗。
  • 可以在程序运行初期就达到最高性能,可以显著的加快程序的启动。
  • 再加上IL2CPP的原生C++代码加持,整体而言IL2CPP的效率在Unity下是高于Mono的。

7、总结

对于新手来说,最重要的是理解 Unity 如何利用 .NET 技术来实现跨平台功能。无论是选择 Mono 还是 IL2CPP,都是为了让你的游戏可以在尽可能多的不同设备上顺利运行。随着 Unity 不断改进其构建流程和技术栈,IL2CPP 已经成为推荐的打包方式,因为它提供了更好的性能和更广泛的平台支持。

二、设置IL2CPP

1、修改打包配置

ProjectSetting->Player->OtherSetting->Configuration->Scripting Backend 把脚本后端设置成IL2CPP
在这里插入图片描述

2、安装IL2CPP模块

假如没有下载对应平台的IL2CPP包 BuildSetting会报错
要先安装对应的IL2CPP模块,比如我们安装windows的IL2CPP模块,安装完成后重启工程
在这里插入图片描述

三、IL2CPP打包时的类型裁剪问题

IL2CPP是Unity用来将C#代码转换为C++代码的技术,在打包时,它会对你项目中的代码进行“裁剪”,也就是去掉那些在代码中没有被用到的部分。这么做是为了减小游戏包的大小,提高运行效率。但有时候,一些你并没有直接调用的类型或者代码会被错误地删除,导致运行时出现找不到某个类型的错误,特别是在用到反射等动态调用时。

如何解决?

1、调整剥离级别

在Unity的设置中,有一个叫做“Managed Stripping Level”的选项,可以选择不同的级别,控制IL2CPP的裁剪程度:

  • Minimal(最小):这是最安全的选择。好像是unity6新增的选项,本来最低只有Low。默认选择这个。
  • Low(低):尽量避免删除重要代码,只有最不常用的代码会被删掉。
  • Medium(中):中等程度的裁剪,可能会删掉一些不常用的代码,但不会删掉核心代码。
  • High(高):最激进的裁剪,尽量删除所有未用代码,能有效减小包的大小,但需要小心可能会删掉你需要的代码。
    在这里插入图片描述

2、使用Link.xml文件

你可以通过在Unity项目中(或其任何子目录中)创建一个Link.xml文件,告诉Unity哪些类型不能被删掉,确保它们在打包时不会被裁剪掉。

link.xml语法规则

<?xml version="1.0" encoding="UTF-8"?><!--保存整个程序集--><assembly fullname="UnityEngine" preserve="all"/><!--没有“preserve”属性,也没有指定类型意味着保留所有--><assembly fullname="UnityEngine"/><!--完全限定程序集名称--><assembly fullname="Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"><type fullname="Assembly-CSharp.Foo" preserve="all"/></assembly><!--在程序集中保留类型和成员--><assembly fullname="Assembly-CSharp"><!--保留整个类型--><type fullname="MyGame.A" preserve="all"/><!--没有“保留”属性,也没有指定成员 意味着保留所有成员--><type fullname="MyGame.B"/><!--保留类型上的所有字段--><type fullname="MyGame.C" preserve="fields"/><!--保留类型上的所有方法--><type fullname="MyGame.D" preserve="methods"/><!--只保留类型--><type fullname="MyGame.E" preserve="nothing"/><!--仅保留类型的特定成员--><type fullname="MyGame.F"><!--类型和名称保留--><field signature="System.Int32 field1" /><!--按名称而不是签名保留字段--><field name="field2" /><!--方法--><method signature="System.Void Method1()" /><!--保留带有参数的方法--><method signature="System.Void Method2(System.Int32,System.String)" /><!--按名称保留方法--><method name="Method3" /><!--属性--><!--保留属性--><property signature="System.Int32 Property1" /><property signature="System.Int32 Property2" accessors="all" /><!--保留属性、其支持字段(如果存在)和getter方法--><property signature="System.Int32 Property3" accessors="get" /><!--保留属性、其支持字段(如果存在)和setter方法--><property signature="System.Int32 Property4" accessors="set" /><!--按名称保留属性--><property name="Property5" /><!--事件--><!--保存事件及其支持字段(如果存在),添加和删除方法--><event signature="System.EventHandler Event1" /><!--根据名字保留事件--><event name="Event2" /></type><!--泛型相关保留--><type fullname="MyGame.G`1"><!--保留带有泛型的字段--><field signature="System.Collections.Generic.List`1&lt;System.Int32&gt; field1" /><field signature="System.Collections.Generic.List`1&lt;T&gt; field2" /><!--保留带有泛型的方法--><method signature="System.Void Method1(System.Collections.Generic.List`1&lt;System.Int32&gt;)" /><!--保留带有泛型的事件--><event signature="System.EventHandler`1&lt;System.EventArgs&gt; Event1" /></type><!--如果使用类型,则保留该类型的所有字段。如果类型不是用过的话会被移除--><type fullname="MyGame.I" preserve="fields" required="0"/><!--如果使用某个类型,则保留该类型的所有方法。如果未使用该类型,则会将其删除--><type fullname="MyGame.J" preserve="methods" required="0"/><!--保留命名空间中的所有类型--><type fullname="MyGame.SomeNamespace*" /><!--保留名称中带有公共前缀的所有类型--><type fullname="Prefix*" /></assembly>
</linker>

用的最多应该就是下面这种,比如保留MyGame程序集下的A整个类型

<?xml version="1.0" encoding="UTF-8"?><!--在程序集中保留类型和成员-->
<assembly fullname="Assembly-CSharp"><!--保留整个类型--><type fullname="MyGame.A" preserve="all"/>
</assembly>

3、最佳实战

我们可以把代码剥离等级设置为,打包出去,出现报错时,再在裁剪类link.xml中添加保留对应报错类的代码。

但是这可能比较考验测试人员能力,假如没测出来有一定风险。

四、IL2CPP打包时的泛型问题

在IL2CPP中,由于它在编译时必须知道所有需要的类型和代码,如果你没有在打包前明确地使用某些泛型类型,它们可能会被裁剪掉,导致运行时找不到相关类型。例如,假设你有两个泛型列表:

  • List<A>List<B>,其中AB是你自定义的类。
    如果你在代码中没有显式地使用这些泛型(比如没有写出List<A>List<B>),那么在打包时,这些类型可能会被裁剪掉。如果你后续在热更新时想使用List<C>,但是之前并没有显示使用过它,程序就会出错。主要就是因为JIT和AOT两个编译模式的不同造成的。

1、解决方案

显示使用泛型类型:在代码中显式地声明并使用泛型类型,确保它们在编译时被处理。例如,可以在代码中声明一个包含List<A>List<B>的类,或者编写一个泛型方法,在其中使用这些类型。这样做的目的是告诉IL2CPP,你会在运行时使用这些泛型类型,避免它们被裁剪掉。

2、泛型类:

声明一个类,然后在这个类中声明一些public的泛型类变量

public class IL2CPP_Info
{public List<A> list;public List<B> list2;public List<C> list3;public Dictionary<int, string> dic = new Dictionary<int, string>();
}

3、泛型方法:

随便写一个静态方法,在将这个泛型方法在其中调用一下。这个静态方法无需被调用,这样做的目的其实就是在预编译之前让IL2CPP知道我们需要使用这个内容

public class IL2CPP_Info
{public void Test<T>(T info){}public static void StaticMethod(){IL2CPP_Info info = new IL2CPP_Info();info.Test<int>(1);info.Test<float>(1);info.Test<bool>(true);}
}

总结

  • 对于新项目,建议使用IL2CPP打包方式,因为它比Mono打包更高效,生成的包也会更小。
  • 如果你遇到类型找不到的问题,可以通过调整剥离级别或者使用Link.xml文件来确保所需的类型不会被裁剪掉。
  • 如果你使用了泛型,记得在代码中显式地调用这些泛型类型,以确保它们不会被错误地裁剪。

专栏推荐

地址
【零基础入门unity游戏开发——C#篇】
【零基础入门unity游戏开发——unity通用篇】
【零基础入门unity游戏开发——unity3D篇】
【零基础入门unity游戏开发——unity2D篇】
【制作100个Unity游戏】
【推荐100个unity插件】
【实现100个unity特效】
【unity框架/工具集开发】

完结

好了,我是向宇,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!
在这里插入图片描述

相关文章:

【unity进阶篇】unity如何实现跨平台及unity最优最小包体打包方式(.NET、Mono和IL2CPP知识介绍)

考虑到每个人基础可能不一样&#xff0c;且并不是所有人都有同时做2D、3D开发的需求&#xff0c;所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】&#xff1a;主要讲解C#的基础语法&#xff0c;包括变量、数据类型、运算符、…...

5-1 创建和打包AXI Interface IP

创建和打包AXI Interface IP的前流程和后流程 step 1 &#xff1a; 选择类型 1&#xff1a; 将当前的工程打包成IP 2&#xff1a; 将当前的BD工程打包成IP 3&#xff1a; 将指定的源码打包成IP 4&#xff1a; 创建一个新的AXI 接口IP 其中3和4是比较常用的&#xff0c;本次…...

【C++】如何从源代码编译红色警戒2地图编辑器

【C】如何从源代码编译红色警戒2地图编辑器 操作视频视频中的代码不需要下载三方库&#xff0c;已经包含三方库。 一、运行效果&#xff1a;二、源代码来源及编程语言&#xff1a;三、环境搭建&#xff1a;安装红警2安装VS2022下载代码&#xff0c;源代码其实不太多&#xff0c…...

HRNet,Deep High-Resolution Representation Learning for Visual Recognition解读

论文、代码和ppt地址&#xff1a;HRNet。代码地址: hrnet 本文通过paper解读和代码实例以及onnx模型的分析&#xff0c;来说明hrnet模型。 摘要——高分辨率表征对于诸如人体姿态估计、语义分割和目标检测等对位置敏感的视觉问题至关重要。现有的最先进框架首先通过一个子网&…...

Rust Actix Web 项目实战教程 mysql redis swagger:构建用户管理系统

Rust Actix Web 项目实战教程&#xff1a;构建用户管理系统 项目概述 本教程将指导你使用 Rust 和 Actix Web 构建一个完整的用户管理系统&#xff0c;包括数据库交互、Redis 缓存和 Swagger UI 文档。 技术栈 Rust 编程语言Actix Web 框架SQLx (MySQL 数据库)Redis 缓存Uto…...

# 爬楼梯问题:常见数列的解法总结

爬楼梯问题&#xff1a;常见数列的解法总结 在编程中&#xff0c;爬楼梯问题&#xff08;Climbing Stairs Problem&#xff09;是一个经典的动态规划问题&#xff0c;常常作为入门学习动态规划和递推的重要例题。这个问题看似简单&#xff0c;但背后包含了多种解决方式&#x…...

速通Docker === 常用命令

目录 Docker命令 镜像操作 容器操作 基础操作 启动参数 容器内部操作 打包成指定文件 发布镜像 总结 镜像操作 容器操作 启动容器参数 容器内部操作 打包镜像 启动指定镜像的容器 发布镜像 Docker命令 启动一个nginx,并将它的首页改为自己的页面&#xff0c;发布…...

AWS S3 跨账户访问 Cross Account Access

进入S3对应的存储桶&#xff0c;上面选项选权限&#xff0c;存储桶策略 -- 编辑&#xff0c;输入对应的policy。 完全控制&#xff0c;包含上传删除权限&#xff0c;policy如下&#xff1a; {"Version": "2012-10-17","Statement": [{"Si…...

C#中常见的锁以及用法--18

目录 一.C#中存在的锁 二.锁的作用 三.锁的概念和定义 关于锁的完整代码示例 代码逐层剖析: 全局变量与同步变量 Lock(锁)关键字示例 Monitor(监视器锁)示例 Mutex(互斥量)示例(支持跨进程同步) SemaphoreSlim(信号量)示例 ReadWriterLockSlim(读写锁)示例 SpinLock…...

【数据分享】1929-2024年全球站点的逐年平均气温数据(Shp\Excel\无需转发)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01;本次我们为大家带来的就是具体到气象监…...

Docker部署MySQL 5.7:持久化数据的实战技巧

在生产环境中使用Docker启动MySQL 5.7时&#xff0c;需要考虑数据持久化、配置文件管理、安全性等多个方面。以下是一个详细的步骤指南。 1. 准备工作 &#xff08;1&#xff09;创建挂载目录 在宿主机上创建用于挂载的目录&#xff0c;以便持久化数据和配置文件。 sudo mkdi…...

二叉树和堆

树概念及结构&#xff08;了解&#xff09; 树的概念&#xff08;看看就行&#xff09; 树是一种 非线性 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是…...

Zookeeper(15)Zookeeper的ZooKeeper API包含哪些主要操作?

Zookeeper 的 ZooKeeper API 提供了一系列操作来管理 Zookeeper 的数据节点&#xff08;znodes&#xff09;。这些操作主要包括创建节点、删除节点、读取节点数据、设置节点数据、列出子节点、检查节点是否存在&#xff0c;以及注册 Watcher 等。以下是这些操作的详细介绍和代码…...

深入浅出:Go语言os包中的API使用指南

深入浅出:Go语言os包中的API使用指南 引言 Go语言以其简洁、高效和强大的生态系统著称,是现代编程中不可或缺的一部分。其中,os包作为Go标准库的一部分,提供了丰富的API来与操作系统进行交互。本文将深入探讨os包中的核心功能,并通过实际案例帮助读者更好地理解和应用这些…...

【云岚到家】-day02-客户管理-认证授权

第二章 客户管理 1.认证模块 1.1 需求分析 1.基础概念 一般情况有用户交互的项目都有认证授权功能&#xff0c;首先我们要搞清楚两个概念&#xff1a;认证和授权 认证: 就是校验用户的身份是否合法&#xff0c;常见的认证方式有账号密码登录、手机验证码登录等 授权:则是该用…...

vben5 admin ant design vue如何使用时间范围组件RangePicker

本文参考&#xff1a;https://pusdn-dev.feishu.cn/wiki/VF4hwBAUliTE6TkUPKrcBNcZn9f?fromfrom_copylink 由PUSDN整理发行&#xff0c;收录时请保留PUSDN。 前端组件专题 年月日时间范围表单回显RangePicker 推荐使用多个字段存储&#xff0c;不推荐用英文逗号拼接时间&am…...

安全策略配置实验

安全策略配置实验 1.拓扑 2.需求 2、办公区PC在工作日时间(周一至周五&#xff0c;早8到晚6)可以正常访问OA srver&#xff0c;其他时间不允许 3、办公区PC可以在任意时刻访问web server 4、生产区PC可以在任意时刻访问OA Server&#xff0c;但是不能访问Web server 5、特…...

Win10安装WebODM和操作全流程

效果 以下是在 Windows 10 上安装和部署 WebODM 的详细教程: 一、安装 Docker Desktop for Windows 1、访问 Docker 官方网站:https://www.docker.com/products/docker-desktop 。 2、下载 Docker Desktop for Windows 的安装程序。 3、运行安装程序: 双击下载的安装程序,…...

wireshark抓路由器上的包 抓包路由器数据

文字目录 抓包流程概述设置抓包配置选项 设置信道设置无线数据包加密信息设置MAC地址过滤器 抓取联网过程 抓包流程概述 使用Omnipeek软件分析网络数据包的流程大概可以分为以下几个步骤&#xff1a; 扫描路由器信息&#xff0c;确定抓包信道&#xff1b;设置连接路由器的…...

第8章:Python TDD处理货币类代码重复问题

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

C#,入门教程(01)—— Visual Studio 2022 免费安装的详细图文与动画教程

通过本课程的学习&#xff0c;你可以掌握C#编程的重点&#xff0c;享受编程的乐趣。 在本课程之前&#xff0c;你无需具备任何C#的基础知识&#xff0c;只要能操作电脑即可。 不过&#xff0c;希望你的数学不是体育老师教的。好的程序是数理化的实现与模拟。没有较好的数学基础…...

Agent Laboratory: Using LLM Agents as Research Assistants 论文简介

加速机器学习研究的智能实验室——Agent Laboratory 1. 引言 随着人工智能技术的飞速发展&#xff0c;机器学习领域正以前所未有的速度推进科学发现和技术创新。然而&#xff0c;传统的科学研究模式往往受到时间、资源和专业知识限制&#xff0c;阻碍了研究者们探索新想法的能…...

cuda + cudnn安装

1.安装CUDA Toolkit 在设备管理器&#xff08;此电脑–右键–属性&#xff09;的显示适配器中可以查看自己的显卡型号&#xff0c;去下载对应的CUDA Toolkit 。或者输入以下命令查看Driver Version &#xff0c;cuda Version&#xff1a;12.2代表12.2版本以下兼容可以进行安装 …...

Next.js 实战 (八):使用 Lodash 打包构建产生的“坑”?

前言 最近一直在折腾 Nextjs15 &#xff0c;也在断断续续地写《Next.js15 实战系列》的文章&#xff0c;后来总感觉文章如果没有线上效果预览差点意思&#xff0c;所以就想着先把目前做的项目先部署上线&#xff0c;后续再慢慢添加新功能。 因为之前没有部署过 Nextjs15 工程…...

owasp SQL 注入-03 (原理)

1: 先看一下注入界面: 点submit 后&#xff0c;可以看到有语法报错&#xff0c;说明已经起作用了: 报如下的错误: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near at line 1 2:…...

wireshark工具简介

目录 1 wireshark介绍 2 wireshark抓包流程 2.1 选择网卡 2.2 停止抓包 2.3 保存数据 3 wireshark过滤器设置 3.1 显示过滤器的设置 3.2 抓包过滤器 4 wireshark的封包列表与封包详情 4.1 封包列表 4.2 封包详情 参考文献 1 wireshark介绍 wireshark是非常流行的网络…...

队列的基本用法

以下是关于 C 语言中队列的详细知识&#xff0c;包括队列的生成、相关函数使用以及其他重要概念&#xff1a; 一、队列的概念 队列是一种线性数据结构&#xff0c;它遵循先进先出&#xff08;First In First Out&#xff0c;FIFO&#xff09;的原则&#xff0c;就像日常生活中…...

OpenHarmony-7.IDL工具

IDL 工具 1.openharmony IDL工具 在OpenHarmony中&#xff0c;当应用/系统服务的客户端和服务端进行IPC&#xff08;Inter-Process Communication&#xff09;跨线程通信时&#xff0c;需要定义双方都认可的接口&#xff0c;以保障双方可以成功通信&#xff0c;OpenHarmony ID…...

封装Redis工具类

基于StringRedisTemplate封装一个缓存工具类,满足以下需求: 方法1:将任意Java对象序列化为json并存储在string类型的key中,并且可以设置TTL过期时间 方法2:将任意Java对象序列化为json并存储在string类型的key中,并且可以设置TTL过期时间,用于处理缓存击穿问题 方法3:根据指定的…...

将n变为一个可以被表示为2^{a}+2^{b}的正整数m

给出一个正整数n&#xff0c;需要将n变为一个可以被表示为的正整数m&#xff0c;其中a和b都是非负整数且a!b&#xff0c;你可以进行两种操作&#xff1a; 1.令n加1 2.令n减1 请你求出最少需要多少次操作才能将n变成满足条件的m。 输入格式 输入一个整数&#xff0c;代表n。…...

第2章:Python TDD构建Dollar类基础

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

搭建一个基于Spring Boot的校园台球厅人员与设备管理系统

搭建一个基于Spring Boot的校园台球厅人员与设备管理系统可以涵盖多个功能模块&#xff0c;例如用户管理、设备管理、预约管理、计费管理等。以下是一个简化的步骤指南&#xff0c;帮助你快速搭建一个基础的系统。 — 1. 项目初始化 使用 Spring Initializr 生成一个Spring …...

JavaScript系列(33)--微前端架构详解

JavaScript微前端架构详解 &#x1f3d7;️ 今天&#xff0c;让我们深入了解JavaScript的微前端架构&#xff0c;这是一种用于构建和管理大型前端应用的现代架构模式。 微前端基础概念 &#x1f31f; &#x1f4a1; 小知识&#xff1a;微前端是一种将前端应用分解成更小、更易…...

第6章:Python TDD实例变量私有化探索

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

Ubuntu 24.04 LTS 服务器折腾集

目录 Ubuntu 更改软件源Ubuntu 系统语言英文改中文windows 远程链接 Ubuntu 图形界面Windows 通过 openssh 连接 UbuntuUbuntu linux 文件权限Ubuntu 空闲硬盘挂载到 文件管理器的 other locationsUbuntu 开启 SMB 服务&#xff0c;并通过 windows 访问Ubuntu安装Tailscale&am…...

物联网在烟草行业的应用

物联网技术在烟草行业的应用 物联网技术在烟草行业的应用主要体现在以下几个方面&#xff1a; 智能制造 &#xff1a;物联网技术可以实现对生产过程中的关键参数进行实时监测&#xff0c;确保产品的质量稳定可靠。同时&#xff0c;通过对设备的远程维护和故障诊断&#xff0c;…...

2024年度总结:从后端Java到全栈成长的蜕变

目录 前言1. 用数据与实践书写成长篇章2. 技术与生活的双重蜕变3. 技术的进阶与生活的绽放 前言 今年是我入行的第十年&#xff0c;也是记录在CSDN平台上的第五年。这五年来&#xff0c;我始终坚持记录成长的点滴&#xff0c;将个人事业与博客创作紧密相连。一路走来&#xff0…...

详解构造函数和析构函数

⼀个类&#xff0c;我们不写的情况下编译器会默认⽣成以下6个默认成员函数。 下面我们详细介绍的是构造函数和析构函数&#xff0c;它们的主要作用分别是初始化工作和清理工作。 构造函数 1、构造函数的概念 构造函数虽名里带着“构造”但是其实际上并不是说开辟空间创建对…...

npm操作大全:从入门到精通

引言 在现代前端开发中&#xff0c;npm&#xff08;Node Package Manager&#xff09;是不可或缺的工具。无论是安装依赖、管理项目&#xff0c;还是发布自己的包&#xff0c;npm都扮演着重要的角色。本文将带你从npm的基础操作开始&#xff0c;逐步深入到高级用法&#xff0c…...

ChatGPT 写作系列

ChatGPT 辅助写作 | 专栏 1 写作核心​ 先讲一下 ChatGPT 写作的核心。核心就是需要有文章大纲&#xff0c;而且文章大纲要足够细致。​ 具体怎么做呢&#xff1f;​ 提前准备多级标题大纲&#xff0c;刚开始有两个级别的标题就行&#xff0c;等用熟练了再细化。分一级标题&…...

kubernetes 集群搭建(kubeadm方式)

随着容器技术的日益普及&#xff0c;Kubernetes 作为最受欢迎的容器编排平台之一&#xff0c;已经成为现代云原生应用部署不可或缺的一部分。对于想要快速构建和管理 Kubernetes 集群的人来说&#xff0c;kubeadm 提供了一种简单而强大的工具。本文将详细介绍如何使用 kubeadm …...

OpenWrt 中使用 LuCI 界面部署 Docker 镜像

本篇博客将介绍如何在 OpenWrt 上使用 LuCI 部署 Docker 镜像&#xff0c;以 "hello-world" 镜像为例。 前提条件 已安装支持 Docker 的 OpenWrt 系统。 Docker 服务已在 OpenWrt 上成功安装并运行。 LuCI Docker 插件&#xff08;luci-app-docker 或类似的管理界…...

阿里云 Serverless 助力盟主直播:高并发下的稳定性和成本优化

在直播场景中&#xff0c;阿里云 Serverless 应用引擎 SAE 提供的无缝弹性伸缩与极速部署能力&#xff0c;确保直播间高并发时的流畅体验&#xff0c;降低了我们的运营成本&#xff0c;简化了运维流程。结合阿里云云原生数据库 PolarDB 的 Serverless 能力&#xff0c;实现了数…...

C++ 多态 初学笔记

多态 虚函数虚函数的使用条件 虚函数详解对象多态多重继承时&#xff0c;类型转换的练习&#xff08;1&#xff09;情况1&#xff1a;&#xff08;2&#xff09;情况2&#xff1a;&#xff08;3&#xff09;情况3&#xff1a;&#xff08;4&#xff09;情况4&#xff1a; 对象多…...

深入剖析 Java 的 synchronized 锁升级过程

前言 在 Java 并发编程领域&#xff0c;synchronized关键字堪称保障线程安全的中流砥柱。随着 JDK 版本的迭代演进&#xff0c;synchronized锁的性能优化也在持续推进&#xff0c;其中锁升级机制尤为关键。本文将深度剖析synchronized锁从偏向锁、轻量级锁到重量级锁的升级历程…...

当文件补丁修改器因为文件操作权限有问题时,可以将文件拷贝到普通目录操作

文章目录 当文件补丁修改器因为文件操作权限有问题时&#xff0c;可以将文件拷贝到普通目录操作概述笔记直接在安装目录打补丁失败的情况将目标程序拷贝到补丁修改器的解压目录打补丁成功的情况备注END 当文件补丁修改器因为文件操作权限有问题时&#xff0c;可以将文件拷贝到普…...

【TCP】rfc文档

tcp协议相关rfc有哪些 TCP&#xff08;传输控制协议&#xff09;是一个复杂的协议&#xff0c;其设计和实现涉及多个RFC文档。以下是一些与TCP协议密切相关的RFC文档列表&#xff0c;按照时间顺序排列&#xff0c;涵盖了从基础定义到高级特性和优化的各个方面&#xff1a; 基…...

Linux探秘坊-------3.开发工具详解(1)

1 初识vim编辑器 创建第一个vim编辑的代码 1.新建文件 2.使用vim打开 3.打开默认是命令模式&#xff0c;写代码需要在屏幕上输出“i”字符 1.写完代码后要按Esc键退出到指令模式2.再按shift:wq即可保存并退出vim &#xff08;因为不支持鼠标&#xff0c;通常 使用键盘上的箭…...

如何在Python中进行JSON数据的序列化和反序列化?

在Python中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。Python内置的json模块提供了简单易用的方法来实现数据的序列化和反序列化。下面将详细介绍如何…...

SpringMVC (1)

目录 1. 什么是Spring Web MVC 1.1 MVC的定义 1.2 什么是Spring MVC 1.3 Spring Boot 1.3.1 创建一个Spring Boot项目 1.3.2 Spring Boot和Spring MVC之间的关系 2. 学习Spring MVC 2.1 SpringBoot 启动类 2.2 建立连接 1. 什么是Spring Web MVC 1.1 MVC的定义 MVC 是…...