【Lua】xLua逻辑热更新

news2024/9/22 15:51:36

1 前言

        Lua基础语法 中系统介绍了 Lua 的语法体系,ToLua逻辑热更新 中介绍了 ToLua 的应用,本文将进一步介绍 Unity3D 中基于 xLua 实现逻辑热更新。

        逻辑热更新是指:在保持程序正常运行的情况下,在后台修改代码逻辑,修改完成并推送到运行主机上,主机无缝接入更新后的代码逻辑。Unity3D 中,基于 Lua 的逻辑热更新方案主要有 ToLua、xLua、uLua、sLua,本文将介绍 xLua 逻辑热更新方案。

        1)热更新的好处

  • 不用浪费流量重新下载;
  • 不用通过商店审核,版本迭代更加快捷;
  • 不用重新安装,用户可以更快体验更新的内容

         2)xLua 插件下载

        xLua 是腾讯研发的 Unity3D 逻辑热更新方案,目前已开源,资源见:

  • github:https://github.com/Tencent/xLua
  • gitcode:https://gitcode.net/mirrors/Tencent/xlua

        3)xLua 插件导入

        将插件的 Assets 目录下的所有文件拷贝到项目的 Assets 目录下,如下:

        4)生成 Wrap 文件

        导入插件后,菜单栏会多一个 XLua 窗口,点击 Generate Code 会生成一些 Wrap 文件,生成路径见【Assets\XLua\Gen】,这些 Wrap 文件是 C# 与 Lua 沟通的桥梁。每次生成文件时,建议先点击下 Clear Generate Code,再点击 Generate Code。

        5)官方教程文档

        在【Assets\XLua\Doc\XLua教程.doc】中可以查阅官方教程文档,在线教程文档见:

  • github:https://github.com/Tencent/xLua/tree/master/Assets/XLua/Doc/XLua教程.md
  • gitcode:https://gitcode.net/mirrors/Tencent/xLua/tree/master/Assets/XLua/Doc/XLua教程.md

        6)官方Demo

2 xLua 应用

2.1 C# 中执行 Lua 代码串

        HelloWorld.cs

using UnityEngine;
using XLua;

public class HelloWorld : MonoBehaviour {
    private void Start() {
        LuaEnv luaEnv = new LuaEnv();
        string luaStr = @"print('Hello World')
            CS.UnityEngine.Debug.Log('Hello World')";
        luaEnv.DoString(luaStr);
        luaEnv.Dispose();
    }
}

        运行如下:

        说明:第一个日志是 lua 打印的,所以有 "LUA: " 标识,第二个日志是 Lua 调用 C# 的 Debug 方法,所以没有 "LUA: " 标识。

2.2 C# 中调用 Lua 文件

        1)通过 Resources.Load 加载 lua 文件

         ScriptFromFile.cs

using UnityEngine;
using XLua;

public class ScriptFromFile : MonoBehaviour {
    private void Start() {
        LuaEnv luaEnv = new LuaEnv();
        TextAsset textAsset = Resources.Load<TextAsset>("02/LuaScript.lua");
        luaEnv.DoString(textAsset.text);
        luaEnv.Dispose();
    }
}

        LuaScript.lua.txt

print("Load lua script")

        说明:LuaScript.lua.txt 文件放在 【Assets\Resources\02】目录下。因为 Resource 只支持有限的后缀,放 Resources 下的 lua 文件得加上 txt 后缀。

        2)通过内置 loader 加载 lua 文件

        ScriptFromFile.cs

using UnityEngine;
using XLua;

public class ScriptFromFile : MonoBehaviour {
    private void Start() {
        LuaEnv luaEnv = new LuaEnv();
        luaEnv.DoString("require '02/LuaScript'");
        luaEnv.Dispose();
    }
}

        说明:require 实际上是调一个个的 loader 去加载,有一个成功就不再往下尝试,全失败则报文件找不到。 目前 xLua 除了原生的 loader 外,还添加了从 Resource 加载的 loader。因为 Resource 只支持有限的后缀,放 Resources 下的 lua 文件得加上 txt 后缀。 

        3)通过自定义 loader 加载 lua 文件

        ScriptFromFile.cs

