Unity开发游戏使用XLua的基础
Unity使用Xlua的常用编码方式,做一下记录
1、C#调用lua
1、Lua解析器
private LuaEnv env = new LuaEnv();//保持它的唯一性void Start(){env.DoString("print('你好lua')");//env.DoString("require('Main')"); 默认在resources文件夹下面//帮助我们清除lua中我们没有手动释放的对象 垃圾回收env.Tick();//销毁lua解释器,用的较少env.Dispose();}
2、自定义loader
private void Start(){//xlua路径重定向方法_env.AddLoader(MyLoader);_env.DoString("require('Main')");}private byte[] MyLoader(ref string filepath){//传入的filepath是 require执行的lua脚本文件名,在这里是mainstring path = Application.dataPath + "/Lua/" + filepath + ".lua";//判断文件是否存在if (File.Exists(path)){return File.ReadAllBytes(path);}else{Debug.Log("重定向失败,文件名为"+filepath);}return null;}
3、Lua管理器
/// <summary>
/// lua管理器
/// 提供lua解析器
/// 保证解析器的唯一性
/// </summary>
public class LuaMgr
{private static LuaMgr _instance;public static LuaMgr Instance{get{if (_instance==null){_instance = new LuaMgr();}return _instance;}}private LuaEnv _luaEnv;/// <summary>/// 得到lua中的_G/// </summary>public LuaTable Gloabl => _luaEnv.Global;/// <summary>/// 初始化/// </summary>public void Init(){if (_luaEnv!=null) return;_luaEnv = new LuaEnv();_luaEnv.AddLoader(MyLoader);_luaEnv.AddLoader(MyABLoader);}#region 标准内容/// <summary>/// 传入文件名,执行脚本/// </summary>/// <param name="fileName"></param>public void DoLuaFile(string fileName){string str = $"require('{fileName}')";DoString(str);}public void DoString(string str){if(_luaEnv==null){Debug.Log("解析器未初始化");return;}_luaEnv.DoString(str);}/// <summary>/// 释放lua垃圾/// </summary>public void Tick(){if(_luaEnv==null){Debug.Log("解析器未初始化");return;}_luaEnv.Tick();}/// <summary>/// 销毁解析器/// </summary>public void Dispose(){if(_luaEnv==null){Debug.Log("解析器未初始化");return;}_luaEnv.Dispose();_luaEnv = null;}//自动执行private byte[] MyLoader(ref string filepath){//传入的filepath是 require执行的lua脚本文件名,在这里是mainstring path = Application.dataPath + "/Lua/" + filepath + ".lua";//判断文件是否存在if (File.Exists(path)){return File.ReadAllBytes(path);}else{Debug.Log("重定向失败,文件名为"+filepath);}return null;}//重定向加载AB包中的lua脚本private byte[] MyABLoader(ref string filepath){//加载路径string path = Application.streamingAssetsPath + "/lua";//加载AB包AssetBundle ab=AssetBundle.LoadFromFile(path); TextAsset tx = ab.LoadAsset<TextAsset>(filepath+".lua");//加载Lua文件返回//加载lua文件,byte数组return tx.bytes;}//Lua脚本最终会放在ab包中,#endregion
}
4、全局变量获取
private void Start(){LuaMgr.Instance.Init();LuaMgr.Instance.DoLuaFile("Main");int i= LuaMgr.Instance.Gloabl.Get<int>("testNumber");var i2= LuaMgr.Instance.Gloabl.Get<bool>("testBool");var i3= LuaMgr.Instance.Gloabl.Get<float>("testFloat");var i4= LuaMgr.Instance.Gloabl.Get<string>("testString");//值拷贝不会修改lua中的值,可以用setLuaMgr.Instance.Gloabl.Set("testNumber",1000);i= LuaMgr.Instance.Gloabl.Get<int>("testNumber");Debug.Log("testNumber"+i);}
虽然lua中只有number一种数值类型,但是我们可以根据它具体的值,用对应的C#变量类型来存储
5、全局函数的获取
public delegate void CustomCall();
public delegate void CustomCall2(int a);
//加一个特性,只有添加特性才能被调用,,加完特性后还要一部分工作,就是点击Xlua->Generatedate
[CSharpCallLua]
public delegate int CustomCall3(int a);
[CSharpCallLua] //使用out来接
public delegate int CustomCall4(int a,out int b,out bool c,out string d,out int e);[CSharpCallLua] //使用ref来接
public delegate int CustomCall5(int a,ref int b,ref bool c,ref string d,ref int e);//变长函数,如果边长函数中类型多种多样,那就使用object
[CSharpCallLua]
public delegate void CustomCall6(string a,params int[] args);
public class Lesson5_CallFunction : MonoBehaviour
{ void Start(){LuaMgr.Instance.Init();// LuaMgr.Instance.DoString("require('Main')"); LuaMgr.Instance.DoLuaFile("Main");//无参无返回值var call1= LuaMgr.Instance.Gloabl.Get<UnityAction>("testFun1");call1();//有参有返回值var call2 = LuaMgr.Instance.Gloabl.Get<CustomCall3>("testFun2");// Debug.Log(call2(2));var call3 = LuaMgr.Instance.Gloabl.Get<Func<int,int>>("testFun2");// Debug.Log("Func: "+call3(2));//有参多返回值var call4 = LuaMgr.Instance.Gloabl.Get<CustomCall4>("testFun3");int b;bool c;string d;int e;// Debug.Log(call4(51,out b,out c,out d,out e));var call5 = LuaMgr.Instance.Gloabl.Get<CustomCall5>("testFun3");int b1 = 0;bool c1 = true;string d1="";int e1=0;// Debug.Log(call5(51,ref b1,ref c1,ref d1,ref e1));var call6 = LuaMgr.Instance.Gloabl.Get<CustomCall6>("testFun4");call6("你好",1,5,6,5,4);// LuaFunction lf = LuaMgr.Instance.Gloabl.Get<LuaFunction>("testFun4");// lf.Call("你好", 1, 5, 6, 5, 4);}
print("Variable启动")
-- 无参无返回
testFun1 = 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
6、List和Dictionary
private void Start(){LuaMgr.Instance.Init();LuaMgr.Instance.DoLuaFile("Main");#region ListList<int> list = LuaMgr.Instance.Gloabl.Get<List<int>>("testList");for (int i = 0; i < list.Count; i++){Debug.Log("----"+list[i]);}//不确定类型用objectList<object> list2 = LuaMgr.Instance.Gloabl.Get<List<object>>("testList2");for (int i = 0; i < list2.Count; i++){Debug.Log("----"+list2[i]);}#endregion#region 字典Dictionary<string, int> dic = LuaMgr.Instance.Gloabl.Get<Dictionary<string, int>>("testDic");foreach (var item in dic){Debug.Log(item.Key+"____"+item.Value);}Dictionary<object, object> dic2 = LuaMgr.Instance.Gloabl.Get<Dictionary<object, object>>("testDic2");foreach (var item in dic2){Debug.Log(item.Key+"____"+item.Value);}#endregion}
7、类映射table
//Lua
testClas={testInt=2,testBool=true,testFloat=1.2,testString="123",testFun=function()print("NIHAO")end
}
//C#
public class CallLuaClass
{//在类中去生命成员变量,名字要和lua那边一样//注意,。一定是公有的,不然不能赋值。//这个自定义中的变量可以多也可以少public int testInt;public bool testBool;public float testFloat;public string testString;public UnityAction testFun;//方法
}
public class Lesson7_Table : MonoBehaviour
{private void Start(){LuaMgr.Instance.Init();LuaMgr.Instance.DoLuaFile("Main");CallLuaClass callLuaClass = LuaMgr.Instance.Gloabl.Get<CallLuaClass>("testClas");Debug.Log(callLuaClass.testString);callLuaClass.testFun();}
}
8、接口映射table
注意接口是引用拷贝。改了值后,lua值也会改变
//接口中不允许有成员变量
//我们用属性
[CSharpCallLua]
public interface ICSharpCallInterface
{int testInt { get; set; }bool testBool { get; set; }float testFloat { get; set; }string testString { get; set; }UnityAction testFun { get; set; }
}public class Lesson_Interface : MonoBehaviour
{void Start(){LuaMgr.Instance.Init();LuaMgr.Instance.DoLuaFile("Main");ICSharpCallInterface callInterface = LuaMgr.Instance.Gloabl.Get<ICSharpCallInterface>("testClas");Debug.Log(callInterface.testFloat);}
}
9、luatable映射到table
//不过官方不建议使用luaTable和luaFunctionvoid Start(){LuaMgr.Instance.Init();LuaMgr.Instance.DoLuaFile("Main");LuaTable table = LuaMgr.Instance.Gloabl.Get<LuaTable>("testClas");Debug.Log(table.Get<int>("testInt"));table.Get<LuaFunction>("testFun").Call();table.Dispose();//使用完了dispose }
2、lua调用C#(重点)
用的较多。
1、Lua使用C#类
print("************Lua调用C#相关知识点*************")
-- lua中使用C#的类非常简单
-- 固定套路
-- Cs.命名空间.类名
-- Unity的类,比如GameObject Transform等等 ---CS.UnityEngine.类名-- 通过C#中的类,实例化一个对象,注意lua中没有new
-- 默认调用的相当于无参构造
local obj1 = CS.UnityEngine.GameObject()
local obj2 = CS.UnityEngine.GameObject("郑毅")-- 为了方便使用,并且节约性能,定义全局变量储存C#中的类
-- 相当于取了一个别名,这也是一种优化方式
GameObject = CS.UnityEngine.GameObject
local obj3 = GameObject("第三个")-- 类中的静态对象可以直接使用 .来调用
local obj4 = GameObject.Find("郑毅")
--得到对象中的成员变量,直接对象.就可以了
print(obj4.transform.position)
Vector3 = CS.UnityEngine.Vector3;
--使用对象中的成员方法,一定要加:
obj4.transform:Translate(Vector3.right)
print(obj4.transform.position)-- 调用自定义的类
local t = CS.Test()
t:Speak("你好")
--有命名空间的
local t = CS.MyClass.Test2()
t:Speak("你好")--继承mono的类
--继承mono的类是不能直接new的
--lua不支持使用无惨的泛型的
local obj5 = GameObject("加脚本测试")
-- Xlua提供了一个重要防范typeof 可以得到类的类型
obj5:AddComponent(typeof(CS.LuaCallC))
---- c#
public class Test
{public void Speak(string str){Debug.Log("test1"+str);}
}namespace MyClass
{public class Test2{public void Speak(string str){Debug.Log("test2"+str);}}
}
public class LuaCallC : MonoBehaviour
{}
2、枚举
PrimitiveType = CS.UnityEngine.PrimitiveType
GameObject = CS.UnityEngine.GameObject
local obj = GameObject.CreatePrimitive(PrimitiveType.Cube)---获取自定义美剧
myEnum=CS.MyEnum
local c=myEnum.Idle
print(c)
--枚举转换
--数值转枚举
local a=myEnum.__CastFrom(1)
print(a)
--字符串转枚举
local b=myEnum.__CastFrom("Atk ")
print(b)
3、调用C#数组和list和字典
public class Lesson
{public int[] array = new int[5] { 1, 2, 3, 4, 5 };public List<int> list = new List<int>();public Dictionary<int, string> dic = new Dictionary<int, string>();
}
local obj = CS.Lesson()
-- Lua使用数组相关知识
-- 长度
print(obj.array.Length)
print(obj.array[2])
--遍历,虽然lua索引是从1开始
--但是要按照C#来,从0开始
for i = 0, obj.array.Length - 1 doprint(obj.array[i])
end--创建数组 数组的底层是array类,使用静态方法CreateInstance
local array2 = CS.System.Array.CreateInstance(typeof(CS.System.Int32), 10)
print(array2.Length)---list
obj.list:Add(10)
obj.list:Add(20)
obj.list:Add(30)
obj.list:Add(40)for i = 0, obj.list.Count - 1 doprint(obj.list[i])
end
--创建list 相当于得到一个List<int>的一个类的别名,需要再实例化
local list_string = CS.System.Collections.Generic.List(CS.System.Int32)
local list3 = list_string()
list3:Add(50)
print(list3.Count)
print(list3[0])--- 字典
obj.dic:Add(1, "你好")
print(obj.dic[1])for k, v in pairs(obj.dic) doprint(k, v)
end--创建字典
local dicString=CS.System.Collections.Generic.Dictionary(CS.System.String,CS.UnityEngine.Vector3)
local dic2=dicString()
dic2:Add("001",CS.UnityEngine.Vector3.right)print(dic2["001"])---这里有个坑,自己创建的字典,这样是访问不到的
print(dic2:get_Item("001")) --只有通过这种方法才可以
dic2:set_Item("001",CS.UnityEngine.Vector3.up)
print(dic2:get_Item("001")) --只有通过这种方法才可以
print(dic2:TryGetValue("001"))--多返回值
4、拓展方法
//拓展方法
//拓展方法的写法
//想要在lua中使用拓展方法,一定要在工具类前面加上特性
//如果不加该特性,除了拓展方法以外,都不会报错
//但是lua是通过反射机制去调用C#类的,效率较低
//加上可提高性能
[LuaCallCSharp]
public static class Tools
{public static void Move(this Lesson4 obj){Debug.Log(obj.name+"移动");}
}
public class Lesson4
{public string name = "名称";public void Speak(string str){Debug.Log(str);}public static void Eat(){Debug.Log("吃东西");}
}
public class LuaCallC : MonoBehaviour
{private void Start(){Lesson4 lesson4 = new Lesson4();lesson4.Move();//拓展方法,对象可以直接调用}
}
Lesson4 = CS.Lesson4
Lesson4.Eat()
--成员方法
local a = Lesson4()
a:Speak("说话了啊")
--使用拓展方法
a:Move()
5、ref out
public class Lesson5
{public int RefFun(int a,ref int b,ref int c,int d){b = a + d;c = a - d;return 100;}public int OutFun(int a,out int b,out int c,int d){b = a;c = d;return 200;}public int RefOutFun(int a,out int b,ref int c){b = a * 10;c = a * 20;return 300;}
}
Lesson5 = CS.Lesson5
local obj = Lesson5()--ref 参数会以多返回值的形式返回给lua
local a, b, c = obj:RefFun(1, 0, 0, 1)
print(a)
print(b)
print(c)--out 参数会以多返回值的形式返回给lua
--out参数不需要传占位置的值
local a, b, c = obj:OutFun(1, 30)
print(a)
print(b)
print(c)--综合起来
-- out不用占位值 ref需要占位
local a, b, c = obj:OutFun(1, 30)
print(a)
print(b)
print(c)
6、C#函数重载
public class Lesson6
{public int Cal(){return 100;}public int Cal(int a,int b){return a + b;}public int Cal(int a){return a;}public float Cal(float a){return a;}
}
Lesson6 = CS.Lesson6
local obj = Lesson6()print(obj:Cal())
print(obj:Cal(1))
print(obj:Cal(15,20))
--对于C#中多精度的重载函数支持不好
print(obj:Cal(1.25))--如果要解决重载函数模糊不清的问题
--xlua提供了解决方案,反射机制,但这种方法只做了解
--另外,能不用就不用
local m2 = typeof(CS.Lesson6):GetMethod("Cal", { typeof(CS.System.Single) })
--通过xlua提供的一个方法,把它转换成lua函数来使用。
--一般我们转一次,然后重复使用
local f2 = xlua.tofunction(m2)
print(f2(obj,10.2))
7、委托 事件
public class Lesson8
{public UnityAction del;public event UnityAction eventAction;public void DoEvent(){if (eventAction != null) eventAction();}
}
Lesson8 = CS.Lesson8
local obj = Lesson8()-- 委托
local func=function()print("这是lua函数")
end
-- 注意lua没有复合运算符,没有+=
-- 如果第一次往委托中加函数,因为是niu 不能直接+
-- 所以第一次 要先等=
obj.del=func
--第二次可以
obj.del=obj.del+func
obj.del()
--委托清除
obj.del=nil---事件,事件和委托特别不一样
---有点类似于成员方法
obj:eventAction("+",func)
obj:DoEvent()
--事件不能直接设置为空
8、二维数组
使用GetValue获取
[LuaCallCSharp]
public class Book : MonoBehaviour
{public int[,] INTArray;void Awake(){INTArray = new int[3, 3]{{1,2,3},{2,4,5},{6,7,8}};}public int GetArrayValue(int x,int y){return INTArray[x, y];}public void SetArrayValue(int x,int y,int value){INTArray[x, y] = value;}
}local book = CS.Book
local go = GameObject("二维数组")local obj = go:AddComponent(typeof(book))-- 调用 GetArrayValue 方法
local c = obj:GetArrayValue(1, 1)
print(c)
9、nil
PrimitiveType=CS.UnityEngine.PrimitiveType
Rigidbody=CS.UnityEngine.Rigidbody
local GameObject = CS.UnityEngine.GameObject;
local obj = GameObject("Cube")
local obj2 = GameObject.CreatePrimitive(PrimitiveType.Cube)
local rig = obj2:GetComponent(typeof(Rigidbody))
-- nil和Null没法进行 == 比较
if rig == nil thenprint("空啊")
end
print("不为空吗")--可用这样
if rig:Equals(nil) thenobj2:AddComponent(typeof(Rigidbody))
end
-- 全局函数
print(IsNull(rig))
-- 在C#中
print(rig:Equ())
-- 判断全局函数
function IsNull(obj)if obj==nil or obj:Equals(nil) thenreturn trueendreturn false
end
10、C# 扩展方法
[LuaCallCSharp]
public static class ObjTest
{public static bool Equ(this Object obj){return obj==null;}
}
11、特殊问题
CSharpCallLua :委托、接口
LuaCallCSharp:拓展方法时、建议每个类都加
无法为系统类或者第三方库代码加上这两个特性
Obj = CS.UnityEngine.GameObject
Ui = CS.UnityEngine.UI
local sid=Obj.Find("Slider")
local sliders=sid:GetComponent(typeof(Ui.Slider))
sliders.onValueChanged:AddListener(function(f)print("你好")
end)---------------------------------------------------------------
public static class Lesson10
{[CSharpCallLua]public static List<Type> cSharpCallLua = new List<Type>(){typeof(UnityAction<float>)};[LuaCallCSharp]public static List<Type> luaCallCSharp=new List<Type>(){typeof(GameObject)};
}
----------------------------------------------------------------
local ani=Obj.Find("Btn")
local btn=ani:GetComponent(typeof(Ui.Button))
btn.onClick:AddListener(function()print("鼠标点击了")
end)---还可以这样
local c=CS.UnityEngine.Events.UnityAction(function()print("鼠标点击了")
end)
12、协程
--xlua提供的一个工具表,一定要通过require调用后才能用
local util=require('xlua.util')
GameObject = CS.UnityEngine.GameObject
WaitForSeconds = CS.UnityEngine.WaitForSeconds
--在场景中创建一个空物体,然后添加一个脚本
local obj = GameObject("Coroutine")
local mono = obj:AddComponent(typeof(CS.LuaCallC))
--希望用来被开启的协程函数
fun = function()local a = 1while true docoroutine.yield(WaitForSeconds(1))print(a)a = a + 1if a>10 then--关闭协程mono:StopCoroutine(b)endend
end
--我们不能直接将lua函数传入到开启协程中
--如果要把lua函数当做协程函数传入
--必须先调用xlua.util 中的cs_generator(fun)
b=mono:StartCoroutine(util.cs_generator(fun))
13、泛型
支持有约束有参数的泛型函数
不支持没有约束的泛型番薯
不支持有约束,但是没有参数的泛型函数
不支持非Class的约束
public class Lesson12
{public class TestFather{}public class TestChild:TestFather{}public void TestFun1<T>(T a,T b) where T:TestFather{Debug.Log("有参数有约束的泛型方法");}public void TestFun2<T>(T a,T b) {Debug.Log("有参数无约束的泛型方法");}public void TestFun3<T>(T a) {Debug.Log("有参数");}public void TestFun3<T>() where T:TestFather{Debug.Log("有参数");} }
local obj=CS.Lesson12()
local child=CS.Lesson12.TestChild()
local father=CS.Lesson12.TestFather()------------默认情况下支持----------
--支持有约束有参数的泛型函数
obj:TestFun1(child,father)
-----------------------------------注意 如果是mono 这种方式支持使用
--但是如果是iLcpp打包 泛型参数是引用类型才可以--要使得可用用
--设置泛型类型再使用
local testFun2=xlua.get_generic_method(CS.Lesson12,"TestFun3")
local testFun2_R=testFun2(CS.System.Int32)
--调用
testFun2_R(obj,10)--设置泛型类型再使用
local testFun3=xlua.get_generic_method(CS.Lesson12,"TestFun2")
local testFun3_R=testFun3(CS.System.Int32)
--调用
testFun3_R(obj,10,20)相关文章:
Unity开发游戏使用XLua的基础
Unity使用Xlua的常用编码方式,做一下记录 1、C#调用lua 1、Lua解析器 private LuaEnv env new LuaEnv();//保持它的唯一性void Start(){env.DoString("print(你好lua)");//env.DoString("require(Main)"); 默认在resources文件夹下面//帮助…...
AI-ISP论文Learning to See in the Dark解读
论文地址:Learning to See in the Dark 图1. 利用卷积网络进行极微光成像。黑暗的室内环境。相机处的照度小于0.1勒克斯。索尼α7S II传感器曝光时间为1/30秒。(a) 相机在ISO 8000下拍摄的图像。(b) 相机在ISO 409600下拍摄的图像。该图像存在噪点和色彩偏差。©…...
OpenCV:开运算
目录 1. 简述 2. 用腐蚀和膨胀实现开运算 2.1 代码示例 2.2 运行结果 3. 开运算接口 3.1 参数详解 3.2 代码示例 3.3 运行结果 4. 开运算应用场景 5. 注意事项 6. 总结 相关阅读 OpenCV:图像的腐蚀与膨胀-CSDN博客 OpenCV:闭运算-CSDN博客 …...
38. RTC实验
一、RTC原理详解 1、6U内部自带到了一个RTC外设,确切的说是SRTC。6U和6ULL的RTC内容在SNVS章节。6U的RTC分为LP和HP。LP叫做SRTC,HP是RTC,但是HP的RTC掉电以后数据就丢失了,即使用了纽扣电池也没用。所以必须要使用LP,…...
Flutter 新春第一弹,Dart 宏功能推进暂停,后续专注定制数据处理支持
在去年春节,Flutter 官方发布了宏(Macros)编程的原型支持, 同年的 5 月份在 Google I/O 发布的 Dart 3.4 宣布了宏的实验性支持,但是对于 Dart 内部来说,从启动宏编程实验开始已经过去了几年,但…...
巴菲特价值投资思想的核心原则
巴菲特价值投资思想的核心原则 关键词:安全边际、长期投资、内在价值、管理团队、经济护城河、简单透明 摘要:本文深入探讨了巴菲特价值投资思想的核心原则,包括安全边际、长期投资、企业内在价值、优秀管理团队、经济护城河和简单透明的业务…...
C 或 C++ 中用于表示常量的后缀:1ULL
1ULL 是一个在 C 或 C 中用于表示常量的后缀,它具体指示编译器将这个数值视为特定类型的整数。让我们详细解释一下: 1ULL 的含义 1: 这是最基本的部分,表示数值 1。U: 表示该数值是无符号(Unsigned)的。这意味着它只…...
vue3中el-input无法获得焦点的问题
文章目录 现象两次nextTick()加setTimeout()解决结论 现象 el-input被外层div包裹了,设置autofocus不起作用: <el-dialog v-model"visible" :title"title" :append-to-bodytrue width"50%"><el-form v-model&q…...
程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<3>
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 今天我们来对上一节做一些小补充,了解学习一下assert断言,指针的使用和传址调用…...
(三)QT——信号与槽机制——计数器程序
目录 前言 信号(Signal)与槽(Slot)的定义 一、系统自带的信号和槽 二、自定义信号和槽 三、信号和槽的扩展 四、Lambda 表达式 总结 前言 信号与槽机制是 Qt 中的一种重要的通信机制,用于不同对象之间的事件响…...
Qt 5.14.2 学习记录 —— 이십이 QSS
文章目录 1、概念2、基本语法3、给控件应用QSS设置4、选择器1、子控件选择器2、伪类选择器 5、样式属性box model 6、实例7、登录界面 1、概念 参考了CSS,都是对界面的样式进行设置,不过功能不如CSS强大。 可通过QSS设置样式,也可通过C代码…...
Hot100之哈希
1两数之和 题目 思路解析 解法1--两次循环 解法2--哈希表一次循环 代码 解法1--两次循环 class Solution {public int[] twoSum(int[] nums, int target) {int nums1[] new int[2];int length nums.length;for (int i 0; i < length; i) {for (int j i 1; j < …...
油漆面积——蓝桥杯
1.题目描述 X 星球的一批考古机器人正在一片废墟上考古。 该区域的地面坚硬如石、平整如镜。 管理人员为方便,建立了标准的直角坐标系。 每个机器人都各有特长、身怀绝技。它们感兴趣的内容也不相同。 经过各种测量,每个机器人都会报告一个或多个矩…...
深度解析:网站快速收录与服务器性能的关系
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/37.html 网站快速收录与服务器性能之间存在着密切的关系。服务器作为网站运行的基础设施,其性能直接影响到搜索引擎对网站的抓取效率和收录速度。以下是对这一关系的深度解析&am…...
925.长按键入
目录 一、题目二、思路三、解法四、收获 一、题目 你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。 你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字&am…...
JavaScript 中的 var 和 let :关键区别与使用建议
在 JavaScript 开发中,变量声明是基础且重要的部分。 var 和 let 都是用于声明变量的关键字,但它们在作用域、变量提升、重复声明等方面存在显著差异。本文将详细探讨它们的区别,并给出使用建议。 1. 作用域 1.1 var 的作用域 …...
寒假刷题Day19
一、923. 三数之和的多种可能 class Solution { public:int threeSumMulti(vector<int>& arr, int target) {const int MOD 1000000007; // 正确的模数long long ans 0; // 使用 long long 防止溢出std::sort(arr.begin(), arr.end());for (size_t i 0; i < a…...
写好简历的三个关键认知
在当今竞争激烈的就业市场中,一份优秀的简历往往是敲开理想企业大门的第一把钥匙。然而,很多求职者在写简历时往往不得要领,让宝贵的机会从指间溜走。今天,让我们一起探讨如何提升简历写作水平,让你的职业之路走得更顺…...
工具的应用——安装copilot
一、介绍Copilot copilot是一个AI辅助编程的助手,作为需要拥抱AI的程序员可以从此尝试进入,至于好与不好,应当是小马过河,各有各的心得。这里不做评述。重点在安装copilot的过程中遇到了一些问题,然后把它总结下&…...
Koa 基础篇(二)—— 路由与中间件
let app new Koa() router.get(“/”,async ctx > { ctx.body “hello koa router” }) app.use(router.routes()) app.use(router.allowedMethods()) app.listen(3000) 运行项目,在浏览器访问本地3000端口,在页面上就会看到输出的语句。这就…...
探秘书匠策AI:毕业论文写作的“智慧锦囊”大公开!
在学术的广阔天地里,毕业论文如同一座巍峨的山峰,让无数攀登者既敬畏又向往。它不仅是对我们多年学习成果的检验,更是通往学术殿堂的必经之路。然而,面对这座山峰,许多人常常感到无从下手,甚至望而却步。别…...
人脸识别OOD模型真实效果:会议直播截图中关键人物人脸的OOD分标注集
人脸识别OOD模型真实效果:会议直播截图中关键人物人脸的OOD分标注集 1. 引言:为什么需要人脸识别OOD模型? 在日常的人脸识别应用中,我们经常会遇到这样的问题:上传的图片质量参差不齐,有些图片模糊不清&a…...
vuejs-datepicker高亮日期完全指南:打造智能日历体验
vuejs-datepicker高亮日期完全指南:打造智能日历体验 【免费下载链接】vuejs-datepicker A simple Vue.js datepicker component. Supports disabling of dates, inline mode, translations 项目地址: https://gitcode.com/gh_mirrors/vu/vuejs-datepicker v…...
Pagefind静态搜索库:10个关键技巧实现大规模网站的高效低带宽搜索
Pagefind静态搜索库:10个关键技巧实现大规模网站的高效低带宽搜索 【免费下载链接】pagefind Static low-bandwidth search at scale 项目地址: https://gitcode.com/gh_mirrors/pa/pagefind Pagefind是一款革命性的静态搜索库,专为大规模网站设计…...
别再纠结选哪个了!手把手教你根据项目需求选对Go框架:Gin、Kratos还是Zero?
实战指南:如何为你的Go项目精准匹配框架——Gin、Kratos与Zero深度解析 当启动一个新项目时,选择正确的框架往往决定了后续开发的顺畅程度。面对Gin、Kratos和Zero这三个主流Go框架,很多开发者会陷入选择困难。本文将带你从实际项目需求出发&…...
别再让Pandas数据在Pycharm里‘隐身’了!一个设置搞定DataFrame显示不全
彻底解决Pandas DataFrame在PyCharm中的显示难题:从原理到实战 刚接触数据分析的朋友们,你们是否经常在PyCharm中遇到这样的困扰:当你满怀期待地打印出一个DataFrame,准备仔细查看数据时,却发现屏幕上布满了恼人的省略…...
高压输电线路智能监测系统设计与实现
1. 项目背景与需求分析高压输电线路作为电力系统的"大动脉",其稳定运行直接关系到整个电网的安全。我在电力行业工作多年,亲眼见过多次因间隔棒故障导致的线路跳闸事故。传统的人工巡检方式存在明显短板:巡检周期长(通常…...
5分钟上手libhv:用自带httpd和curl工具快速搭建本地测试服务
5分钟实战libhv:零配置构建高效本地HTTP测试环境 第一次听说libhv时,我正被一个紧急的前后端联调任务逼得焦头烂额。当时需要快速搭建一个模拟API服务,但Node.js环境配置卡在了权限问题上,Python的SimpleHTTPServer又无法满足复杂…...
Shell应用手册(一) 3.Linux环境搭建全攻略:虚拟机/云服务器/本地容器三种方式全覆盖
对于程序员、运维工程师或Linux学习者而言,搭建一个稳定、高效的Linux环境是开展工作和学习的基础。目前主流的搭建方式主要有三种:虚拟机(适合本地学习练手)、云服务器(适合线上部署、远程访问)、本地容器…...
Python 3.14 JIT性能调优黄金三角:类型特化×循环展开×GC协同策略(附真实Web服务QPS从1.8K→3.4K压测报告)
第一章:Python 3.14 JIT编译器演进与性能调优全景图Python 3.14 引入了实验性但高度可配置的内置 JIT 编译器(代号“Torchlight”),标志着 CPython 首次在标准发行版中集成轻量级、函数粒度的即时编译能力。该 JIT 并非替代解释器…...
