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

【Lua热更新】上篇

Lua 热更新 - 上篇

下篇链接:【Lua热更新】下篇

文章目录

  • `Lua` 热更新 - 上篇
    • 一、`AssetBundle`
      • 1.理论
      • 2. AB包资源加载
    • 二、`Lua` 语法
      • 1. 简单数据类型
      • 2.字符串操作
      • 3.运算符
      • 4.条件分支语句
      • 5.循环语句
      • 6.函数
      • 7. table数组
      • 8.迭代器遍历
      • 9.复杂数据类型 - 表
        • 9.1字典
        • 9.2类
        • 9.3 表的公共操作
      • 多脚本执行
      • 10.协同程序
      • 11.元表
        • 11.1 index
        • 11.2 newindex
        • 11.3其他操作
      • 12.面向对象
        • 12.1封装
        • 12.2继承
        • 12.3多态
      • 12 .【重要】面向对象汇总
      • 13.自带库
      • 13.垃圾回收
    • 三、`XLua`热更新

一、AssetBundle

1.理论

  • AB包是什么:特定于平台的资产压缩包,有点类似压缩文件,资产包括一些模型、贴图、预设体、音效、材质球等等

  • AB包作用:Resoureces打包时只读无法修改,AB包存储位置可以自定义,压缩方式自定义,后期可以动态更新。AB包可以减少包体大小,压缩资源减少初始包大小。可以通过热更新更新脚本或者资源

  • 使用

    在这里插入图片描述

2. AB包资源加载

  • 同步加载
// 加载AB包
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/model");
// 加载AB包中资源
// 通过泛型加载
GameObject cube = ab.LoadAsset<GameObject>("cube");
// 通过type加载
GameObject sphere = ab.LoadAsset("sphere", typeof(GameObject)) as GameObject;
// AB包不能加载两次会报错
// AssetBundle ab2 = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/model");
  • 异步加载
public Image img;
IEnumerator LoadABRes(string abName, string resNAme)
{// 异步加载ab包AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + abName + "." + resNAme);yield return abcr;AssetBundleRequest abq = abcr.assetBundle.LoadAssetAsync(resNAme, typeof(Sprite));yield return abq;img.sprite = abq.asset as Sprite;
}
  • AB包卸载
AssetBundle ab2 = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/model");
// 卸载所有AB包
// true会把场景上加载的AB包资源也卸载了
AssetBundle.UnloadAllAssetBundles(false);
// 卸载单独的AB包
ab2.Unload(false);

二、Lua 语法

1. 简单数据类型

  • lua所有变量声明不需要申明变量类型
  • lua可以改变数据类型,自动识别
  • 通过type函数获得类型
  • lua中使用未声明的变量默认是nil
-- 【nil类型】:类似 C#中的null
a = nil
print(a)
print(type(a))-- 【number类型】:表示所有数值类型
a = 1
print(a)
print(type(a))
a = 10.2
print(a)
print(type(a))-- 【string类型】:字符串类型,lua中单引号或双引号都是字符串与C#中不同,lua中没有char
a = "123"
print(a)
a = '111'
print(a)
print(type(a))-- 【boolean类型】
a = true
print(a)
print(type(a))

2.字符串操作

  • lua中文占三个字符