using UnityEngine;
using XLua;
using System.IO;
using System.Text;

public class ScriptFromFile : MonoBehaviour {
    private void Start() {
        LuaEnv luaEnv = new LuaEnv();
        luaEnv.AddLoader(MyLoader);
        luaEnv.DoString("require '02/LuaScript'");
        luaEnv.Dispose();
    }

    private byte[] MyLoader(ref string filePath) {
        string path = Application.dataPath + "/Resources/" + filePath + ".lua.txt";
        string txt = File.ReadAllText(path);
        return Encoding.UTF8.GetBytes(txt);
    }
}

2.3 C# 中调用 Lua 变量

        AccessVar.cs

using UnityEngine;
using XLua;

public class AccessVar : MonoBehaviour {
    private LuaEnv luaEnv;

    private void Start() {
        luaEnv = new LuaEnv();
        luaEnv.DoString("require '03/LuaScript'");
        TestAccessVar();
    }

    private void TestAccessVar() {
        bool a = luaEnv.Global.Get<bool>("a");
        int b = luaEnv.Global.Get<int>("b");
        float c = luaEnv.Global.Get<float>("c");
        string d = luaEnv.Global.Get<string>("d");
        Debug.Log("a=" + a + ", b=" + b + ", c=" + c + ", d=" + d); // a=True, b=10, c=7.8, d=xxx
    }

    private void OnApplicationQuit() {
        luaEnv.Dispose();
        luaEnv = null;
    }
}

        LuaScript.lua.txt

a = true
b = 10
c = 7.8
d = "xxx"

2.4 C# 中调用 Lua table

        1)通过自定义类映射 table

        AccessTable.cs

using UnityEngine;
using XLua;

public class AccessTable : MonoBehaviour {
    private LuaEnv luaEnv;

    private void Start() {
        luaEnv = new LuaEnv();
        luaEnv.DoString("require '04/LuaScript'");
        TestAccessTable();
    }

    private void TestAccessTable() {
        Student stu = luaEnv.Global.Get<Student>("stu");
        Debug.Log("name=" + stu.name + ", age=" + stu.age); // name=zhangsan, age=23
        stu.name = "lisi";
        luaEnv.DoString("print(stu.name)"); // LUA: zhangsan
    }

    private void OnApplicationQuit() {
        luaEnv.Dispose();
        luaEnv = null;
    }
}

class Student {
    public string name;
    public int age;
}

        LuaScript.lua.txt

stu = {name = "zhangsan", age = 23, sex = 0, 1, 2, 3}

        说明:允许 table 中元素个数与自定义类中属性个数不一致,允许自定义类中属性顺序与 table 中元素顺序不一致;类中需要映射的属性名必须与 table 中相应元素名保持一致(大小写也必须一致);修改映射类的属性值,不影响 table 中相应元素的值

        2)通过自定义接口映射 table

        AccessTable.cs

using UnityEngine;
using XLua;

public class AccessTable : MonoBehaviour {
    private LuaEnv luaEnv;

    private void Start() {
        luaEnv = new LuaEnv();
        luaEnv.DoString("require '04/LuaScript'");
        TestAccessTable();
    }

    private void TestAccessTable() {
        IStudent stu = luaEnv.Global.Get<IStudent>("stu");
        Debug.Log("name=" + stu.name + ", age=" + stu.age); // name=zhangsan, age=23
        stu.name = "lisi";
        luaEnv.DoString("print(stu.name)"); // LUA: lisi
        stu.study("program"); // LUA: subject=program
        stu.raiseHand("right"); // LUA: hand=right
    }

    private void OnApplicationQuit() {
        luaEnv.Dispose();
        luaEnv = null;
    }
}

