[unity] xLua 热更新 【个人复习笔记/有不足之处欢迎斧正/侵删】

 lua解析器

void Start(){//Lua解析器 能够让我们在Unity中执行Lua//一般情况下 保持它的唯一性LuaEnv env = new LuaEnv();//执行Lua语言env.DoString("print('你好世界')");//执行一个Lua脚本 Lua知识点 :多脚本执行 require//默认寻找脚本的路径 是在 Resources下 并且 因为在这里//估计是通过 Resources.Load去加载Lua脚本  txt bytes等等//所以Lua脚本 后缀要加一个txtenv.DoString("require('Main')");//帮助我们清除Lua中我们没有手动释放的对象 垃圾回收//帧更新中定时执行 或者 切场景时执行env.Tick();//销毁Lua解析器 env.Dispose();}

文件加载重定向

env.AddLoader(MyCustomLoader);
private byte[] MyCustomLoader(ref string filePath){return null;
}

解析器管理器

Lua管理器:

提供 lua解析器,保证解析器的唯一性-->使用单例模式

(Lua脚本会放到AB包中,最终通过加载AB包再加载其中的lua脚本资源来执行,但是AB包中如果要加载文本,后缀有一定的限制,.lua不能被识别)

从AB包加载文件:

    private byte[] MyCustomABLoader(ref string filePath){//Debug.Log("进入AB包加载 重定向函数");//从AB包中加载lua文件//加载AB包//string path = Application.streamingAssetsPath + "/lua";//AssetBundle ab = AssetBundle.LoadFromFile(path);//加载Lua文件 返回//TextAsset tx = ab.LoadAsset<TextAsset>(filePath + ".lua");//加载Lua文件 byte数组//return tx.bytes;//通过我们的AB包管理器 加载的lua脚本资源TextAsset lua = ABMgr.GetInstance().LoadRes<TextAsset>("lua", filePath + ".lua");if (lua != null)return lua.bytes;elseDebug.Log("MyCustomABLoader重定向失败,文件名为:" + filePath);return null;}

(Lua脚本会放在AB包 最终会通过加载AB包再加载其中的Lua脚本资源 来执行)

获取全局变量

只要在xlua中执行lua程序,都会自动进入重定向文件找

Lua代码

testNumber = 1
testBool = true
testFloat = 1.2
testString = "123"

C#代码

        //使用lua解析器luaenv中的 Global属性 (利用大G表)int i = LuaMgr.GetInstance().Global.Get<int>("testNumber");Debug.Log("testNumber:" + i);i = 10;//改值LuaMgr.GetInstance().Global.Set("testNumber", 55);//值拷贝 不会影响原来Lua中的值int i2 = LuaMgr.GetInstance().Global.Get<int>("testNumber");Debug.Log("testNumber_i2:" + i2);bool b = LuaMgr.GetInstance().Global.Get<bool>("testBool");Debug.Log("testBool:" + b);float f = LuaMgr.GetInstance().Global.Get<float>("testFloat");Debug.Log("testFloat:" + f);double d = LuaMgr.GetInstance().Global.Get<double>("testFloat");Debug.Log("testFloat_double:" + d);string s = LuaMgr.GetInstance().Global.Get<string>("testString");Debug.Log("testString:" + s);

不能直接得到lua代码中的本地变量(local)

获取全局函数

lua代码:

--无参无返回
testFun = function()print("无参无返回")
end--有参有返回
testFun2 = function(a)print("有参有返回")return a + 1
end--多返回
testFun3 = function(a)print("多返回值")return 1, 2, false, "123", a
end--变长参数
testFun4 = function(a, ...)print("变长参数")print(a)arg = {...}for k,v in pairs(arg) doprint(k,v)end
end

c#代码:

c#去存函数-->使用委托

//无参无返回的获取//委托CustomCall call = LuaMgr.GetInstance().Global.Get<CustomCall>("testFun");call();//Unity自带委托UnityAction ua = LuaMgr.GetInstance().Global.Get<UnityAction>("testFun");ua();//C#提供的委托Action ac = LuaMgr.GetInstance().Global.Get<Action>("testFun");ac();//Xlua提供的一种 获取函数的方式 少用//需要引用xluaLuaFunction lf = LuaMgr.GetInstance().Global.Get<LuaFunction>("testFun");lf.Call();//有参有返回CustomCall2 call2 = LuaMgr.GetInstance().Global.Get<CustomCall2>("testFun2");Debug.Log("有参有返回:" + call2(10));//C#自带的泛型委托 方便我们使用Func<int, int> sFun = LuaMgr.GetInstance().Global.Get<Func<int, int>>("testFun2");Debug.Log("有参有返回:" + sFun(20));//Xlua提供的LuaFunction lf2 = LuaMgr.GetInstance().Global.Get<LuaFunction>("testFun2");Debug.Log("有参有返回:" + lf2.Call(30)[0]);//多返回值//使用 out 和 ref 来接收CustomCall3 call3 = LuaMgr.GetInstance().Global.Get<CustomCall3>("testFun3");int b;bool c;string d;int e;Debug.Log("第一个返回值:" + call3(100, out b, out c, out d, out e));Debug.Log(b + "_" + c + "_" + d + "_" + e);CustomCall4 call4 = LuaMgr.GetInstance().Global.Get<CustomCall4>("testFun3");int b1 = 0;bool c1 = true;string d1 = "";int e1 = 0;Debug.Log("第一个返回值:" + call4(200, ref b1, ref c1, ref d1, ref e1));Debug.Log(b1 + "_" + c1 + "_" + d1 + "_" + e1);//XluaLuaFunction lf3 = LuaMgr.GetInstance().Global.Get<LuaFunction>("testFun3");object[] objs = lf3.Call(1000);for( int i = 0; i < objs.Length; ++i ){Debug.Log("第" + i + "个返回值是:" + objs[i]);}//变长参数CustomCall5 call5 = LuaMgr.GetInstance().Global.Get<CustomCall5>("testFun4");call5("123", 1, 2, 3, 4, 5, 566, 7, 7, 8, 9, 99);LuaFunction lf4 = LuaMgr.GetInstance().Global.Get<LuaFunction>("testFun4");lf4.Call("456", 6, 7, 8, 99, 1);

自定义的委托需要在c#脚本中添加特性,并在unity的xlua中生成code

//无参无返回值的委托
public delegate void CustomCall();//有参有返回 的委托
//该特性是在XLua命名空间中的
//加了过后 要在编辑器里 生成 Lua代码
[CSharpCallLua]
public delegate int CustomCall2(int a);[CSharpCallLua]
public delegate int CustomCall3(int a, out int b, out bool c, out string d, out int e);
[CSharpCallLua]
public delegate int CustomCall4(int a, ref int b, ref bool c, ref string d, ref int e);[CSharpCallLua]
public delegate void CustomCall5(string a, params int[] args);

表(Table)映射 List 和 Dictionary

Lua代码:

--List
testList = {1,2,3,4,5,6}
testList2 = {"123", "123", true, 1, 1.2}--Dictionary
testDic = {["1"] = 1,["2"] = 2,["3"] = 3,["4"] = 4
}testDic2 = {["1"] = 1,[true] = 1,[false] = true,["123"] = false
}

C#代码:

//同一类型ListList<int> list = LuaMgr.GetInstance().Global.Get<List<int>>("testList");Debug.Log("*******************List************************");for ( int i = 0; i <list.Count; ++i ){Debug.Log(list[i]);}//值拷贝 浅拷贝 不会改变lua中的内容list[0] = 100;List<int> list2 = LuaMgr.GetInstance().Global.Get<List<int>>("testList");Debug.Log(list2[0]);//不指定类型 objectList<object> list3 = LuaMgr.GetInstance().Global.Get<List<object>>("testList2");Debug.Log("*******************List object************************");for (int i = 0; i < list3.Count; ++i){Debug.Log(list3[i]);}Debug.Log("*******************Dictionary************************");Dictionary<string, int> dic = LuaMgr.GetInstance().Global.Get<Dictionary<string, int>>("testDic");foreach (string item in dic.Keys){Debug.Log(item + "_" + dic[item]);}dic["1"] = 100000;//值拷贝 不会改变lua中的内容Dictionary<string, int> dic2 = LuaMgr.GetInstance().Global.Get<Dictionary<string, int>>("testDic");Debug.Log(dic2["1"]);Debug.Log("*******************Dictionary object************************");Dictionary<object, object> dic3 = LuaMgr.GetInstance().Global.Get<Dictionary<object, object>>("testDic2");foreach (object item in dic3.Keys){Debug.Log(item + "_" + dic3[item]);}

表映射到 类

lua代码:

testClass = {testInt = 2,testBool = true,testFloat = 1.2,testString = "123",testFun = function()print("123123123")end
}

c#代码:

CallLuaClass obj = LuaMgr.GetInstance().Global.Get<CallLuaClass>("testClass");Debug.Log(obj.testInt);Debug.Log(obj.testBool);//Debug.Log(obj.testFloat);Debug.Log(obj.testString);Debug.Log(obj.i);Debug.Log("嵌套:" + obj.testInClass.testInInt);obj.testFun();//值拷贝 改变了它 不会改变Lua表里的内容obj.testInt = 100;CallLuaClass obj2 = LuaMgr.GetInstance().Global.Get<CallLuaClass>("testClass");Debug.Log(obj2.testInt);

在类声明成员变量的过程中名字一定要和lua的相同

自定义中的变量可以更多也可以更少,如果变量比 lua中的少 就会忽略它,如果变量比 lua中的多 不会赋值 也会忽略

public class CallLuaClass
{public int testInt;public bool testBool;public float testString;public UnityAction testFun;public CallLuaInClass testInClass;public int i;public void Test(){Debug.Log(testInt);}
}

表映射接口

接口的实现:

由于在接口中不允许成员变量的存在,因此使用属性来接受Lua中的变量

改了c#代码结构后,先在xlua中清掉原来的,再生成新的code

[CSharpCallLua]
public interface ICSharpCallInterface
{int testInt{get;set;}bool testBool{get;set;}string testString{get;set;}UnityAction testFun{get;set;}float testFloat222{get;set;}
}

(接口是引用拷贝而不是值拷贝)

Lua Table 映射 table

因为效率低,所以不建议使用LuaTable和LuaFunction

        LuaTable table = LuaMgr.GetInstance().Global.Get<LuaTable>("testClas");Debug.Log(table.Get<int>("testInt"));Debug.Log(table.Get<bool>("testBool"));Debug.Log(table.Get<float>("testFloat"));Debug.Log(table.Get<string>("testString"));table.Get<LuaFunction>("testFun").Call();table.Set("testInt", 666);Debug.Log(table.Get<int>("testInt"));LuaTable table2 = LuaMgr.GetInstance().Global.Get<LuaTable>("testClas");Debug.Log(table2.Get<int>("testInt"));table.Dispose();table2.Dispose();

(是引用拷贝,用完后记得销毁,不定时清空的话会产生内存泄露)

Lua使用C#类

Lua没有办法直接访问c#,一定是先从C#调用Lua脚本后,才把核心逻辑交给Lua编写

lua中使用C#的类:

CS.命名空间.类名
Unity的类 比如 GameObject Transform等等 —— CS.UnityEngine.类名
CS.UnityEngine.GameObject

--通过C#中的类 实例化一个对象 lua中没有new 所以直接 类名括号就是实例化对象
--默认调用的 相当于就是无参构造
local obj1 = CS.UnityEngine.GameObject()
local obj2 = CS.UnityEngine.GameObject("HFUT")

为了方便使用 并且节约性能 可以定义全局变量存储 C#中的类

GameObject = CS.UnityEngine.GameObject
local obj3 = GameObject("HFUTER")

类中的静态对象 可以直接使用.来调用

得到对象中的成员变量  直接对象 . 即可

如果使用对象中的 成员方法!!!!一定要加:

自定义类使用方法相同,只是命名空间不同而已

继承了Mono的类 是不能直接new ,其依附于gameobject

可以通过GameObject的AddComponent添加脚本,由于xlua中不支持 无参泛型函数  所以要使用另一个重载

--xlua提供了一个重要方法 typeof 可以得到类的Type
obj5:AddComponent(typeof(CS.LuaCallCSharp))

调用枚举

CS.命名空间.枚举名.枚举成员,也支持取别名 

PrimitiveType = CS.UnityEngine.PrimitiveType
GameObject = CS.UnityEngine.GameObject

自定义枚举使用方法一样,注意命名空间即可

E_MyEnum =  CS.E_MyEnum--枚举转换相关
local c = E_MyEnum.Idle--数值转枚举
local a = E_MyEnum.__CastFrom(1)--字符串转枚举
local b = E_MyEnum.__CastFrom("Atk")

调用数组/List/字典

--C#怎么用 lua就怎么用 不能使用#去获取长度
print(obj.array.Length)

遍历要注意 虽然lua中索引从1开始,但是数组是C#那边的规则 所以 还是得按C#的来

--访问元素
print(obj.array[0])for i=0,obj.array.Length-1 doprint(obj.array[i])
end

Lua中创建一个C#的数组 Lua中表示数组和List可以用表;如果创建C#中的数组 使用 Array类中的静态方法即可(数组的本质是一个Array类

local array2 = CS.System.Array.CreateInstance(typeof(CS.System.Int32), 10)

Lua调用C# list

obj.list:Add(1)
obj.list:Add(2)
obj.list:Add(3)
--长度
print(obj.list.Count)
--遍历
for i=0,obj.list.Count - 1 doprint(obj.list[i])
end
print(obj.list)

在Lua中创建一个List对象

//老版本
local list2 = CS.System.Collections.Generic["List`1[System.String]"]()//新版本
local List_String = CS.System.Collections.Generic.List(CS.System.String)
local list3 = List_String()

Lua调用C# dictionary相关知识点

使用和C#一致,但遍历区别很大

for k,v in pairs(obj.dic) doprint(k,v)
end

在Lua中创建一个字典对象

local Dic_String_Vector3 = CS.System.Collections.Generic.Dictionary(CS.System.String, CS.UnityEngine.Vector3)
local dic2 = Dic_String_Vector3()

(第一步相当于得到了一个 Dictionary<string, Vector3> 的一个类别名 需要再实例化)

在Lua中创建的字典,如果直接通过键中括号得是得不到的,是nil

--错误写法
print(dic2["123"])
--正确写法
print(dic2:TryGetValue("123"))
--如果要通过键获取值 要通过这个固定方法,输出和上述不同
print(dic2:get_Item("123"))
dic2:set_Item("123", nil)
print(dic2:get_Item("123"))

调用拓展方法

定义拓展方法

public class Lesson{public string name="HFUT";
public void Speak(string str){Debug.Log(str);}
}public static class Tools{public static void Move(this Lesson obj){}
}

使用静态方法:CS.命名空间.类名.静态方法名()

成员方法:实例化出来用,使用成员方法一定用冒号

local obj = Lesson4()
obj:Speak("Unity")--使用拓展方法 和使用成员方法 一致obj:Move()

发生报错是因为,要调用 C#中某个类的拓展方法 那一定要在拓展方法的静态类前面加上LuaCallCSharp特性,建议在Lua中要使用的类都加上该特性,可以提升性能(反射机制调用会降低效率)

ref 和 out

ref参数:会以多返回值的形式返回给lua,如果函数存在返回值,那么第一个值就是该返回值,之后的返回值就是ref的结果从左到右一一对应(ref参数 需要传入一个默认值来占位置)

--a 相当于 函数返回值
--b 第一个ref
--c 第二个ref
local a,b,c = obj:RefFun(1, 0, 0, 1)

out参数:会以多返回值的形式返回给lua,如果函数存在返回值,那么第一个值,就是该返回值(之后的返回值就是out的结果,其他从左到右一一对应)

--out参数 不需要传占位置的值
local a,b,c = obj:OutFun(20,30)

混合使用时 ,综合上面的规则,ref需占位/out不用传
第一个是函数的返回值,之后从左到右依次对应ref或者out

local a,b,c = obj:RefOutFun(20,1)

调用重载函数

虽然Lua自己不支持写重载函数,但是Lua支持调用C#中的重载函数  

虽然支持调用C#重载函数但是因为Lua中的数值类型只有Number,所以对C#中多精度的重载函数支持不好,傻傻分不清。因此在使用时 可能出现意想不到的问题

为了解决重载函数含糊的问题,xlua提供了解决方案---反射机制,但是这种方法只做了解尽量别用

利用Type,Type是反射的关键类,可以得到指定函数的相关信息(Float的类名交Single

local m1 = typeof(CS.Lesson6):GetMethod("Calc", {typeof(CS.System.Int32)})
local m2 = typeof(CS.Lesson6):GetMethod("Calc", {typeof(CS.System.Single)})--通过xlua提供的一个方法 把它转成lua函数来使用
--一般我们转一次 然后重复使用
local f1 = xlua.tofunction(m1)
local f2 = xlua.tofunction(m2)
--成员方法 第一个参数传对象
--静态方法 不用传对象

如果是成员方法——第一个参数传对象;如果是静态方法——不用传对象

print(f1(obj, 10))
print(f2(obj, 10.2))

委托和事件

委托是用来装函数的,使用C#中的委托用来装lua函数

local fun = function( )print("Lua函数Fun")
end
--如果第一次往委托中加函数 因为是nil 不能直接+
--所以第一次 要先等=
obj.del = fun
--obj.del = obj.del + fun
obj.del = obj.del + fun

还可以这么写,不过不建议

obj.del = obj.del + function( )print("HFUT")
end

其他操作

obj.del = obj.del - fun
--委托执行
obj.del()--清空所有存储的函数
obj.del = nil

事件:

local fun2 = function()print("事件加的函数")
endobj:eventAction("+", fun2)
obj:DoEvent()
obj:eventAction("-", fun2)

事件不能直接置空,需要调用c#中包裹的清空函数

二维数组

for i=0,obj.array:GetLength(0)-1 dofor j=0,obj.array:GetLength(1)-1 doprint(obj.array:GetValue(i,j))end
end

注意,不能通过[0,0]或者[0][0]访问元素,lua不支持这种索引方式

null 和 nil

nil和null 没法进行==比较

可以采用平替方式:

1.        if rig:Equals(nil) then
2.        在c#和lua主脚本写一个判空函数

协程

C#中协程启动都是通过继承了Mono的类 通过里面的启动函数StartCoroutine

可以在场景中新建一个空物体  然后挂一个脚本上去 脚本继承mono使用它来开启协程

fun = function()local a = 1while true do--lua中 不能直接使用 C#中的 yield return --就使用lua中的协程返回coroutine.yield(WaitForSeconds(1))print(a)a = a + 1if a > 10 then--停止协程和C#当中一样mono:StopCoroutine(b)endend
end

不能直接将 lua函数传入到开启协程中,要利用xlua提供的一个工具表

--一定是要通过require调用之后 才能用
util = require("xlua.util")

如果要把lua函数当做协程函数传入,必须先调用xlua.util中的cs_generator(lua函数)

b = mono:StartCoroutine(util.cs_generator(fun))

调用泛型函数方法

lua中不支持没有约束的泛型函数,也不支持有约束但是没有参数的泛型函数,还不支持非class的约束(用接口约束的)

如何让上面不支持使用的泛型函数变得能用?

答:得到通用函数,设置泛型类型再使用。

       xlua.get_generic_method(类, "函数名")

local testFun2 = xlua.get_generic_method(CS.Lesson12, "TestFun2")
local testFun2_R = testFun2(CS.System.Int32)
--调用
--成员方法  第一个参数 传调用函数的对象
--静态方法 不用传
testFun2_R(obj, 1)

但是有一定的使用限制

Mono打包:这种方式支持使用
il2cpp打包 :如果泛型参数是引用类型才可以使用;如果泛型参数是值类型,除非C#那边已经调用过了,同类型的泛型参数 lua中才能够被使用

热补丁

lua当中热补丁代码固定写法:xlua.hotfix(类, "函数名", lua函数)

--成员函数 第一个参数 self
xlua.hotfix(CS.HotfixMain, "Add", function(self, a, b)return a + b
end)--静态函数 不用传第一个参数
xlua.hotfix(CS.HotfixMain, "Speak", function(a)print(a)
end)

注意:直接写好代码运 是会报错的,必须做4个非常重要的操作

1.加特性
2.加宏 (第一次开发热补丁需要加)Project Settings->Player->Scripting Define Symbols
3.生成代码
4.hotfix 注入  (注入时可能报错,提示要引入Tools)

只要我们修改了热补丁类的代码,就需要重新执行hotfix 注入(需要重新点击 注入)

多函数替换

xlua.hotfix(类, {函数名 = 函数, 函数名 = 函数....})

xlua.hotfix(CS.HotfixMain, {Update = function(self)print(os.time())end,Add = function(self, a, b )return a + bend,Speak = function(a)print(a)end
})

构造函数-热补丁固定写法        [".ctor"]

和别的函数不同,构造函数不是替换,而是先调用原逻辑,再调用lua逻辑

析构函数固定写法 Finalize

xlua.hotfix(CS.HotfixTest, {[".ctor"] = function()end,Speak = function(self,a)end,--析构函数Finalize = function()end
})

协程函数替换

要在lua中配合C#协程函数,必须使用

util = require("xlua.util")

如果是为打了Hotfix特性的C#类新加了函数内容,不能只注入 ,必须要先生成代码再注入,不然注入会报错

xlua.hotfix(CS.HotfixMain, {TestCoroutine = function(self)--返回一个正儿八经的 xlua处理过的lua协程函数return util.cs_generator(function()while true docoroutine.yield(CS.UnityEngine.WaitForSeconds(1))print("Lua打补丁后的协程函数")endend)end
})

属性和索引器替换

属性进行热补丁重定向:

set_属性名 是设置属性 的方法
get_属性名 是得到属性 的方法

xlua.hotfix(CS.HotfixMain, {set_Age = function(self, v)print("Lua重定向的属性"..v)end,get_Age = function(self)return 10;end
})

索引器进行热补丁重定向:

set_Item 通说索引器设置
get_Item 通过索引器获取

xlua.hotfix(CS.HotfixMain, {set_Age = function(self, v)print("Lua重定向的属性"..v)end,get_Age = function(self)return 101;end,set_Item = function(self, index, v )end,get_Item = function(self, index)return 666end
})

事件的替换

add_事件名 代表着时间加操作
remove_事件名 减操作

xlua.hotfix(CS.HotfixMain, {add_myEvent = function(self, del)print(del)end,remove_myEvent = function(self, del )print(del)end
})

注意:重定向后,如果使用lua使用C#事件的方法去添加,在事件加减的重定向lua函数中,不要把传入的委托往事件里存,会死循环(会把传入的函数存在lua中)-> self:myEvent("+", del)

泛型类的替换

泛型类中的T是可以变化,但是lua中的替换 要一个类型一个类型的来

xlua.hotfix(CS.HotfixTest2(CS.System.String), {Test = function(self, str)end
})xlua.hotfix(CS.HotfixTest2(CS.System.Int32), {Test = function(self, str)end
})

别忘了成员方法第一个参数是self

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

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

相关文章

cuda python torch 虚拟环境配置

以下是Pytorch和CUDA对应的版本 以下是Pytorch和Python对应的版本 检查cuda与Python版本是否匹配 import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.empty(3,4,devicecuda))cuda 删除cuda conda uninstall cudatoolkit --forceconda u…

MyBatis三个经典问题

1. Mybatis的执行流程 MyBatis 是一个流行的 Java 持久化框架&#xff0c;提供了对象关系映射 (ORM) 和 SQL 映射的功能&#xff0c;使开发者能够更加方便地与数据库交互。MyBatis 的执行流程大致如下&#xff1a; 配置阶段: 加载配置文件: MyBatis 通过读取配置文件&#xff…

蓝桥杯2013年-幸运数(C语言-链表模拟)

题目描述 幸运数是波兰数学家乌拉姆命名的。它采用与生成素数类似的“筛法”生成 。 首先从1开始写出自然数1,2,3,4,5,6,.... 1 就是第一个幸运数。 我们从2这个数开始。把所有序号能被2整除的项删除&#xff0c;变为&#xff1a; 1 _ 3 _ 5 _ 7 _ 9 .... 把…

支付宝小程序模板开发,实现代小程序备案申请

大家好&#xff0c;我是小悟 支付宝小程序备案整体流程总共分为五个环节&#xff1a;备案信息填写、平台初审、工信部短信核验、通管局审核和备案成功。 服务商可以代小程序发起备案申请。在申请小程序备案之前&#xff0c;需要确保小程序基本信息已填写完成、小程序至少存在一…

Docker入门——安装部署(openEuler)、镜像加速

安装 1&#xff09;依赖的基础环境 64 位CPU Linux kernel(内核) 3.10 Linux kernel cgroups and namespaces 我用的是openEuler&#xff0c;所以直接yum安装(推荐&#xff0c;因为二进制安装&#xff0c;docker命令中补全操作要另外安装软件) [rootlocalhost ~]# yum -y…

【AIGC调研系列】DevOps过程中依靠AIGC提升效率的具体实例

在DevOps过程中利用AIGC提升效率的具体实例包括&#xff1a; 智能排查流水线错误&#xff1a;云效工程师们与阿里云通义大模型合作&#xff0c;通过基于AIGC的工具辅助流水线错误排查&#xff0c;提高了DevOps流水线运行的效率和准确性[5]。自动化编程提高研发效率&#xff1a…

「经验」在博途中 是否可以在 LAD与STL 语言之间进行切换

用惯了STEP7&#xff0c;准确来说是SIMATIC Manager进行编程开发的同学&#xff0c;在转战TIA portal后&#xff0c;通常会经历一段“晦涩”的过度期&#xff0c;包括指令库的微小变动、工作界面的大改等等。 又比如&#xff1a;“在博途中&#xff0c;怎么快速切换LAD与STL语…

NVMe管理命令为何不用SGL?-2

在IO数据传输中&#xff0c;是否选择SGL可以根据自身场景的需要。SGL提供的是一种高效且灵活的方式来描述非连续的内存区域&#xff0c;这对于现代高性能存储系统至关重要&#xff0c;尤其是在处理大数据块或者随机小I/O操作时具有明显优势&#xff1a; 高效的数据传输&#xf…

课题学习(二十)----阅读《近钻头井斜动态测量重力加速度信号提取方法研究》论文

摘要&#xff1a;利用加速度计进行近钻头井斜动态测量时&#xff0c; 钻具的高速旋转、 井下强振动、强冲击环境给重力加速度测量带来极大干扰&#xff0c;如何从干扰噪声中有效提取重力加速度信号对于提高井斜角和工具面角的测量精度至关重要。 根据重力加速度径向和切向分量为…

【代码随想录】day1 数组

因为学计算机语言是属于半路出家&#xff0c;在接触数据结构之前&#xff0c;我只了解数据的类型&#xff0c;从没有了解过不同数据类型的存储方式。数组、链表等等因为不同的存储方式&#xff0c;展现出不同的优缺点&#xff0c;以适应不同的用途。 代码随想录是属于把饭喂到嘴…

Altium Designer 22 性能优化

目录 AD22 使用起来很卡&#xff0c;完全受不了&#xff0c;卡到我的快捷鼠标宏都无法使用&#xff0c;来试着优化一下它。 每点完一步&#xff0c;都需要点击应用&#xff0c;否则不下心关掉了会很难受 打开右上角齿轮进入设置&#xff0c;取消勾选这几个勾&#xff1a; 接…

java spring 03 启动细节

spring启动类ClassPathXmlApplicationContext&#xff0c;读取xml文件并且创建bean public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, Nullable ApplicationContext parent)throws BeansException {super(parent);setConfigLocations(confi…

oracle 表中的rowid会变动吗

oracle中访问select能够以最快的方式访问表中的一行的方法就是使用rowid,但是我们并不能使用rowid作为表主键。 在Oracle数据库中&#xff0c;ROWID是一个伪列&#xff0c;用于唯一标识表中的每一行记录。它起着几个关键的作用&#xff1a; 唯一标识&#xff1a;ROWID可以唯一…

python 亲测有效:无法连接互联网,离线部署python运行环境与安装包

**这里写目录标题** 安装包准备-在网络条件下下载所需要的第三方库安装包一、提取第三方库目录到requirements.txt二、批量下载requirements.txt的whl文件 安装包复制到无网络条件下&#xff0c;安装第三方库安装包**可能存在的问题 报错信息&#xff0c;欢迎私信&#xff0c;指…

android开发框架mvp,Android面试心得必备技能储备详解

面试复习路线图 我之前复习&#xff0c;大多都在20点以后&#xff0c;因为晚上比较能集中注意力&#xff0c;制定一个学习计划&#xff0c;切勿零散的复习&#xff0c;最好是系统的复习&#xff0c;才能胜却在握 主要内容如下&#xff1a; BAT的面试题目相关性能优化相关相关…

Qt之插件

插件结构 #mermaid-svg-HMxjwDgwwRejLSQ5 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-HMxjwDgwwRejLSQ5 .error-icon{fill:#552222;}#mermaid-svg-HMxjwDgwwRejLSQ5 .error-text{fill:#552222;stroke:#552222;}#…

算法设计.

文章目录 1. 贪心算法&#xff1a;只看当前1.1 零钱兑换问题&#xff1a;力扣322 2. 活动选择问题3. 动态规划3.1 不同路径&#xff1a;3.2 0-1背包问题3.3 完全背包问题3.4 零钱兑换-动态规划 4. 最长公共字串--动态规划5. 最长公共子序列6. 最长递增子序列7. 打家劫舍8. 全排…

事务、视图、索引、数据备份和恢复

1.事务 事务&#xff08;TRANSACTION&#xff09;是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令&#xff0c;并且把所有的命令作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这一组数据库操作命令要么都执行&#xff0c;要么都不执行。 事务是一个不…

信息熵 (Entropy)

在深度学习和机器学习中&#xff0c;熵是一个衡量不确定性或信息量的关键概念。它在各个方面发挥着作用&#xff0c;从数据的压缩和分布的特性分析&#xff0c;到模型的正则化和决策过程的优化。以下是熵在深度学习中的一些关键知识点&#xff1a; 信息熵 (Entropy) 信息熵是…

04. Nginx入门-Nginx WEB模块

测试环境 此处使用的yum安装的Nginx路径。 此处域名均在本地配置hosts。 主配置文件 路径&#xff1a;/etc/nginx/nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connection…