-- 获得字符串长度
str = "hellowrold"
print(#str)
str = "你好"
print(#str)-- 字符串拼接
print("你好".."世界")
print(string.format("我%d岁了", 18))-- 转字符串
str = tostring(true)
print(str)-- 字符串转ASCII码
a = string.byte("Lua", 1)
print(a)
-- ASCII码转字符
str = string.char(a)
print(str)

3.运算符

  • 字符串可以自动转成number
  • 整数相除可以转换为浮点数
  • 不支持自增自减++ –
  • 不支持位运算、三目运算符
  • Luanilfalse 才是假
  • lua中逻辑运算符支持短路
-- 算数运算符
print("3.14" + 2) -- 输出5.14
print(3 / 2) -- 输出1.5
print(2 ^ 2) -- 支持幂运算-- 条件运算符
print(100 ~= 5) -- 不等于符号,与C#不同(!= )-- 逻辑运算符
-- lua中逻辑运算符支持短路
print(true and false) -- &&与
print(true or false) -- ||或
print(not true) -- !非
-- lua中and or可以链接任意类型
print(1 and 2) -- 返回 2
print(nil and 1) -- 返回 nil
-- 使用逻辑运算模拟三目运算符
res = (x > y) and x or y

4.条件分支语句

  • 不支持switch
a = 6
-- if 语句
if a > 5 thenprint("success!")
end-- if-else语句
if a > 5 thenprint("succcess!")
elseprint("fault!")
end-- if-else if语句
if a == 5 thenprint("是5!")
elseif a == 6 thenprint("是6!")
end

5.循环语句

-- while
num = 0
while num < 5 donum = num + 1
end
print(num)-- do while
num = 6
repeatnum = num + 1
until num > 5
print(num)-- for
-- for 变量, 结束值,增量值(省略默认为1)
for i = 1, 5, 2 doprint(i)
end

6.函数

-- 1.1声明
function myFirstFun()print("我的第一个函数")
end
-- 调用
myFirstFun()-- 2.1有参函数
function testFun1(name)print("我的名字是"..name)
end
testFun1("小猫")-- 3.1有返回值函数
-- 3.1.1一个返回值
function testFun2()return "yes"
end
temp = testFun2()
print(temp)
-- 3.1.2多个返回值
function testFun3()return "paramete1","paramete2"
end
temp1, temp2 = testFun3()
print(temp1..temp2)-- 4.1类型
-- 不用写函数名
func1 = function()print("这是一个函数")
end
print(type(func1))
func1()-- 5.1变长参数
function testFun4(...)arg = {...}for i = 1, #arg doprint(arg[i])end
end
testFun4(1, 2, 3)-- 6.1函数嵌套
-- 闭包情况
function myFunC(x)return function(y)return x + yend
endmyfunc = myFunC(1)
ans = myfunc(2)
print("ans = "..ans)

7. table数组

  • lua中下标从1开始,越界读取最后一个
  • 表中存在nil会打断表长
-- 1.1 数组声明
a = {1, 2, true, "name", nil}
print(a[1]) -- 下标从1开始
print(#a) -- 输出:4-- 1.2 多维数组
a = {{1, 2, 3}, {4, 5, 6, 7}}
print(a[1][1])
for i = 1, #a dob = a[i]for j = 1, #b doprint(b[j])end
end

8.迭代器遍历

  • pairs遍历所有都能获得建议使用
a = {[0] = 1, 2, [-1] = 3, 4, 5}-- 1.1 ipairs遍历
-- 只能找从1开始下标,小于等于0得不到
-- 只能找连续索引的,如果中断后面无法获得
for k, v in ipairs(a) doprint("key = "..k.." value = ".. v)
end-- 1.2 pairs遍历
-- 所有都能获得
for k, v in pairs(a) doprint("key = "..k.." value = ".. v)
end
-- 只遍历键
for k in pairs(a) doprint("key = "..k)
end

9.复杂数据类型 - 表

9.1字典
fruitDic = {["apple"] = 10, ["banana"] = 5}
print(fruitDic["apple"])
print(fruitDic.banana) -- 只有字符串可以通过.获得-- 遍历
for k, v in pairs(fruitDic) doprint(k,v) -- 传入多个参数print
end
9.2类
  • lua中不存在面向对象
student = {name = "lily",age = 10,sex = true,changeSex = function(v)student.sex = vend,printSex = function()print(student.sex)end,printName = function(m)print(m.name)end
}student.printSex()
student.changeSex(false)
student.printSex()-- 冒号调用
-- 冒号调用默认第一个参数是调用者
-- .调用不能
student:printName()-- 外部添加函数
-- 方法一:
function student.myScore(v)print(v + 100)
end-- slef表示默认传入的第一个参数
-- 方法二:
function student:printAge()print(self.age)
end
-- 冒号声明冒号调用
student:printAge()
9.3 表的公共操作
t1 = {{name = "小猫", age = 1}, {name = "小狗", age = 2}}
t2 = {name = "小鸟", age = 2}-- 1.1插入
-- t2 插入到 t1 中
table.insert(t1, t2)
print(#t1)-- 1.2删除
-- 删除 t1 的最后一个元素
table.remove(t1)
print(t1[2].name)
-- 删除指定下标
table.remove(t1, 1)
print(t1[1].name)-- 1.3排序
t = {5, 6, 1, 3, 9, 2}-- 默认升序
table.sort(t)
print("----降序-----")
for _,v in pairs(t) doprint(v)
end-- 降序
table.sort( t, function(a, b)return a > b
end )
print("----降序-----")
for _,v in pairs(t) doprint(v)
end-- 1.4 拼接
tb = {"ccc", "aaa", "bbb"}
str = table.concat( tb, ";")
print(str)

多脚本执行

-- 1.1 局部变量
function myFunC()local x = 1y = 1
endmyFunC()
print(x) -- x是局部变量
print(y) -- y是全局变量-- 1.2 多脚本执行
-- require("脚本名") 执行其他脚本,只能加载一次
require("testLua")
-- 获得其他脚本的全局变量,局部变量获取不到
print(myTest)-- 1.3脚本卸载
-- 脚本是否被加载过
isLoad = package.loaded["testLua"]
print(isLoad)
-- 卸载脚本
package.loaded["testLua"] = nil-- 1.4 大G表
-- 大G表是一个总的table表,存储了所有全局变量在里面
for k,v in pairs(_G) doprint(k, v)
end

在这里插入图片描述

require 脚本可以 return 一个数据返回出去得到

10.协同程序

fun = function()print("使用协程")local i = 1while true doprint(i)i = i + 1coroutine.yield(i)end
end-- 返回一个线程
co = coroutine.create(fun)
print("类型:"..type(co))
coroutine.resume(co) -- 输出1
isOK, temp1 = coroutine.resume(co) -- 输出2
print(isOK,temp1) -- 第一个参数返回协程状态,第二个参数返回协程返回值-- 返回的是函数
co2 = coroutine.wrap(fun)
print("类型:"..type(co2))
co2() -- 输出1
temp1 = co2() -- 输出2
print(temp1) -- 直接返回协程返回值-- 获得协程状态
-- 传入协程对象,返回状态:dead结束 susdeaded暂停 running进行
back = coroutine.status(co)
print(back)

11.元表

11.1 index
  • index取值时,使用当子表中找不到某属性时会到元素中__index指定的表去查找索引
  • index支持向上查找原表的index
meta = {name = "father",age = 10,
}
sonTable = {name = "son"
}
setmetatable(sonTable, meta)
print(sonTable.age) -- 输出 nil-- 设置__index
meta.__index = meta
print(sonTable.age) -- 输出 10
11.2 newindex
  • newindex当赋值时,如果赋值不存在索引,将会赋值到newindex所指向的表中
meta = {name = "father"
}
sonTable = {
}
setmetatable(sonTable, meta)sonTable.name = "son"
print(sonTable.name) -- 输出sonmeta.__newindex = {}
print(sonTable.age) -- 输出nil
11.3其他操作
meta = {name = "father",__tostring = function(t)return t.nameend,__call = function(t)print(t)print("call!")end,__add = function(t1, t2)return t1.name..t2.nameend
}
sonTable = {name = "son"
}-- 设置元表:参数一 子表 参数二 元表
setmetatable(sonTable, meta)-- 1.1 __tostring
-- 当子表被当作字符串使用时会调用tostring方法
-- 默认传递第一个参数为调用者自己
print(sonTable)-- 输出son-- 1.2 __call
-- 子表被当作函数使用时会调用call方法
-- 默认传递第一个参数为调用者自己
sonTable() -- 输出 son call!-- 1.3运算符重载
-- __add 加法
print(sonTable + meta) -- 输出sonfather
-- __sub 减法、__mul 乘法、 __div 除法、 __mod 取余、 __pow 幂、 
-- __eq  相等== 原表一致返回true、__lt  小于、 __le  小于等于、__concat 拼接

12.面向对象

12.1封装
-- 1.1 封装
Object = {}
Object.id = 1-- 冒号调用,默认使用调用者作为第一个参数
function Object : new()-- self,获得默认传入的第一个参数-- 返回一个新对象(表),使用局部变量-- 设置对象的元表,和__indexlocal obj = {}self.__index = selfsetmetatable(obj, self)return obj
endlocal my = Object : new()
print(my.id) -- 输出1,因为使用了__indexmy.id = 99
print(my.id) -- 输出99,没有使用__newindex不会改变元表
print(Object.id) -- 输出1-- 封装一个函数
function Object : TestFun()print(self.id)
endmy:TestFun() -- 输出99
Object:TestFun() -- 输出1
12.2继承
-- 为父类写一个继承方法
function Object : subClass(className)-- _G表,是一个总表存储所有声明了的全局变量,以键值对形式存储-- 在_G中创建一个表_G[className] = {}-- 用元表完成继承local obj = _G[className]self.__index = selfsetmetatable(obj, self)
end-- Person继承Object
Object:subClass("Person")
-- 使用Object中的new对象方法
local p1 = Person:new()
print(p1.id)
12.3多态

在这里插入图片描述

-- Entity 继承 Object
Object : subClass("Entity")
-- 为 Object 添加变量和方法
Object.Speed = 0
function Object : GetSpeed()print("这是Object的方法")self.Speed = self.Speed + 1print(self.Speed)return self.Speed
end-- Player 继承 Entity
Entity : subClass("Player")-- 创建Player 对象 p1
local p1 = Player:new()
p1:GetSpeed() -- 输出:这是Object的方法-- 子类Player重写方法
function Player : GetSpeed()print("这是Player重写的方法")return self.Speed
end
p1:GetSpeed() -- 输出:这是Player重写的方法-- 构建base保留父类方法调用 : 如图-- 创建Player 对象 p2
local p2 = Player:new()
p2:GetSpeed() -- 输出:这是Player重写的方法-- 【注意】有误的
p1.base:GetSpeed() -- 输出:Speed = 1
p2.base:GetSpeed() -- 输出:Speed = 2
-- 【注意】正确的,使用点调用否则使用的是父类的变量
function Player : GetSpeed()self.base.GetSpeed(self)
end
p1:GetSpeed()
p2:GetSpeed()
-- 或者
p1.base.GetSpeed(p1)
p2.base.GetSpeed(p2)

12 .【重要】面向对象汇总

-- 基类
Object = {}
-- 实例化对象方法
function Object : new()local obj = {}self.__index = selfsetmetatable(obj, self)return obj
end
-- 继承方法
-- className:类名(字符串)
function Object : subClass(className)_G[className] = {}local obj = _G[className]self.__index = selfobj.base = selfsetmetatable(obj, self)
end

13.自带库

-- 时间
-- 系统时间
print(os.time())
print(os.time({year = 2024, month = 12, day = 17}))
local nowTime = os.date("*t")
for k, v in pairs(nowTime) doprint(k, v)
end-- 数学运算
print(math.abs(-11)) -- 绝对值
print(math.deg(math.pi)) -- 弧度转角度
print(math.cos(math.pi)) -- 三角函数
print(math.floor(2.6)) -- 向下取整
print(math.ceil(2.6)) -- 向上取整
print(math.max(1, 2))
print(math.min(1, 2))
print(math.modf(1.2)) -- 返回整数和小数部分
print(math.pow(2, 2)) -- 幂运算
math.randomseed(os.time()) -- 更换随机数种子
print(math.random(100)) -- 随机数
print(math.random(100)) -- 随机数
print(math.sqrt(2)) -- 开方-- 路径
print(package.path)

13.垃圾回收

三、XLua热更新

下篇链接:【Lua热更新】下篇

相关文章:

【Lua热更新】上篇

Lua 热更新 - 上篇 下篇链接&#xff1a;【Lua热更新】下篇 文章目录 Lua 热更新 - 上篇一、AssetBundle1.理论2. AB包资源加载 二、Lua 语法1. 简单数据类型2.字符串操作3.运算符4.条件分支语句5.循环语句6.函数7. table数组8.迭代器遍历9.复杂数据类型 - 表9.1字典9.2类9.3…...

Ubuntu批量修改文件名

文章目录 批量重命名文件&#xff1a;Ubuntu下使用find命令结合sed和mv参考 批量重命名文件&#xff1a;Ubuntu下使用find命令结合sed和mv 在日常开发和文件管理中&#xff0c;有时我们需要批量重命名一批文件&#xff0c;比如将文件名中的某个特定字符串替换为另一个字符串。…...

食家巷大烤馍:岁月沉淀下的麦香传奇

在繁华都市的街角巷尾&#xff0c;隐藏着许多不为人知的美食宝藏&#xff0c;食家巷大烤馍便是其中之一。它宛如一位低调的美食大师&#xff0c;默默散发着独特的魅力&#xff0c;用最质朴的味道&#xff0c;征服着每一个过往食客的味蕾。 初见食家巷大烤馍&#xff0c;你会被…...

harmony UI组件学习(1)

Image 图片组件 string格式&#xff0c;通常用来加载网络图片&#xff0c;需要申请网络访问权限:ohos.permission.INTERNET Image(https://xxx.png) PixelMap格式&#xff0c;可以加载像素图&#xff0c;常用在图片编辑中 Image(pixelMapobject) Resource格式&#xff0c;加…...

BTP Integration Suite CPI Apache Camel

官网文档&#xff1a; https://help.sap.com/docs/integration-suite/sap-integration-suite/what-is-sap-integration-suite CPI 云集成(CPI)有以下几个特性&#xff1a; SAP Cloud Integration通过消息交换支持端到端流程集成。 它基于Apache软件基金会的开源框架Camel。 …...

vitepress-打包SyntaxError: Element is missing end tag.

一、vitepress打包编译报错Element is missing end tag. 背景&#xff1a; 新增了一些笔记准备上传到git仓库&#xff0c;持续集成部署的时候&#xff0c;控制台报错了&#xff0c;错误信息如下&#xff1a; SyntaxError: Element is missing end tag. 仔细看了下控制台几乎没啥…...

【从零开始入门unity游戏开发之——C#篇21】C#面向对象的封装——`this`扩展方法、运算符重载、内部类、`partial` 定义分部类

文章目录 一、this扩展方法1、扩展方法的基本语法2、使用扩展方法3、扩展方法的注意事项5、扩展方法的限制6、总结 二、运算符重载1、C# 运算符重载2、运算符重载的基本语法3. 示例&#xff1a;重载加法运算符 ()4、使用重载的运算符5、支持重载的运算符6、不能重载的运算符7、…...

Java进程占用的内存有哪些部分?

大家好&#xff0c;我是锋哥。今天分享关于【Java进程占用的内存有哪些部分?】面试题。希望对大家有帮助&#xff1b; Java进程占用的内存有哪些部分? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Java进程在运行时&#xff0c;会将内存划分为多个区域&#xf…...

【华为OD机试真题】【2024年E卷】数值同化-队列BFS(C++/Java/Python)

文章目录 分值&#xff1a;200题目描述思路复杂度分析AC 代码 分值&#xff1a;200 题目描述 存在一个 m * n 的 二维数组只&#xff0c;其成员取值范围为0, 1, 2。其中值为1的元素具备同化特性&#xff0c;每经过1S&#xff0c;将上下左右值为0的元素同化为1。而值为2的元素…...

“魔法糖果盒的秘密:用朴素贝叶斯算法猜糖果颜色”

想象一下&#xff0c;你有一个神奇的糖果盒&#xff0c;这个糖果盒里有两种糖果&#xff1a;红色的和蓝色的。你闭上眼睛&#xff0c;从盒子里拿出一个糖果&#xff0c;然后尝一尝&#xff0c;你想知道这个糖果是红色的还是蓝色的。朴素贝叶斯算法就像是一个魔法规则&#xff0…...

linux中docker命令大全

基本命令 docker pull 拉取镜像 docker pull docker push 推送镜像到DockerRegistry docker push docker images 查看本地镜像 docker images docker rmi 删除本地镜像 docker rmi docker run 创建并运行容器&#xff08;不能重复创建&#xff09; docker run d…...

Python `str.strip()` 的高级用法详解

Python str.strip 的高级用法详解 1. str.strip() 的基本用法2. str.strip() 的高级用法2.1 移除指定字符2.2 移除多个指定字符2.3 移除换行符和制表符2.4 结合正则表达式的高级处理 3. lstrip() 和 rstrip() 的用法3.1 lstrip()&#xff1a;移除左端字符3.2 rstrip()&#xff…...

[蓝桥杯 2019 国 B] 排列数

目录 前言 题解 思路 疑问 解答 前言 对于本篇文章是站在别人的基础之上来写的&#xff0c;对于这道题作为2019年国赛B组的最难的一题&#xff0c;他的难度肯定是不小的&#xff0c;这道题我再一开始接触的时候连思路都没有&#xff0c;也是看了两三遍别人发的题解&#x…...

[bug] StarRocks borker load意向之外的bug

意向之外&#xff0c;又清理之中 背景&#xff1a; StarRocks各方面碾压相同类型的数据库&#xff0c;最近我们要从生成HIVE导历史数据&#xff08;ORC格式&#xff09;到StarRocks&#xff0c;前期小测一下&#xff0c;在测试是没问题&#xff0c;上生产先导2个月的数据&…...

2025年前端面试热门题目——HTML|CSS|Javascript|TS知识

以下是对这些 HTML 面试问题的详细解答&#xff1a; 1. HTML 的 src 和 href 属性有什么区别? src (Source) 属性&#xff1a; 用于嵌入资源&#xff0c;例如图像、脚本或 iframe。加载资源时&#xff0c;当前页面的加载会暂停&#xff0c;直到资源加载完成。常用于 <img&g…...

Linux中部署项目

1.下载JDK17 进入 /usr/local 目录&#xff0c;创建 java 文件夹。并将 JDK17 上传到 java 目录下。 上传成功后&#xff0c;通过cd命令进入Java文件夹目录&#xff0c;解压 JDK17 压缩包&#xff0c;命令 unzip zulu17.44.53-ca-jdk17.0.8.1-linux_x64.zip。 如果报错说 u…...

在 CentOS 上安装 MySQL 8

在 CentOS 上安装 MySQL 8 您可以按照以下步骤操作&#xff1a; 1. 更新系统 首先&#xff0c;更新系统软件包以确保安装的最新版本。 sudo yum update -y 2. 安装 MySQL 8 安装 MySQL 存储库 wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.r…...

gradle项目下载依赖报错

报错信息 Cannot resolve external dependency org.projectlombok:lombok:1.18.36 because no repositories are defined. Required by:project :Possible solution:- Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/…...

solon 集成 activemq-client (sdk)

原始状态的 activemq-client sdk 集成非常方便&#xff0c;也更适合定制。就是有些同学&#xff0c;可能对原始接口会比较陌生&#xff0c;会希望有个具体的示例。 <dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-client&l…...

LRU 缓存

LRU 缓存 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否…...

使用ZLMediaKit 开源项目搭建RTSP 服务器

ZLMediaKit 是啥&#xff1f; ZLMediaKit是国人开发的开源C流媒体服务器&#xff0c;同SRS一样是主流的流媒体服务器。 ZLToolKit是基于C11的高性能服务器框架&#xff0c;和ZLMediaKit是同一个作者&#xff0c;ZLMediaKit正是使用该框架开发的。 官网 ZLMediaKit开源地址&…...

数组晨考2day08

1.用一句话描述数组 在内存中 一块连续的空间 存储相同类型的数据 长度是固定的 2.数组各个类型的默认值 整数&#xff1a;0 浮点&#xff1a;0.0 布尔&#xff1a;false 字符&#xff1a;\u0000 其他&#xff1a;null 3.Arrays类toString&#xff0c;copyOf&#xff0c;sort&a…...

《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》简介

《鸿蒙HarmonyOS应用开发从入门到精通&#xff08;第2版&#xff09;》已于近日上市&#xff0c;该书由北京大学出版社出版。距离第1版上市已经过去二年半多。本文希望与读者朋友们分享下这本书里面的大致内容。 封面部分 首先是介绍封面部分。 《鸿蒙HarmonyOS应用开发从入门…...

麒麟操作系统服务架构保姆级教程(二)sersync、lsync备份和NFS持久化存储

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 上篇文章我们说到rsync虽好&#xff0c;但是缺乏实时性&#xff0c;在实际应用中&#xff0c;咱们可以将rsync写进脚本&#xff0c;然后写进定时任务去备份&#xff0c;如果每天凌晨1&#xff1a;00…...

将OBJ或GLB文件转换为3DTiles

格式简介 GLB文件&#xff08;.GLB&#xff09;代表“GL传输格式二进制文件”&#xff0c;是用于共享3D数据的标准化文件格式。确切地说&#xff0c;它可以包含有关三维模型、场景、模型、光源、材质、节点层次和动画的信息。 OBJ文件是一种文本文件格式&#xff0c;这就意味…...

Flink DataStream API 编程指南

(对于Flink的开发,建议使用Java,Scala的支持未来会被移除) DataStream是什么 DataStream API得名于DataStream这个Java类,可以将它们视为可以包含重复项的不可变数据集合。该数据可以是有限的,也可以是无限的,用于处理它们的API是相同的。 DataStream在用法上和普通的…...

tryhackme-Pre Security-HTTP in Detail(HTTP的详细内容)

任务一&#xff1a;What is HTTP(S)?&#xff08;什么是http&#xff08;s&#xff09;&#xff09; 1.What is HTTP? (HyperText Transfer Protocol)&#xff08;什么是 HTTP&#xff1f;&#xff08;超文本传输协议&#xff09;&#xff09; http是你查看网站的时候遵循的…...

探索 Plotly:一个强大的交互式数据可视化库

探索 Plotly&#xff1a;一个强大的交互式数据可视化库 数据可视化是数据分析过程中不可或缺的一部分&#xff0c;它能帮助我们更直观地理解数据&#xff0c;发现数据中的趋势和规律。在众多可视化库中&#xff0c;Plotly 是一个非常强大的工具&#xff0c;它以其交互式、易用…...

Oracle 查询表占用空间(表大小)的方法

目录 概述方法一&#xff1a;使用 dbms_space 包方法二&#xff1a;查询 dba_extents 视图方法三&#xff1a;查询 dba_segments 视图总结 1. 概述 在Oracle数据库管理中&#xff0c;了解特定表或索引所占用的空间对于性能调优、存储规划以及资源分配至关重要。本文档介绍了三…...

机器人国际会议IROS论文latex模板

机器人国际会议IROS论文latex模板 文档 root.tex 可以配置为 US Letter 纸或 A4。请注意以下重要行&#xff1a;\documentclass[letterpaper, 10 pt, Conference]{ieeeconf} % 如果需要 a4paper&#xff0c;请注释掉此行%\documentclass[a4paper, 10pt, Conference]{ieeeconf} …...