[CSharpCallLua]
public interface IStudent {
    public string name {get; set;}
    public int age {get; set;}
    public void study(string subject);
    public void raiseHand(string hand);
}

        说明:在运行脚本之前,需要先点击下 Clear Generate Code,再点击 Generate Code;允许 table 中元素个数与自定义接口中属性个数不一致,允许自定义接口中属性顺序与 table 中元素顺序不一致;接口中需要映射的属性名和方法名必须与 table 中相应元素名和函数名保持一致(大小写也必须一致);修改映射接口的属性值,会影响 table 中相应元素的值

        LuaScript.lua.txt

stu = {
    name = "zhangsan",
    age = 23,
    study = function(self, subject)
        print("subject="..subject)
    end
}

--function stu.raiseHand(self, hand)
function stu:raiseHand(hand)
    print("hand="..hand)
end

        3)通过 Dictionary 映射 table

         AccessTable.cs

using System.Collections.Generic;
using UnityEngine;
using XLua;

public class AccessTable : MonoBehaviour {
    private LuaEnv luaEnv;

    private void Start() {
        luaEnv = new LuaEnv();
        luaEnv.DoString("require '04/LuaScript'");
        TestAccessTable();
    }

    private void TestAccessTable() {
        Dictionary<string, object> stu = luaEnv.Global.Get<Dictionary<string, object>>("stu");
        Debug.Log("name=" + stu["name"] + ", age=" + stu["age"]); // name=zhangsan, age=23
        stu["name"] = "lisi";
        luaEnv.DoString("print(stu.name)"); // LUA: zhangsan
    }

    private void OnApplicationQuit() {
        luaEnv.Dispose();
        luaEnv = null;
    }
}

        说明:修改映射 Dictionary 的元素值,不影响 table 中相应元素的值

        LuaScript.lua.txt

stu = {name = "zhangsan", age = 23, "math", 2, true}

       4)通过 List 映射 table

         AccessTable.cs

using System.Collections.Generic;
using UnityEngine;
using XLua;

public class AccessTable : MonoBehaviour {
    private LuaEnv luaEnv;

    private void Start() {
        luaEnv = new LuaEnv();
        luaEnv.DoString("require '04/LuaScript'");
        TestAccessTable();
    }

    private void TestAccessTable() {
        List<object> list = luaEnv.Global.Get<List<object>>("stu");
        string str = "";
        foreach(var item in list) {
            str += item + ", ";
        }
        Debug.Log(str); // math, 2, True, 
    }

    private void OnApplicationQuit() {
        luaEnv.Dispose();
        luaEnv = null;
    }
}

        LuaScript.lua.txt

stu = {name = "zhangsan", age = 23, "math", 2, true}

        5)通过 LuaTable 映射 table

        AccessTable.cs

using UnityEngine;
using XLua;

public class AccessTable : MonoBehaviour {
    private LuaEnv luaEnv;

    private void Start() {
        luaEnv = new LuaEnv();
        luaEnv.DoString("require '04/LuaScript'");
        TestAccessTable();
    }

    private void TestAccessTable() {
        LuaTable table = luaEnv.Global.Get<LuaTable>("stu");
        Debug.Log("name=" + table.Get<string>("name") + ", age=" + table.Get<int>("age")); // name=zhangsan, age=23
        table.Set<string, string>("name", "lisi");
        luaEnv.DoString("print(stu.name)"); // LUA: lisi
        table.Dispose();
    }

    private void OnApplicationQuit() {
        luaEnv.Dispose();
        luaEnv = null;
    }
}

        说明:修改映射 LuaTable 的属性值,会影响 table 中相应元素的值 

        LuaScript.lua.txt

stu = {name = "zhangsan", age = 23, "math", 2, true}

2.5 C# 中调用 Lua 全局函数

        1)通过 delegate 映射 function

        AccessFunc.cs

using System;
using UnityEngine;
using XLua;

public class AccessFunc : MonoBehaviour {
    private LuaEnv luaEnv;

    [CSharpCallLua] // 需要设置 public, 并且点击 Generate Code
    public delegate int MyFunc1(int arg1, int arg2);
    [CSharpCallLua] // 需要设置 public, 并且点击 Generate Code
    public delegate int MyFunc2(int arg1, int arg2, out int resOut);
    [CSharpCallLua] // 需要设置 public, 并且点击 Generate Code
    public delegate int MyFunc3(int arg1, int arg2, ref int resRef);

    private void Start() {
        luaEnv = new LuaEnv();
        luaEnv.DoString("require '05/LuaScript'");
        TestAccessFunc1();
        TestAccessFunc2();
        TestAccessFunc3();
        TestAccessFunc4();
    }

    private void TestAccessFunc1() { // 测试无参函数
        Action func1 = luaEnv.Global.Get<Action>("func1");
        func1(); // LUA: func1
    }

    private void TestAccessFunc2() { // 测试有参函数
        Action<string> func2 = luaEnv.Global.Get<Action<string>>("func2");
        func2("xxx"); // LUA: func2, arg=xxx
    }

    private void TestAccessFunc3() { // 测试有返回值函数
        MyFunc1 func3 = luaEnv.Global.Get<MyFunc1>("func3");
        Debug.Log(func3(2, 3)); // 6
    }

    private void TestAccessFunc4() { // 测试有多返回值函数
        MyFunc1 func41 = luaEnv.Global.Get<MyFunc1>("func4");
        Debug.Log(func41(2, 3)); // 5

        int res, resOut;
        MyFunc2 func42 = luaEnv.Global.Get<MyFunc2>("func4");
        res = func42(2, 3, out resOut);
        Debug.Log("res=" + res + ", resOut=" + resOut); // res=5, resOut=-1

        int ans, resRef = 0;
        MyFunc3 func43 = luaEnv.Global.Get<MyFunc3>("func4");
        ans = func43(2, 3, ref resRef);
        Debug.Log("ans=" + ans + ", resRef=" + resRef); // res=5, resRef=-1
    }

    private void OnApplicationQuit() {
        luaEnv.Dispose();
        luaEnv = null;
    }
}

        说明:Lua 函数支持多返回值,但 C# 函数不支持多返回值,要想让 C# 接收 Lua 函数的多个返回值,需要通过 out 或 ref 参数接收第 2 个及之后的返回值

        LuaScript.lua.txt

--无参函数
function func1()
    print("func1")
end

--有参函数
function func2(arg)
    print("func2, arg="..arg)
end

--有返回值函数
function func3(a, b)
    return a * b
end

--有多返回值函数
function func4(a, b)
    return a + b, a - b
end

        2)通过 LuaFunction 映射 function

        AccessFunc.cs 

using UnityEngine;
using XLua;

public class AccessFunc : MonoBehaviour {
    private LuaEnv luaEnv;

    private void Start() {
        luaEnv = new LuaEnv();
        luaEnv.DoString("require '05/LuaScript'");
        TestAccessFunc1();
        TestAccessFunc2();
        TestAccessFunc3();
        TestAccessFunc4();
    }

    private void TestAccessFunc1() { // 测试无参函数
        LuaFunction func1 = luaEnv.Global.Get<LuaFunction>("func1");
        func1.Call(); // LUA: func1
    }

    private void TestAccessFunc2() { // 测试有参函数
        LuaFunction func2 = luaEnv.Global.Get<LuaFunction>("func2");
        func2.Call("xxx"); // LUA: func2, arg=xxx
    }

    private void TestAccessFunc3() { // 测试有返回值函数
        LuaFunction func3 = luaEnv.Global.Get<LuaFunction>("func3");
        object[] res = func3.Call(2, 3);
        Debug.Log(res[0]); // 6
    }

    private void TestAccessFunc4() { // 测试有多返回值函数
        LuaFunction func4 = luaEnv.Global.Get<LuaFunction>("func4");
        object[] res = func4.Call(2, 3);
        Debug.Log("res1=" + res[0] + ", res2=" + res[1]); // res1=5, res2=-1
    }

    private void OnApplicationQuit() {
        luaEnv.Dispose();
        luaEnv = null;
    }
}

        说明:LuaScript.lua.txt 同第 1)节;LuaFunction 映射方式相较 delegate 方式,性能消耗较大

2.6 Lua 中创建 GameObject 并获取和添加组件

        TestGameObject.cs

using UnityEngine;
using XLua;

public class TestGameObject : MonoBehaviour {
    private LuaEnv luaEnv;

    private void Start() {
        luaEnv = new LuaEnv();
        luaEnv.DoString("require '06/LuaScript'");
    }

    private void OnApplicationQuit() {
        luaEnv.Dispose();
        luaEnv = null;
    }
}

        LuaScript.lua.txt

local GameObject = CS.UnityEngine.GameObject
local PrimitiveType = CS.UnityEngine.PrimitiveType
local Color = CS.UnityEngine.Color
local Rigidbody = CS.UnityEngine.Rigidbody

GameObject("xxx") --创建空对象
go = GameObject.CreatePrimitive(PrimitiveType.Cube)
go:GetComponent("MeshRenderer").sharedMaterial.color = Color.red
rigidbody = go:AddComponent(typeof(Rigidbody))
rigidbody.mass = 1000

2.7 Lua 中访问 C# 自定义类

        TestSelfClass.cs

using UnityEngine;
using XLua;
 
public class TestSelfClass : MonoBehaviour {
    private LuaEnv luaEnv;
 
    private void Awake() {
        luaEnv = new LuaEnv();
        luaEnv.DoString("require '07/LuaScript'");
    }
 
    private void OnApplicationQuit() {
        luaEnv.Dispose();
        luaEnv = null;
    }
}

[LuaCallCSharp] // 需要点击 Generate Code
class Person {
    public string name;
    public int age;

    public Person(string name, int age) {
        this.name = name;
        this.age = age;
    }

    public void Run() {
        Debug.Log("run");
    }

    public void Eat(string fruit) {
        Debug.Log("eat " + fruit);
    }

    public override string ToString() {
        return "name=" + name + ", age=" + age;
    }
}

        LuaScript.lua.txt

local Person = CS.Person

person = Person("zhangsan", 23)
print("name="..person.name..", age="..person.age) -- LUA: name=zhangsan, age=23
print(person:ToString()) -- LUA: name=zhangsan, age=23
person:Run() -- run
person:Eat("aple") -- eat aple

3 Lua Hook MonoBehaviour 生命周期方法

        MonoBehaviour 生命周期方法见→MonoBehaviour的生命周期。

        TestLife.cs

using System;
using System.Collections.Generic;
using UnityEngine;
using XLua;
 
public class TestLife : MonoBehaviour {
    private LuaEnv luaEnv;
    private Dictionary<string, Action> func;
 
    private void Awake() {
        luaEnv = new LuaEnv();
        luaEnv.DoString("require '08/LuaScript'");
        GetFunc();
        CallFunc("awake");
    }
 
    private void OnEnable() {
        CallFunc("onEnable");
    }
 
    private void Start() {
        CallFunc("start");
    }
 
    private void Update() {
        CallFunc("update");
    }
 
    private void OnDisable() {
        CallFunc("onDisable");
    }
 
    private void OnDestroy() {
        CallFunc("onDestroy");
    }
 
    private void GetFunc() {
        func = new Dictionary<string, Action>();
        AddFunc("awake");
        AddFunc("onEnable");
        AddFunc("start");
        AddFunc("update");
        AddFunc("onDisable");
        AddFunc("onDestroy");
    }
 
    private void AddFunc(string funcName) {
        Action fun = luaEnv.Global.Get<Action>(funcName);
        if (fun != null) {
            func.Add(funcName, fun);
        }
    }
 
    private void CallFunc(string funcName) {
        if (func.ContainsKey(funcName)) {
            Action fun = func[funcName];
            fun();
        }
    }
 
    private void OnApplicationQuit() {
        func.Clear();
        func = null;
        luaEnv.Dispose();
        luaEnv = null;
    }
}

        LuaScript.lua.txt 

function awake()
    print("awake")
end
 
function onEnable()
    print("onEnable")
end
 
function start()
    print("start")
end
 
function update()
    print("update")
end
 
function onDisable()
    print("onDisable")
end
 
function onDestroy()
    print("onDestroy")
end

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

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

相关文章

子查询+「EXISTS」 以及 组合查询UNION ALL

目录方便的子查询及EXISTS使用子查询作为计算手段使用子查询过滤数据&#xff08;IN&#xff09;使用子查询过滤数据&#xff08;EXISTS&#xff09;组合查询UNION ALL如何使用UNION ALL合并多个结果集如何使用UNION去除集合的重复记录如何合并2个以上的结果集&#xff1f;方便…

Hudi(6):Hudi集成Spark之spark-shell 方式

目录 0. 相关文章链接 1. 启动 spark-shell 2. 插入数据 3. 查询数据 3.1. 转换成DF 3.2. 查询 3.3. 时间旅行查询 4. 更新数据 5. 增量查询 5.1. 重新加载数据 5.2. 获取指定beginTime 5.3. 创建增量查询的表 5.4. 查询增量表 6. 指定时间点查询 7. 删除数据 …

Python学习基础笔记六十二——反射2

1、 isinstanace(obj, cls) # 检查是否obj是否是类cls的对象&#xff1a; class Foo(object):passobj Foo()print(isinstance(obj, Foo)) 结果返回&#xff1a;True。 issubclass(sub, super) # 检查sub类是否是 super 类的派生类 class Foo(object):passclass Bar(F…

python详解(5)——类,类,还是类

目录 &#x1f3c6;一、前言 &#x1f3c6;二、类 &#x1f6a9;1、面向对象到底是什么 &#x1f6a9;2、数据成员and访问&#xff0c;汉堡店大升级&#xff08;超难&#xff09; &#x1f44d;①、类变量&#xff08;超难&#xff09; &#x1f44d;②、实例变量 &#x1f6a9…

A Latent Transformer for Disentangled Face Editing in Images and Videos翻译

点击下载论文 代码地址 图1 我们将真实图像投影到StyleGAN生成器的潜空间&#xff0c;并在编码的潜码上实现连续的解纠缠属性编辑。从原始图像和投影图像中&#xff0c;我们可以连续编辑一系列属性&#xff0c;例如&#xff1a;“微笑”、“刘海”、“拱形眉毛”、“年龄”、…

分布式对象存储设计原理

保存像图片、音视频这类大文件就是对象存储。不仅有很好的大文件读写性能&#xff0c;还可通过水平扩展实现近乎无限容量&#xff0c;并兼顾服务高可用、数据高可靠。 对象存储“全能”&#xff0c;主要因&#xff0c;对象存储是原生分布式存储系统&#xff0c;相对于MySQL、R…

[Linux]yum安装工具和vim编辑器

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【LINUX】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站 文…

每日一问-ChapGPT-20230101-关于新年的规划

文章目录每日一问-ChapGPT系列起因每日一问-ChapGPT-20230101-关于新年的规划优秀的人&#xff0c;新年之初做哪些规划疫情时代&#xff0c;如何更好的保护好自己有哪些运动可以提升抵抗力冥想的具体实现步骤为什么制定了年度规划但往往完成不了如何克服看手机刷视频的习惯当日…

聊聊八卦,当年的顶流明星事件是如何把公司的缓存架构“击垮”的?

V-xin&#xff1a;ruyuan0330 获得600页原创精品文章汇总PDF 目录 一、为什么要用缓存集群二、20万用户同时访问一个热点缓存的问题三、基于流式计算技术的缓存热点自动发现四、动加载为JVM本地缓存五、限流熔断保护六、总结 一、为什么要用缓存集群 这篇文章&#xff0c;咱…

数值优化之基本概念

本文ppt来自深蓝学院《机器人中的数值优化》 目录 1 推荐书单 2 优化问题的基本范式 3 数值优化在机器人领域的应用 1 推荐书单 对于英语阅读有困难的同学可以看第一本书&#xff0c;对于最优化的介绍也是比较详细的。 这是第一本书的ppt链接最优化&#xff1a;建模、算法…

【LDF】线性判别函数(三)

松弛方法 学习准则 在感知函数准则中, 目标函数中采用了 −aTy-\mathbf{a}^T \mathbf{y}−aTy 的形式。实际上有很多其它准则也可以用于感知函数的学习。线性准则 Jp(a)∑y∈Y(−aTy)J_p(\mathbf{a})\sum_{\mathbf{y} \in Y}\left(-\mathbf{a}^T \mathbf{y}\right) Jp​(a)y∈…

MP中定义全局常量用于xml的判断

1.普通方式 mybatis-plus.configuration.variables.secretFilterSwitch0 yml的方式 mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.demo configuration: variables: userId: 456132465 userName: 李四 配置完成后在代码…

NLP论文RoFormer(含源码)中文解读:具有旋转式位置嵌入的增强型transformer模型(一场相对革命)

目录 1、论文与源码2、摘要介绍3、展开解读3.1、匹配或超过了目前可用于将位置信息注入变换器的所有其他方法3.2、模型思想3.3、公式推导3.4、源码解释GPT-NeoX(PyTorch)网状变压器 JAX (JAX)4、 对比实验参考文献1、论文与源码 RoFormer匹配或超过了目前可用于将位置信息注…

分享76个PHP源码,总有一款适合您

链接&#xff1a;https://pan.baidu.com/s/1dC6_-CLs_qSyNnKEmno0Pg?pwd6666 提取码&#xff1a;6666 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 UTForum社区论坛 v2.5 响应式健身房信息展…

小波分析—— 3. 实现一个简单的Haar小波

由于小波在应用形式上与卷积很相似&#xff0c;所以如果你有需要&#xff0c;可以查看我以前写过的内容&#xff1a; 信号采样基本概念 —— 冲激函数卷积计算——1. 关于卷积的基本概念卷积计算——2. 一些常用于图像的卷积核与应用 另外常见的信号处理工具&#xff0c;傅里…

Unity脚本(三)

视频教程&#xff1a;https://www.bilibili.com/video/BV12s411g7gU?p128 目录 Time Prefab Animation Time Time.time&#xff1a;自应用程序启动以来&#xff0c;每帧的开始时间&#xff08;只读&#xff09; Time.deltaTime&#xff1a;每帧间隔&#xff0c;或说完…

SpringData

文档&#xff1a;D:\springdata SpringData是一个用来简化dao层开发的框架.在保证了各个底层存储特性同时,提供了一套统一的数据访问API.它可以很好的支持常用的关系型数据库和非关系型数据库. 使用SpringData做为dao层开发技术,将大大简化代码&#xff0c;而且其API比各个技…

【力扣周赛#326】6279.数组乘积中的不同质因数数目+6196.将字符串分割成值不超过K的子字符串+6280.范围内最接近的两个质数

目录 6278.统计能整除数字的位数 - 简单ac 6279.数组乘积中的不同质因数数目 - 质因数 6196.将字符串分割成值不超过K的子字符串 - 贪心 6280.范围内最接近的两个质数 - 质数筛 贪心 6278.统计能整除数字的位数 - 简单ac 6278. 统计能整除数字的位数 class Solution {pu…

aws codebuild 配置codecommit更新触发和squid正向代理

本文主要讨论如何通过监听codecommit仓库自动触发codebuild的构建&#xff0c;以及为codebuild配置正向代理 通过codecommit更新触发codebuild codecommit触发器相关 每个codecommit最多配置10个触发器 sns触发器 为sns创建lambda函数订阅&#xff0c;在lambda日志中查看s…

一个例题,了解包装类

下列代码输出什么,为什么? public class Test3 {public static void main(String[] args) {Integer a1 100;Integer a2 Integer.valueOf(100);Integer a3 new Integer(100);System.out.println(a1 a2);System.out.println(a1 a3);System.out.println(a1.equals(a3));Sys…